1. 字符串

1.1 为字符串键设置值

1
set key value [NX|XX]

NX:key不存在时才设置。若存在,则放弃设置,并返回nil XX:key存在时才设置。若存在,设置成功后返回ok,否则不存在,返回nil。

1.2 获取字符串键的值

1
get key 

1.3 GETSET: 获取旧值并设置新值

1
getset key value 

如果key之前不存在,那么返回值是nil

1.4 删除键

1
del key

返回值代表操作了多少项

1.5 MSET:一次为多个字符串键设置值

1
mset key1 value1 [key2 value2]

mset的意义,在于可以用其实现patch的功能,节约网络通信的重复开销

1.6 MGET:一次获取多个字符串键的值

1
MGET key [key ...]

若某个key不存在,则返回nil

1.7 MSETNX: 只在键全部不存在的情况下,一次设置多个键的值

1
MSETNX key value [key value]

若其中某个key已存在,则返回0

1.8 STRLEN: 获取字符串键的值的字节数

1
strlen key

若key存在,返回一个整数,若key不存在,返回0

1.9 GETRANGE:获取字符串值指定索引范围上的内容

1
getrange key start end
  • 类似于切片,等价于返回value[start:end], 闭区间。
  • 支持负数下标操作,代表从尾到头

举例说明:

1
2
3
set lrh 123
getrange lrh 0 1  # 返回lr
getrange lrh -3 -2 # 返回lr

1.10 setrange:对字符串值的指定索引范围进行设置

1
setrange key offset value

从offset开始,替换为指定内容

1.11 append: 追加新内容到值的末尾

1
append key value
  • 返回字符串当前长度
  • 若键不存在,则设置该键的值为空串"",然后追加

1.12 incrby, decrby, incr, decr 对整数值进行加减法操作

1
2
3
4
incrby key value
decrby key value 
incr key # 给key的value加1
decr key # 给key的value减1

遇到不存在的键,会先将键的值初始化为0后,再进行操作

1.13 incrbyfloat: 对数字值进行浮点数加减法操作

1
incrbyfloat key value  
  • 没有提供减法api,所以只能使用加法实现减法
  • 遇到不存在的键,会将键的值初始化为0后,再进行操作
  • 最多会保留计算结果小数点后的17位

2. 散列

皇家翻译:field => 字段

2.1 HSET:为散列键添加键值对

1
hset key field value [field value ...]

返回值是新增field的个数

2.2 HSETNX:filed不存在时设置值

1
hsetnx key field value 

成功返回1,失败返回0

2.3 HGET:从散列中获取field的值

1
hget key field value

若不存在,返回nil

2.4 HINCRBY: 对字段存储的整数执行值执行加法或减法操作

1
hincrby key field value 
  • 成功后,返回现在的值是多少
  • 如果field不存在,插入这个field并初始化为0后再执行加减
  • 通过加法实现减法
  • 不能超过long long int

2.5 HINCRBYFLOAT:对字段存储的浮点数执行加减法操作

1
hincrbyfloat key field value

2.6 HSTRLEN: 获取字段值的字节长度

1
hstrlen key field 

2.7 HEXISTS: 检查字段是否存在

1
hexists key field 
  • 存在返回1,不存在返回0
  • 如果散列不存在,那么返回值恒定为0

2.8 HDEL:删除字段

1
hdel key field [field ...]

返回删除个数

2.9 HLEN:获取散列字段个数

1
hlen key 

如果散列不存在,那么也会返回0

2.10 HMSET:一次为多个字段设置值

1
hmset key field value [field value ...]

成功返回ok

2.11 HMGET: 一次获取多个字段的值

1
hmget key field [field ...]

如果字段或散列不存在,返回nil

2.12 HKEYS、HVALS、HGETALL:获取所有的字段、值、字段和值

1
2
3
hkeys key
hvals key
hgetall key 

hgetall结果中,偶数下标是键,奇数下标是值

3. 列表

3.1 LPUSH:将元素推入列表左端

1
lpush listname item [item, item ...]

1)如果列表不存在,则新建
2)返回值是当前列表的元素数量

3.2 RPUSH:将元素推入列表右端

1
rpush listname item [item, item ...]

类似于 LPUSH

3.3 LPUSHX、RPUSHX:对已经存在的列表进行推入操作

1
2
lpushx listname item 
rpushx listname item 
  • 如果不成功,则返回0

3.4 LPOP: 弹出列表最左端元素并返回, RPOP:弹出列表最右端元素并返回

1
2
lpop listname [count]
rpop listname [count]
  • 如果列表不存在或为空,那么将返回一个 nil
  • count 指示删除个数

3.5 RPOPLPUSH:将右端弹出的元素插入左端

1
rpoplpush source destination 
  • 将元素从 source 的右端弹出,插入到 destination 的左端
  • 返回值是操作的元素
  • sourcedestination 可以是同一个列表
  • 如果 source 列表不存在,那么指令执行会失败,并返回一个nil
  • 如果 source 非空,destination 为空,那么将会新建一个 destination 列表

3.6 LLEN: 获取列表长度

1
llen listname 

如果列表不存在,将返回0

3.7 LINDEX:获取列表中指定下标中的元素

1
llen key index
  • 每个元素都有正数索引和负数索引,负数从-1开始
  • 超出索引范围将返回 nil
  • 时间复杂度是 O(N)

3.8 LRANGE: 获取指定索引范围上的元素

1
lrange key start stop
  • 获取区间[start, stop]上的元素
  • 支持正数索引,区间范围是 [0, n-1]
  • 支持负数索引,区间范围是 [-1, n)
  • 错误的区间,如 lrange key -1 -2 将会返回 (empty array)
  • [start, stop][0, n-1]做交集,并将交集内的元素返回

3.9 获取列表内的全部元素

1
lrange key 0 -1 

3.10 LSET:为指定索引设置新元素

1
lset key index element 
  • 每次只能设置一个元素
  • index必须合法,否则将返回 (error) ERR index out of range
  • 时间复杂度是 O(N)

3.11 LINSERT: 将元素插入列表

1
linsert key before|after pivot element 
  • 从左到右遍历,在列表中第一个值等于pivot的元素的前面或后面,插入element
  • 如果列表中没有pivot,那么将返回 -1
  • 时间复杂度 O(N)

3.12 LTRIM: 修剪列表

1
ltrim key start stop 
  • [start, stop][0, n-1]做交集,只保留交集中的下标指示的元素,删除其他元素(这句话对于负数下标不够严谨,可以将负数下标转换为正数下标即可)
  • 支持正数和负数索引

3.13 LREM: 从列表中移除指定元素

1
lrem key count elemnt 

根据 count 值不同,从列表中移除值等于 element 的元素

  • count=0,删除所有
  • count>0,从左往右删除 count
  • count<0, 从右往左删除 abs(count)

返回移除的数量

3.14 BLPOP:阻塞式左端弹出操作, BRPOP同理

1
2
blpop key [key ...] timeout 
blopop list1, list2, list3 1
  • 从左到右的从用户所给的所有列表中弹出元素,遇到第一个非空列表将其最左端元素弹出并立即返回
  • 返回值包含两项,一项是列表名,指示从哪个列表弹出,另一项是元素。
  • 超时会返回 nil
  • 对所有客户端,服务器保证先阻塞的先服务

3.15 BRPOPLPUSH

1
brpoplpush source destination timeout 

同理

4. 集合

4.1 SADD:将元素添加到集合

1
SADD key member [member ...]

返回成功添加的个数

4.2 SREM:从集合中移除元素

1
srem key member [member ...]

返回成功移除的个数

4.3 SMOVE:将元素从一个集合移动到另一个集合

1
smove source destination member 
  • 每次只能移动一个元素
  • 移动失败返回0,成功返回1

4.4 SMEMBERS: 获取集合中所有元素

1
smembers key 
  • 结果是无序的

4.5 SCARD:获取集合包含的元素数量

1
scard key 

4.6 SISMEMBER: 检查所给元素是否在集合内

1
sismember key member
  • 若是,返回值是1,否则,返回值是0

4.7 SRANDMEMBER: 随机获取集合中的元素

1
srandmember key [count]
  • 如果不指定 count, 那么将获取1个
  • 如果 count 是正数,那么将返回 count 个不重复的元素;如果 count 大于集合包含元素的数量,将返回全部集合元素
  • 如果 count 是负数,那么将随机返回 abs(count) 个可能重复的元素

4.8 SPOP: 随机地从集合中移除指定数量的元素

1
spop key [count]
  • 如果没有提供 count,那么将移除1个
  • 返回值是删除的元素

4.9 SINTER、SINTERSTORE:对集合执行交集计算

1
2
sinter key [key key ...]
sinterstore destination key [key key]

4.10 SUNION、SUNIONSTORE:对集合执行并集计算

1
2
sunion key [key, key ...]
sunion destination key [key key ...]

4.11 SDIFF、SDIFFSTORE:对集合执行差集计算

1
2
sdiff key [key key...]
sdiffstore key [key key...]

5. 有序集合

5.1 ZADD:添加或更新成员

1
zadd key [nx|xx] [gl|lt] [ch] [incr] score member [score member ...]
  • 如果成员已存在,那么将更新 score
  • nx指明不存在member时,才进行操作,xx反之。
  • LT: 更新新的分值比当前分值小的成员,不存在则新增。
  • GT: 更新新的分值比当前分值大的成员,不存在则新增。
  • CH: 返回变更成员的数量。变更的成员是指 新增成员 和 score值更新的成员,命令指明的和之前score值相同的成员不计在内。 注意: 在通常情况下,ZADD返回值只计算新添加成员的数量。
  • INCR: ZADD 使用该参数与 ZINCRBY 功能一样。一次只能操作一个score-element对
  • GT, LT 和 NX 三者互斥不能同时使用
  • 时间复杂度 O(Mlog(N))

5.2 ZCARD:获取集合大小

1
zcard key 
  • 不存在返回0

5.3 ZINCRBY: 对成员的分值执行自增或自减操作

1
zincryby key increment member 
  • 如果成员不存在,那么将新增,并将score设置为increment
  • 减法通过加负数实现

5.4 ZRANGE:获取指定区间内的元素

1
zrange key min max [withscores]
  • withscores 会返回相应的 score
  • 如果集合不存在,那么将返回空列表

5.5 ZREVRANGE

1
zrevrange key min max [withscores]
  • withscores 会返回相应的 score
  • 如果集合不存在,那么将返回空列表

5.6 ZRANK:获取成员的排名(按score从小到大排序)

1
zrank key member 
  • 如果member不存在,将返回nil
  • 存在将返回一个整数,从0开始排名

5.7 ZREVRANK: 获取成员的排名(按score从大到小排序)

1
zrevrank key member 
  • 如果member不存在,那么将返回nil
  • 存在则返回一个整数,从0开始排名

5.8 ZREM:删除一个或多个集合成员

1
zrem key member [member ...]
  • 忽略不存在的成员,不存在返回0

5.9 ZRANGEBYSCORE: 获取指定分数区间内的元素

1
zrangebyscore key min max [withscores] [limit offset count]

5.10 ZREVRANGEBYSCORE:获取指定分数区间内的元素,逆序返回

1
zrevrangebyscore key min max [withscores] [limit offset count]
  • offset和count是对应数字

5.11 ZSCORE:获取给定成员的分值

1
zscore key member 
  • 成员不存在返回nil

5.12 ZCOUNT:统计指定分值范围内的成员数量

1
zcount key min max 

5.13 ZREMRANGEBYRANK: 删除指定rank的项

5.14 ZREMRANGEBYSCORE:删除指定分数的项

5.15 ZUNIONSTORE: 取并集

  • 聚合函数
    • max
    • min
    • sum
  • 权重:给出一个权重列表,将查询结果分别对应乘上权重
  • 可以使用集合作为输入,会将所有score看成是1

5.16 ZINTERSTORE:取交集

5.17 ZRANGEBYLEX、ZREVRANGEBYLEX:返回指定字典序范围内的成员

5.18 ZLEXCOUNT:统计位于字典序指定范围内的成员的数量

5.19 ZREMRANGEBYLEX:移除指定字典序范围内的成员

5.20 ZPOPMAX、ZPOPMIN:弹出分值最高和最低的成员

1
2
zpopmax key [count]
zpopmin key [count]

5.21 BZPOPMAX、BZPOPMIN:阻塞式

1
2
bzpopmax key [key ...] timeout
bzpopmin key [key ...] timeout 

5.22 ZSCAN

6. HyperLogLog

  • 解决唯一计数器的内存占用问题
  • HyperLogLog可以使用12KB的内存空间,对接近2^64个元素进行计数,而算法的标准误差仅仅为0.81%
  • 使用HyperLogLog实现的唯一计数器内存开销固定,开销非常小
  • 用途:
    • 对集合元素进行计数
    • 获取集合当前的近似基数
    • 支持两个HyperLogLog合并

6.1 PFADD:对一个或多个HyperLogLog进行计数

1
pfadd key element [element ...]
  • 根据给定的元素进行计数,其中element的类型可以是集合、有序集合
  • 返回值是1,表示进行了计数
  • 返回值是0,表示没有变化,无需再次计数

6.2 pfcount: 返回集合的近似基数,多个则取并集

1
pfcount key [key ...]
  • 返回HyperLogLog为集合计算出的近似基数
  • key不存在时返回0

6.3 pfmerge:合并多个HyperLogLog到另一个HyperLogLog中

1
pfmerge destkey sourcekey [sourcekey ...]
  • destkey若存在会被覆盖,否则新建

8. bitmap

8.1 SETBIT: 设置二进制位

1
setbit key offset value 
  • 返回旧值
  • 如果key不存在,将新建,未指定的位全部置为0.
  • 如果offset超过了bitmap的大小,将扩容,扩容的单位是字节。
  • 偏移量只能是非负整数
  • 时间复杂度是O(1)

8.2 GETBIT:获取二进制位

1
getbit key offset 
  • 如果offset超过了bitmap的范围,那么将返回0

8.3 BITCOUNT:统计bitmap中1的个数

1
bitcount key [start end]
  • 注意start和end指定的是字节的偏移量,闭区间,0-index,支持负数索引

8.4 BITPOS:查找第一个指定的二进制位

1
bitpos key bit [start] [end]
  • bit指示查找第一个1还是第一个0
  • start 和 end 都是字节偏移量
  • 支持负数索引
  • 时间复杂度是O(N), N是字节数
  • start和end超出边界返回-1
  • 如果用户在一个所有位都是1的bitmap中查找第一个0,那么将返回bitmap的最大偏移量+1

8.5 BITOP:执行二进制运算位

1
bitop operation destkey key [key ...]
  • operation参数的值可以是AND, OR, XOR, NOT中的任意一个
  • NOT只允许对一个key进行操作
  • 将结果存储到destkey中
  • 若两个bitmap长度不等,那么会将短的那个bitmap不存在的二进制位值视为0
  • 时间复杂度O(N), N为字节数

8.6 BITFIELD:在位图中存储整数值 [todo]

1
bitfield key [get type offset] [set type offset value] [incrby type offset increment] [overflow wrap | sat | fail ]
  • 其中set表示设置,get表示获取
  • type参数的值:以i或u为前缀,指示有符号整数和无符号整数,后跟设置值的位长度
  • 最大支持i64和u63

8.7 使用字符串命令操作bitmap

bitmap是在字符串基础上实现的。

9. 地理坐标

redis使用有序集合存储GEO数据,一个位置集合实际上就是一个有序集合。

9.1 GEOADD:存储坐标

1
geoadd key [nx|xx] [ch] longitude latitude member [longitude latitude member ...]
  • 将经纬度所表示的地点命名,并添加到key中
  • 若key不存在,将新建
  • 若member存在,将更新

9.2 GEOPOS: 根据位置名获取对应坐标

1
geopos key member [member ...]

9.3 GEODIST: 计算两个位置之间的直线距离

1
geodist key member1 member2 [m|km|ft|mi]
  • 单位是米
  • 可以指定单位:
    • m:米
    • km:千米
    • ft:英尺
    • mi:英里
  • 如果某个member不存在,那么将返回nil

9.4 GEORADIUS:查找指定坐标半径范围内的其他位置

1
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count [any]] [asc|desc] [store key] [storedist key]
  • 半径可以指定不同单位长度
  • withdist 返回距离
  • withcoord 返回匹配点的坐标
  • 可以指定排序顺序

9.5 GEORADIUSBYMEMBER: 查找指定位置半径范围内的其他位置

1
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count [any]] [asc|desc] [store key] [storedist key]

9.6 GEOHASH:获取指定位置的geohash值

1
geohash key member [member ...]
  • Geohash是一种编码格式,可以将经纬度转换为单个Geohash值,也可以将Geohash值转换为经纬度

10. stream

  • 流是一个包含任意非负数个流元素的有序队列,队列中的每个元素都包含一个ID和任意多个键值对,元素会根据ID的大小在流中有序的进行排列。
    • 使用其他数据结构实现队列的缺点:
    • 列表做队列的缺点:需要遍历整个队列
    • 有序集合没有阻塞弹出原语

10.1 XADD: 加新元素到流的末尾

1
xadd key [nomkstream] [maxlen|minid [=|~] threshold [limit count]] *|ID field value [field value]  
  • 如果key不存在,将新建
  • field value 的对数大于等于1
  • ID由毫秒时间(64bit)和顺序编号(64bit)两部分组成,使用分隔符-相连
  • 执行成功,返回对应的ID
  • 若用户给出只包含毫秒的不完整流ID,那么顺序编号将被设置为0
  • 新添加的元素的ID,不能和流中的ID重复,且新加ID必须大于流中所有ID。先比较毫秒部分,再比较顺序编号
  • 使用*号,将自动分配一个合法的ID。
  • 防止时钟错误:使用最大ID的毫秒时间
  • maxnlen 限制流长度

10.2 XTRIM:对流进行修剪

1
xtrim key maxlen|minid [=|~] threshold [limit count]    
  • 淘汰旧元素

10.3 XDEL:删除指定ID

1
xdel key id [id ...]
  • 时间复杂度O(m*log(n))

10.4 XLEN: 获取流元素个数

1
xlen key

10.5 xrange, xrevrange: 访问流中元素

1
xrange key start end [COUNT count]
  • 获取所有元素:xrange key - + 其中,-表示最小的ID,+表示最大的ID
  • 对流进行迭代:
    • 先使用- +获取前n个
    • 然后对最后一个的ID的顺序编号+1,继续获取n个
    • 重复即可
  • 时间复杂度O(log(n) + m)

10.6 XREAD: 以阻塞或非阻塞的方式获取流元素

1
xread [COUNT count] [BLOCK milliseconds] streams key [key ...] ID [ID ...]
  • ID和key是对应的,指明从该流中取出大于该ID的流元素
  • 0-0
  • 当ID的值为$时,表明只获取命令执行后新加入流中的元素

10.7 XGROUP CREATE:创建消费组 [todo]

1
xgroup create key groupname ID
  • 给流key创建一个叫groupname的消费组,ID指示了消费组的起始ID。
  • 同一个流的消息在不同的消费者组之间是共享的而不是独占的

10.8 XREADGROUP:读取消费者组 [todo]

1
xreadgroup Group group consumer [COUNT count] [BLOCK milliseconds] [NOACK] streams key [key ...] ID [ID ...]
  • 例如xreadgroup group g1 c1 streams stream1 0,表明了消费组是g1,消费组是c1,消费的流是stream1
  • 消费者不需要显示创建,只需要指明名字即可。
  • 同一个消费者组中的每条信息只能有一个消费者。

10.9 XACK:消息确认

1
xack key group ID [ID ...]

当redis收到对应消息的ACK时,会从消费者组的待处理队列、消费者的待处理消息队列 中移除对应消息,表明被确认。

10.10 XPENDING、XINFO GROUPS查看消费者组相关信息 [todo]

1
2
xpending key group 
xinfo groups group

10.11 XGROUP: 管理消费组 [todo]

1
2
3
4
XGROUP SETID key groupname ID|$    (修改最后传递消息的ID)
XGROUP DESTROY key groupname 
XGROUP CREATECONSUMBER key groupname consumername 
XGROUP DELCONSUMER key groupname 

10.12 XCLAIM: 将消息的归属权从一个消费者转移到另一个消费者 [todo]

1
XCLAIM key group consumer min-idle-time ID [ID ...] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [force] [justid]