redis 通用命令
目录
通过 redis 客户端和 redis 服务器交互。
所以需要使用 redis 的命令,但是 redis 的命令非常多。
通用命令是什么
在 redis 中,对于存入的不同数据的操作的命令是不同的,但是还是有一些命令是通用的,而这些对所有数据类型都通用的命令就是 ”通用命令“。
在介绍通用命令之前,其实我们可以去官方网站去学习一些有关 redis 的一些内容。
我们就可以在主页面上有一个 search 可以用来搜索命令。
这里我们可以启动客户端,然后我们可以使用 ping 命令来验证一下连通性。
127.0.0.1:6379> ping
PONG
如果联通成功的话,那么就会返回 pong,实际上 redis 的命令一般都是大写和 mysql 是一样的,虽然小写也可以支持。
SET & GET
redis 是按照键值对的方式来存储的。
-
get:根据 key 来获取对应的 value
-
set:把 key 和 value 设置进去
这里的 key 和 value 都是字符串。
set key value
如果设置成功返回 OK
上面就是 set 的简单语法,set 后面跟一个 key 在跟一个value。
上面虽然说 key 和 value都是字符串,但是在set 的时候并不需要加双引号或者单引号。
127.0.0.1:6379> SET key1 value1
OK
下面可以通过 key 来获得 value
get key
如果有 key 就会返回对应的 value,否则就会返回 nil,上面的 nil 就是表示空或者不存在的意思。
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
(nil)
KEYS
-
keys 可以查询当前 redis 中的 key
KEYS pattern
-
pattern 就是匹配模式
-
?:表示匹配任意多一字符
-
*:匹配任意多个字符
-
[abc..]:匹配方括号里面的字符
-
[^abc]:匹配除非方括号里面的字符
-
[a-b]:匹配a~b中的字符
下面可以试一下
插入一批数据
127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hallo 1
OK
127.0.0.1:6379> set hbllo 1
OK
127.0.0.1:6379> set heeeeello 1
OK
127.0.0.1:6379> keys *
1) "hallo"
2) "hbllo"
3) "heeeeello"
4) "hello"
5) "key1"
-
匹配任意一个字符
127.0.0.1:6379> keys h?llo 1) "hallo" 2) "hbllo" 3) "hello"
-
匹配任意多个字符
127.0.0.1:6379> keys h*llo 1) "hallo" 2) "hbllo" 3) "heeeeello" 4) "hello"
-
匹配括号里的内容
127.0.0.1:6379> keys h[ab]llo 1) "hallo" 2) "hbllo"
-
匹配非括号里面内容
127.0.0.1:6379> keys h[^e]llo 1) "hallo" 2) "hbllo"
-
匹配括号里范围
127.0.0.1:6379> keys h[ab]llo 1) "hallo" 2) "hbllo"
EXISTS
-
该命令用来查询key 是否存在
exixts key [key...]
-
该命令可以在后面跟多个 key
-
返回查询到 key 的个数
-
时间复杂度位O(N) N为key 的个数
-
查询
127.0.0.1:6379> exists hello hallo (integer) 2
DEL
-
删除 key 以及对应的 value
del key [key...]
-
del 后面也可以跟多个 key
-
返回值表示删除 key 的个数
-
删除一个数据
127.0.0.1:6379> del hello (integer) 1
-
删除多个数据
127.0.0.1:6379> del hallo hbllo (integer) 2
-
删除不存在的数据
127.0.0.1:6379> del abc (integer) 0
EXPIRE
-
设置过期时间,单位秒
expire key second
-
expire 必须要是已经有了的 key
-
返回值为 1 表示设置成功,0 表示失败
-
但是 second 对于计算机来说时间太长,其实还有一个 pexpire 的单位为毫秒
-
设置过期时间
127.0.0.1:6379> expire hello 10 (integer) 1
-
为空 key 设置过期时间
127.0.0.1:6379> expire abc 10 (integer) 0
为已有的 key 设置过期时间返回 1,为没有的 key 设置过期时间返回 0,表示设置失败
而且设置成功后,等时间到期后,该key 会自动删除
TTL
-
查看过期时间,和 expire 对对应
ttl key
-
返回的单位是 秒
-
如果想要查看毫秒级的就是 pttl 也就是和pexpire 对应
-
返回值为剩余的过期时间,如果是 -1 表示没有设置过期时间,如果是 -2 表示没有该 key
-
设置过期时间
127.0.0.1:6379> expire hello 30 (integer) 1
-
查看过期时间
127.0.0.1:6379> ttl hello (integer) 25
-
查看没有设置的过期时间 key 的过期时间
127.0.0.1:6379> ttl key1 (integer) -1
-
查看没有 key 的过期时间
127.0.0.1:6379> ttl abc (integer) -2
redis 的过期策略
redis 的过期策略主要是两个方面:
-
定期删除
-
惰性删除
-
首先说这个惰性删除,惰性删除就是每当用户访问该数据的时候, redis 会进行一番检查,如果是过期的,那么 redis 就会删除掉该 key,然后返回 nil
-
定期删除就是,每隔一段时间 redis 就会抽取一部分数据进行检查过期时间,如果过期的话就会删除
-
为什么是一部分数据呢?因为 redis 是单线程的,如果数据量太大的话,那么就会是 redis 阻塞,导致其他的服务无法被处理,所以 redis 每次都抽取一部分数据进行检查
-
但是两个策略结合效果却也是一般
定时器策略
redis 过期策略还可以通过定时器来解决,但是这个定时器 redis 并没有实现,但是可以介绍一下如果使用定时器那么可以如何实现
基于优先级队列定时器
-
可以将所有的过期时间的 key 都放到一个优先级队列里面
-
优先级就是过期时间,过期时间越近,那么优先级越高
-
所以第一个元素一定是最先过期的,所以我们只需要检查第一个元素即可
-
而第一个元素也不一定要一直检查,可以隔一段时间检查一下
-
然后就可以分一个线程,让该线程来检查过期时间,如果发现过期时间还没到,则可以先让该线程挂起
基于时间轮的定时器
-
首先可以有一个循环队列,而循环队列里面的每一格代表一个一段时间的过期时间
-
每个格子里面可以保存一个链表,该链表里面的所有事件的过期时间都在该格子表示的时间范围
-
其中一个指针从循环队列特定位置开始,每隔一段时间(格子表示的时间)就向后走一个,然后检查里面的过期时间,过期就删除
-
遇到新的事件就查看该事件的过期事件,push 到对应的格子里
虽然 redis 并没有使用这两种方法,但是这两种方法也是比较高效的处理过期事件的方法
TYPE
-
返回 key 对应的 value 的类型
type key
-
返回 key 对应的 value 的类型
-
在 redis 里面 key 都是 string 类型
-
如果没有key返回 none
-
插入不同数据
127.0.0.1:6379> lpush key2 111 222 333 (integer) 3 127.0.0.1:6379> sadd key3 aaa bbb ccc (integer) 3 127.0.0.1:6379> hset key4 field1 value1 (integer) 1
-
查看不同数据类型
127.0.0.1:6379> type key1 string 127.0.0.1:6379> type key2 list 127.0.0.1:6379> type key3 set 127.0.0.1:6379> type key4 hash