1. 字符串#
1.1 为字符串键设置值#
NX:key不存在时才设置。若存在,则放弃设置,并返回nil
XX:key存在时才设置。若存在,设置成功后返回ok,否则不存在,返回nil。
1.2 获取字符串键的值#
1.3 GETSET: 获取旧值并设置新值#
如果key之前不存在,那么返回值是nil
1.4 删除键#
返回值代表操作了多少项
1.5 MSET:一次为多个字符串键设置值#
1
|
mset key1 value1 [key2 value2]
|
mset的意义,在于可以用其实现patch的功能,节约网络通信的重复开销
1.6 MGET:一次获取多个字符串键的值#
若某个key不存在,则返回nil
1.7 MSETNX: 只在键全部不存在的情况下,一次设置多个键的值#
1
|
MSETNX key value [key value]
|
若其中某个key已存在,则返回0
1.8 STRLEN: 获取字符串键的值的字节数#
若key存在,返回一个整数,若key不存在,返回0
1.9 GETRANGE:获取字符串值指定索引范围上的内容#
- 类似于切片,等价于返回
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.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: 对数字值进行浮点数加减法操作#
- 没有提供减法api,所以只能使用加法实现减法
- 遇到不存在的键,会将键的值初始化为0后,再进行操作
- 最多会保留计算结果小数点后的17位
2. 散列#
皇家翻译:field => 字段
2.1 HSET:为散列键添加键值对#
1
|
hset key field value [field value ...]
|
返回值是新增field的个数
2.2 HSETNX:filed不存在时设置值#
成功返回1,失败返回0
2.3 HGET:从散列中获取field的值#
若不存在,返回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: 获取字段值的字节长度#
2.7 HEXISTS: 检查字段是否存在#
- 存在返回1,不存在返回0
- 如果散列不存在,那么返回值恒定为0
2.8 HDEL:删除字段#
1
|
hdel key field [field ...]
|
返回删除个数
2.9 HLEN:获取散列字段个数#
如果散列不存在,那么也会返回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
|
3.4 LPOP: 弹出列表最左端元素并返回, RPOP:弹出列表最右端元素并返回#
1
2
|
lpop listname [count]
rpop listname [count]
|
- 如果列表不存在或为空,那么将返回一个
nil
count
指示删除个数
3.5 RPOPLPUSH:将右端弹出的元素插入左端#
1
|
rpoplpush source destination
|
- 将元素从
source
的右端弹出,插入到 destination
的左端
- 返回值是操作的元素
source
和 destination
可以是同一个列表
- 如果
source
列表不存在,那么指令执行会失败,并返回一个nil
- 如果
source
非空,destination
为空,那么将会新建一个 destination
列表
3.6 LLEN: 获取列表长度#
如果列表不存在,将返回0
3.7 LINDEX:获取列表中指定下标中的元素#
- 每个元素都有正数索引和负数索引,负数从-1开始
- 超出索引范围将返回
nil
- 时间复杂度是
O(N)
3.8 LRANGE: 获取指定索引范围上的元素#
- 获取区间
[start, stop]
上的元素
- 支持正数索引,区间范围是
[0, n-1]
- 支持负数索引,区间范围是
[-1, n)
- 错误的区间,如
lrange key -1 -2
将会返回 (empty array)
[start, stop]
和[0, n-1]
做交集,并将交集内的元素返回
3.9 获取列表内的全部元素#
3.10 LSET:为指定索引设置新元素#
- 每次只能设置一个元素
- 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: 修剪列表#
[start, stop]
和[0, n-1]
做交集,只保留交集中的下标指示的元素,删除其他元素(这句话对于负数下标不够严谨,可以将负数下标转换为正数下标即可)
- 支持正数和负数索引
3.13 LREM: 从列表中移除指定元素#
根据 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
|
4.4 SMEMBERS: 获取集合中所有元素#
4.5 SCARD:获取集合包含的元素数量#
4.6 SISMEMBER: 检查所给元素是否在集合内#
4.7 SRANDMEMBER: 随机获取集合中的元素#
1
|
srandmember key [count]
|
- 如果不指定
count
, 那么将获取1个
- 如果
count
是正数,那么将返回 count
个不重复的元素;如果 count
大于集合包含元素的数量,将返回全部集合元素
- 如果
count
是负数,那么将随机返回 abs(count)
个可能重复的元素
4.8 SPOP: 随机地从集合中移除指定数量的元素#
- 如果没有提供
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:获取集合大小#
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从小到大排序)#
- 如果member不存在,将返回nil
- 存在将返回一个整数,从0开始排名
5.7 ZREVRANK: 获取成员的排名(按score从大到小排序)#
- 如果member不存在,那么将返回nil
- 存在则返回一个整数,从0开始排名
5.8 ZREM:删除一个或多个集合成员#
1
|
zrem key member [member ...]
|
5.9 ZRANGEBYSCORE: 获取指定分数区间内的元素#
1
|
zrangebyscore key min max [withscores] [limit offset count]
|
5.10 ZREVRANGEBYSCORE:获取指定分数区间内的元素,逆序返回#
1
|
zrevrangebyscore key min max [withscores] [limit offset count]
|
5.11 ZSCORE:获取给定成员的分值#
5.12 ZCOUNT:统计指定分值范围内的成员数量#
5.13 ZREMRANGEBYRANK: 删除指定rank的项#
5.14 ZREMRANGEBYSCORE:删除指定分数的项#
5.15 ZUNIONSTORE: 取并集#
- 聚合函数
- 权重:给出一个权重列表,将查询结果分别对应乘上权重
- 可以使用集合作为输入,会将所有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: 返回集合的近似基数,多个则取并集#
- 返回HyperLogLog为集合计算出的近似基数
- key不存在时返回0
6.3 pfmerge:合并多个HyperLogLog到另一个HyperLogLog中#
1
|
pfmerge destkey sourcekey [sourcekey ...]
|
8. bitmap#
8.1 SETBIT: 设置二进制位#
1
|
setbit key offset value
|
- 返回旧值
- 如果key不存在,将新建,未指定的位全部置为0.
- 如果offset超过了bitmap的大小,将扩容,扩容的单位是字节。
- 偏移量只能是非负整数
- 时间复杂度是O(1)
8.2 GETBIT:获取二进制位#
- 如果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]
|
- 单位是米
- 可以指定单位:
- 如果某个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#
10.4 XLEN: 获取流元素个数#
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]
|