目录
全局命令
1)keys
2)exists
3) del(delete)
4)expire
5)type
SET命令
GET命令
MSET 和 MGET命令
其他SET命令
计数命令
redis-cli
,进入redis
最核心的命令:我们这里只是先介绍 set 和 get 最简单的操作,后面有详细介绍
set: 存储 key 和 value
get: 根据 key 来取 value
key 和 value 的类型都是字符串
get 查询不存在的值会返回一个 nil
用来查询当前服务器上的匹配的 key
通过一下特殊符号(通配符)来描述 key 的模样,匹配上述模样的 key 就会被查出来。
keys pattern
,pattern 是包含特殊符号的字符串。
pattern 所支持的统配样式:
“?” 可以匹配任意一个字符
“ * ” 匹配 0 个或者多个任意字符
keys *
可以查询所有的 key
[ae] 只能匹配到 a/e 两个字符之一
[^e] 表示排除 e ,除了 e 之外可以匹配其他字符
[a-e] 匹配 a - e 范围内的字符,包含 a 和 e
注意:keys 的时间复杂度是 O(N)。在生产环境上,一般都会禁止使用 keys 命令。
判定 key 是否存在。
exists key [key ...]
,返回值:返回 key 存在的个数
时间复杂度:O(N),此处的 N 是检查的 key 的个数
删除指定的 key,可以一次删除一个或者多个
del key [key ...]
, 返回值:返回删除 key 的个数
时间复杂度:O(N),此处的 N 是成功删除的 key 的个数
给指定的 key 设置过期时间,key 存活时间超过这个指定的值,就会被自动删除。
expire key seconds
, expire 设置的时间单位是 秒。pexpire key 毫秒
, pexpire 设置的时间单位是毫秒
返回 0 表示设置失败,1 表示设置成功。
时间复杂度:O(1)。
ttl(time to live) 查询 key 的过期时间,单位秒。pttl 和 pexpire 搭配使用。
时间复杂度:O(1)。
返回值:剩余过期时间;-1 表示么有设置过期时间;-2 表示 key 不存在。
redis 的过期策略是怎么实现的?
如果直接遍历所有的 key,显然是不可能的,所有redis 采取了两种方式相结合:
1.定期删除
每隔一定时间,抽取一部分 key 检查是否到达删除时间,每次抽取一部分可以有效保证效率,不会浪费太多时间。 如果扫描过期 key 消耗的时间太多了,就可能会导致正常处理请求命令就阻塞了。
2.惰性删除
假设这个 key 已经到了过期时间,但是暂时还没有将其删除,key 依然存在,接下来再访问该 key 的时候,就会触发 redis 的删除操作,同时返回一个 nil。
redis 为了应对上述策略,还提供了一系列的内存淘汰策略。
type key
,返回 key 对应的 value 的数据类型。
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds |
EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
NX:如果 key 不存在,才设置,如果 key 存在,则不设置(返回nil)
XX:如果 key 存在,才设置(相当于更新 key 的 value),如果 key 不存在,则不设置(返回nil)
EX:设置过期时间,单位秒
PS:设置过期时间,单位毫秒
EXAT:设置 key 过期的指定 Unix 时间(以秒为单位)
PXAT:设置 key 过期的指定 Unix 时间(以毫秒为单位)
KEEPTTL:保存与 key 相关联的生存时间
set key value ex 10
,就相当于set key value
和 expire key 10
。
因为 key2 已经过期了,所以我们在设置 key2 时加上 NX,成功设置 key2。由于 key1 已经存在,所以加上 NX 会返回一个 nil。
GET key
,需要注意的是,GET 只能获取到字符串类型的 value,如果 value 是其他类型,使用 GET 获取就会出错!
MSET key value [key value]
,MSET 可以设置多组键值对,MGET key key
,MGET 可以获取多个 key 的 value。
MSET 和 MGET 的时间复杂度都是 O(N),N为 key 的个数。
SETNX
:不存在才能设置,存在则设置失败。
SETEX
:设置 key 的过期时间(以秒为单位)
PSETEX
:设置 key 的过期时间(以毫秒为单位)
incr 针对 value + 1
INCR key
,此时 key 对应的 value 必须是整数。
返回值:原 value +1 的结果
无论是字符串还是小数,还是太大的数(超出规定范围),都不能完成该操作
如果 incr 操作的 key 不存在,那么就会将这个 key 默认为0来操作
incrby 针对 value + n
INCRBY key increment
,incrby 的使用规则和 incr 一样,都只能对整数使用,我们就不再进行演示了。
incrby 不仅仅可以加一个正数,还能够加负数
decr 针对 value + 1
DECR key
返回值:返回 value-1 后的结果
对一个不存在的 key 进行该操作,同样默认该 key 的 value 为0
decrby 针对 value - n
DECRBY key decrement
incrbyfloat
incrbyfloat key increment
,把 key 对应的 value 进行 + - 运算,运算的操作数可以是浮点数
注意:Redis 中不存在 decrbyfloat
,只能通过 incrbyfloat
+ 负数来实现减法