Redis常用命令

Redis支持五种数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(sorted set)。

每一种数据类型所对应的操作命令不同,当然也存在一些通用的,而且Redis的所有命令有很多,本文中记录的都是日常使用频率相对多一些的。

通用命令:

1
2
3
4
5
6
7
8
keys:遍历所有key【O(n)】
dbsize:计算key的总数【O(1)】
exists:检查key是否存在;返回(integer) 1或(integer) 0【O(1)】
del:删除指定的key-value【O(1)】
expire:给key设置过期时间,在seconds秒后过期【O(1)】
ttl:查看可以剩余的过期时间 ;返回(integer) -1:key存在但没有过期时间,(integer) -2 :key不存在【O(1)】
persist:去掉key的过期时间【O(1)】
type:返回key的类型【O(1)】

O(n)代表时间复杂度比较高,不建议在线上使用,O(1)代表时间复杂度较低,可以任意使用

字符串(String)

  • 最常见的数据类型
  • 可以为任何类型的字符串,比如二进制,json对象
  • 最大容量512M

【增】

1
2
3
4
5
6
setnx key value:key不存在时,才设置【O(1)】
set key value:不管key是否存在,都设置【O(1)】
incr key:key自增1并返回结果【O(1)】
decr key:key自减1并返回结果【O(1)】
incrby key k:key自增k,并返回结果【O(1)】
decrby key k:key自减k,并返回结果【O(1)】

【删】

1
del key【0(N)】

【改】

1
set key value xx:key存在,才设置【O(1)】

【查】

1
2
mget key1 key2 key3…:批量获取key,原子操作【O(n)】
mset key1 value1 key2 value2 key3 value3:批量设置key-value【O(n)】

【知识扩展】

1
2
3
4
5
6
getset key newvalue:set key newvalue并返回旧的value【O(1)】
append key value:将value追加到旧的value【O(1)】
strlen key:返回字符串的长度(注意中文)【O(1)】
incrbyfloat key 3.5:增加key对应的值3.5【O(1)】(没有decrbyfloat的命令,如果要减去,传负数即可)
getrange key start end:获取字符串指定下标所有的值【O(1)】
strange key index value:设置指定下标对应所有的值【O(1)】

哈希(Hash)

  • 与php Array相似
  • 可以保存多个key-value,每个k-v都是字符串类型
  • 最多2^32-1个字段

所有hash的命令,都是以“h”开头

【增】

1
2
3
hsetnx key field value:设置hash key对应field的value,key不存在时才设置【O(1)】
hincrby key field count:hash key对应的field增加count,并返回(如果要减去,传负数)【O(1)】
hincrbyfloat key field count(浮点):hash key对应的field增加count(浮点),并返回(如果要减去,传负数)【O(1)】

【删】

1
hdel key field:删除hash key对应field的value【O(1)】

【改】

1
2
hset key field value:设置hash key对应field的value【O(1)】
hmset key field1 value1 field2 value2 field3 value3..fieldN valueN:批量设置hash key的一批field value【O(N)】

【查】

1
2
3
4
5
6
7
hget key field:获取hash key对应的field的value【O(1)】
hmget key field1 field2…fieldN:批量获取hash key的一批field对应的值【O(N)】
hexists key field:判断hash key是否有field【O(1)】
hlen key:获取hash key field的数量【O(1)】
hgetall:获取hash key中所有的field和value【O(N)】(使用时需要注意redis时单线程,如果field比较多,性能会有影响)
hvals key:返回hash key对应所有field的value【O(N)】
hkeys key:返回hash key对应所有field【O(N)】

列表(List)

【增】

1
2
3
rpush key value1 value2 value3…valueN:从列表右端插入值(1-N个)【O(1~N)】
lpush key value1 value2…valueN:从列表左端插入值(1~N个)【O(1~N)】
linsert key before|after value newValue:在list指定的值前|后插入newValue【O(N)】

【删】

1
2
3
4
5
6
7
lpop key:从列表左侧弹出一个item【O(1)】
rpop key:从列表右侧弹出一个item【O(1)】
lrem key count value:根据count值,从列表中删除所有value相等的项【O(n)】
(1)count>0,从左到右,删除最多count个value相等的项目
(2)count<0,从右到左,删除最多Math.abs(count)个value相等的项
(3)count=0,删除所有value相等的项
ltrim key start end:按照索引范围修剪列表【O(1)】

【改】

1
lset key index newValue:设置列表指定索引为newValue【O(n)】

【查】

1
2
3
lrange key start end(包含end):获取列表指定索引范围所有item【O(N)】(start:0、end:-1 等于取所有的)
lindex key index:获取列表指定索引的item【O(N)】
llen key:获取列表长度【O(1)】

【知识扩展】

1
2
blpop key timeout:lpop阻塞版本,timeout是阻塞超时时间,timeout=0时为永不阻塞【O(1)】
brpop key timeout:rpop阻塞版本,timeout是阻塞超时时间,timeout=0时为永不阻塞【O(1)】

【应用场景】

1
2
3
4
5
lpush + lpop = stack 实现栈的功能
lpush + rpop = queue 实现队列功能
lpush + ltrim = capped collection 实现有固定数量的列表
lpush + brpop = message queue 实现消息队列功能
llen + lpush = 可以实现秒杀场景

集合(Set)

  • 集合中每个元素都是不同的
  • 元素最多为2^32 - 1
  • 元素没有顺序

特点:无序、无重复、支持集合间操作(交集、并集、差集)

所有集合的命令,都是以“s”开头

【增】

1
sadd key element:向集合key添加element(如果element已经存在,添加失败)【O(1)】

【删】

1
2
srem key element:将集合key中的element移除掉【O(1)】
spop key:从集合中随机弹出一个元素

【查】

1
2
3
4
5
6
7
8
scard key:计算集合大小
sismember key element:返回1存在,0不存在。判断element是否在集合中
srandmember key count:从集合中随机挑count个元素
smembers key:获取集合所有元素(无序,小心使用,如果集合数据过大, 会有线程阻塞风险)
sdiff key1 key2:取两个集合的差集
sinter key1 key2:取两个集合的交集
sunion key1 key2:取两个集合的并集
sdiff|sinter|sunion + store destkey : 将差集、交集、并集的结果保存在destkey中

【应用场景】

1
2
3
sadd = tagging 实现标签的功能
spop/srandmember = random item 常应用于随机数的一些场景
sadd + sinter = social graph 常用语做一些社交相关的应用

有序集合(sorted set)

集合 VS 有序集合 VS 列表

集合:

无重复元素
无序
element

有序集合:

无重复元素
有序
element + score

列表:

可以有重复元素
有序
element

所有有序集合的命令,都是以“z”开头

【增】

1
2
zadd key score element(可以是多对):添加score和element,score可以重复,element不可以重复【O(logN)】
zincrby key incrScore element:增加或减少元素的分数【O(1)】

【删】

1
2
3
zrem key element(可以是多个):删除元素【O(1)】
zremrangebyrank key start end:删除指定排名内的升序元素【O(log(n)+m)】
zremrangebyscore key minScore maxScore:删除指定分数内的升序元素【O(log(n)+m)】

【查】

1
2
3
4
5
zscore key element:返回元素的分数【O(1)】
zcard key:返回元素的个数【O(1)】
zrange key start end [withscores]:返回指定索引范围内的升序元素[分值]【O(log(n)+m)】
zrangebyscore key minScore maxScore [withscores]:返回指定分数范围内的升序元素[分值]【O(log(n)+m)】
zcount key minScore maxScore:返回有序集合内在指定分数范围内的个数【O(log(n)+m)】

注:Redis的命令有很多,本文中记录的只是平时常用的一些命令。