
Hash
Hash用于存储field和value的映射表,适用于存储对象。
每个hash中可以存储2^32-1个field-value pair;
使用/场景
场景
缓存:更直观地维护缓存信息,如用户信息、饰品信息;
例子:存储用户的属性
1 | 127.0.0.1:6379> hset user:001 username ZhangSan firstName San lastName zhang age 21 # 在user:001中存储键值对 |
例子:存储设备的访问状态
1 | 127.0.0.1:6379> hincrby device:2:stats pings 1 # device:2:stats的pings加一 |
基础命令
hset:hash设置值;
hget:hash获取值;
hmget:hash获取多个值;
hincrby:若value可以为整数,则增加value的值。
其他命令
增 | 删 | 查 |
---|---|---|
HSET | HDEL | HGET |
HSETNX | HMGET | |
HINCRBY | HEXISTS | |
HINCRBYFLOAT | HLEN | |
HSTRLEN | ||
HRANDFIELD |
HSET 设置值 可以多个
hset key field value [field value ...]
设置hash的多个field-value对;
返回添加的field-value对数量。
HSETNX 当field不存在则设置值
hsetnx key field value
当集合中没有指定field时,为集合添加field-value对;若集合中存在指定field,则不进行操作;
若key对应的set不存在,则创建一个集合;
返回值:
- 若成功添加返回1;
- 若field已存在,操作没有执行,返回0。
1 | 127.0.0.1:6379> hsetnx user:1 age 3 |
HGET 获得field的value
hget key field
获取集合中field对应的值;
若集合中没有field或集合不存在则返回nil;
1 | 127.0.0.1:6379> hsetnx user:1 age 3 # 设置user:1的age的值为3 |
HMGET 获取field的value 可以多个
hmget key field [field ...]
获取集合中field对应的value。
返回一个数组,包含每个field对应的value;
若field不存在,则为nil;
若key不存在,视作空hash,将返回一个值为nil的数组;
1 | 127.0.0.1:6379> hset user:3 name zhangsan age 12 psw 1234565 |
HGETALL 获得所有field-value
hgetall key
获取集合中所有的field-value对;
1 | 127.0.0.1:6379> hset user:2 name ZhangSan age 12 psw 123456 |
HDEL 删除field 可以多个
hdel key field [field ...]
删除集合中的field-value 对;
返回成功删除的field的数量;
若key不存在,则返回0;
1 | 127.0.0.1:6379> hgetall user:2 |
HEXISTS 查询field存在
hexists key field
若集合中存在field返回1,否则返回0;
HLEN 获得field数量
hlen key
返回集合field的数量。
HSTRLEN 获得value的长度
hstrlen key field
返回集合中field对应的value的长度,若key或field不存在返回0;
HINCRBY 增加整型的值
hincrby key field increment
增加集合中field整型变量的值;
若key不存在,则自动创建一个集合,若field不存在,则在操作执行前将field的值设为0;
(即若key或field不存在,设集合key的field值为1)
(increment非可选变量,是必选变量)
1 | 127.0.0.1:6379> hincrby user:5 age 1 |
HINCRBYFLOAT 增加浮点数的值
hincrbyfloat key field increment
Hash INCREment FLOAT
功能与hincrby类似,不同的是hincrbyfloat可以增加浮点数。
若increment为负,则为减少指定的值;
若key或field不存在,则在操作执行前,将key集合的field设为0(即操作执行后,值为1)
若field的value的类型不是数字或value的值不可被解析为一个浮点数,将返回错误信息;
若执行成功,返回增加后的值。
1 | 127.0.0.1:6379> hset user:6 age 3 |
HRANDFIELD 随机获取field
hrandfield key [count [WITHVALUES]]
获取集合中随机的field值;
若包含WITHVALUES参数,则返回field-value对;
关于count的使用:
- 若count为正,返回指定数量的field,若count大于集合的基数,则返回集合的基数数量的field;
- 若count为负,返回|count|数量的field,且返回值可能存在重复;不论count与集合的基数大小关系,返回的结果的数量绝对是|count|;
返回值:
- 若没有count参数,则返回一个value;若key不存在返回nil;
- 若有count参数,则返回一个数组,若key不存在返回空数组;若包含WITHVALUES参数,则返回field和它对应的value。
1 | 127.0.0.1:6379> hrandfield user:7 2 |
HVALS 获取所有的values
HVALS key
Hash VALueS
返回所有的values;
1 | 127.0.0.1:6379> hgetall user:7 |
HMSET(弃用) 与hset一致
与hset功能相同,即将被弃用
Sorted Set
带有排序功能的set;
排序方式:按照scores顺序存储字符串,若字符串有相同scores,则按照字典序存储字符串;
应用举例:
- 游戏排名最高分;
- 通过滑动窗口限制同一时间内的API请求数量。
实现
Redis Sorted Set实现原理
- 压缩列表(ziplist):ziplist是为了提高存储效率而设计的一种特殊编码的双向链表,可以存储字符串或整数;存储整数采用二进制而不是字符串;Ziplist能在O(1)的复杂度下完成list两端的push和pop操作;每次操作都需要重新分配ziplist的内存,实际复杂度与ziplist的内存使用量有关;
- 跳跃表(zSkiplist):跳跃表的性能可以保障查找、删除和添加等操作在对数期望时间内完成,跳跃表的复杂度是O(log(n));
例子:游戏排名最高分
1 | 127.0.0.1:6379> zadd leaderboard 100 user:1 # 设置user:1的得分是100 |
基础命令
ZADD:添加新的对象和分数到有序集合中,若对象存在,则更新分数;
ZRANGE:返回排序后的对象列表,可以选择排行榜的范围;
ZRANK:返回对象所在的排名;
ZREVRANK:返回集合在逆序下,对象所在的排名。
性能
zrange:O(log(n))
其他:O(log(n)+m)
其他命令
增 | 删 | 查 | 自增 | 并 | 交 | 差 |
---|---|---|---|---|---|---|
ZADD | ZREM | ZCARD | ZINCRBY | ZUNION | ZINTER | ZDIFF |
ZREMRANGEBYLEX | ZCOUNT | ZUNIONSTORE | ZINTERCARD | ZDIFFSTORE | ||
ZREMRANGEBYRANK | ZLEXCOUNT | ZINTERSTORE | ||||
ZREMRANGEBYSCORE | ZSCORE | |||||
ZPOPMAX | ZMSCORE | |||||
ZPOPMIN | ZRANDMEMBER | |||||
ZMPOP | ZRANGE | |||||
ZRANGEBYLEX | ||||||
ZRANGEBYSCORE | ||||||
ZRANGESTORE | ||||||
ZREVRANGE | ||||||
ZREVRANGEBYLEX | ||||||
ZREVRANGEBYSCORE | ||||||
ZRANK | ||||||
ZREVRANK | ||||||
增
ZADD
介绍/使用
ZADD key [MX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
向有序集合中添加指定的对象和scores,可以指定多个member-score对;
如果集合中已存在要添加的member,则更新member的score为新输入的score;
如果key不存在,则创建相应的有序集合并将对象和score放进集合中;若key存在且类型不为有序集合,则返回错误;
score的值应为双精度浮点数的string格式;
可以用的参数
- XX:仅更新已存在的元素,不添加新的元素;
- NX:仅添加新的元素,不更新已存在的元素;
- LT:若输入的score值小于原本的score值,则更新存在的值;
- GT:若输入的score值大于原本的score值,则更新存在的值;
- CH:返回值改为更新的元素数量;
- INCR:将ZADD的作用变为ZINCRBY,此时只能指定一个score-element对;
注意:GT、LT和NX三者是互斥的。
实现
Redis采用64位双精度浮点数来表示score,依据IEEE 754实现,能够精确的表示-(2^53 )到+(2^53)之间的数字。
返回值
默认返回添加到有序集合的元素数量;
如果指定CH选项,则返回改变的元素的数量;
如果指定incr选项,若执行成功返回对象的score,操作取消则返回nil(被XX或NX选项阻止)。
代码
1 | 127.0.0.1:6379> zadd ss 10 a 20 b # 设置 a=10 b=20 |
LT : less than <
GT : great than >
LE : less equal <=
GE : great equal >=
删
ZREM
ZREM key member [member …]
删除指定的对象;
成功返回移除的对象数量,不包含不存在的对象;若key不存在返回错误。
1 | 127.0.0.1:6379> zadd ss 1 a 2 b 3 c |
ZREMRANGEBYLEX
ZREMRANGEBYLEX key min max
删除字典序排序从min到max的元素;
返回被移除的元素数量。
1 | 127.0.0.1:6379> zadd ss 1 a 2 d 3 e 4 g 5 i 6 w 7 y 8 z |
在命令内部使用 “[字符串”表示范围,如:[assd
ZREMRANGEBYSCORE
ZREMRANGEBYSCORE key min max
删除score值是从min到max的元素。
1 | 127.0.0.1:6379> zrange ss2 0 -1 WITHSCORES |
ZREMRANGEBYRANK
ZREMRANGEBYRANK key start stop
删除排名从start到stop的元素;
1 | 127.0.0.1:6379> zrange ss 0 -1 |
ZPOPMAX、ZPOPMIN
ZPOPMAX key [count]
ZPOPMIN key [count]
移除scores值 MAX最高(MIN最低)的count个元素;
若没有count属性,默认count为1;
返回多个元素,score最大(MAX为最大的,MIN为最小的)的元素在首位,其他依次向下排列;
1 | 127.0.0.1:6379> zrange ss2 0 -1 WITHSCORES |
ZMPOP 依据提供的方向删除指定集合指定数量的元素
ZMPOP numkeys key [key …] <MIN | MAX> [COUNT count]
从给定的集合中从前往后寻找非空集合,删除并返回多个元素。
可以指定多个集合;
在MIN下,将对在非空集合中score最低的元素进行pop;MAX反之;
COUNT指定要pop的数量;
返回值:
- 返回一个二维数组(
[n][2]
),子数组包含删除元素的对象和score; - 若没有元素被pop则返回nil
查
ZCARD
ZCARD key
查询集合的基数。
ZCOUNT、ZLEXCOUNT
ZCOUNT key min max
获取score在min到max之间的元素。O(log(N))。
ZLEXCOUNT key min max
依据字典序获得min到max之间的元素。O(log(N))。
返回指定结果数量;
ZSCORE
ZSCORE key member
返回成员的score;
若成员或key不存在,返回nil;
ZMSCORE
ZMSCORE key member [member ...]
返回多个成员的score;
对于每个成员,若member不存在,则score以nil代替。
1 | 127.0.0.1:6379> zadd ss 1 a 2 b 3 c |
ZRANDMEMBER
ZRANDMEMBER key [count [WITHSCORES]]
若只有key参数,则在集合中随机获取一个元素并返回其成员名;
若有count参数,
- 若count为正数,在集合中随机获取多个元素并返回其成员名,数量取count和基数的最小值;
- 若count为负数,获取的结果会有重复,返回的数量绝对为count,不受基数大小限制。
若加上WITHSCORES,返回参数包含成员名及其scores。
1 | 127.0.0.1:6379> ZRANDMEMBER ss 2 |
ZRANGE
介绍
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
依据条件进行查询,返回结果顺序默认从低到高;若start大于基数或stop,则返回空集合;若stop大于基数,视为最后一个元素。
ZRANGE可以查询来自不同类型范围的元素;
参数
start,stop:值的起点和终点,即值的范围为 start ~ stop;
- 第一个元素用0表示,第二个为1,其他依次类推;
- start/stop值也可以为负,-1表示倒数第一个,-2表示倒数第二个;
- 对于不同的排序依据,可以使用的值不同;
- 默认情况下
- start/stop表示查询地范围,结果包含start/stop索引所在位置的值;
- 对于BYSCORE
- 默认情况下,结果包含start/stop指定的索引位置,可以通过添加前缀”**(**“来表示不包含start/stop指定的索引位置的值;
- 默认情况下,start表示最小score,stop表示最大score;
- 也可以为 “+inf”或“-inf”,分别表示正无穷和负无穷。
- 若使用REV参数,就必须将start和stop的值反过来使用,也就是start > stop,否则将获得一个空的结果;start表示最大score,stop表示最score。
- 对于BYLEX
- start/stop值必须包含“(”或“[”表示不包含或包含start/stop指定的索引位置的值;
- 可以使用“+”或者“-”表示正无穷和负无穷;
- 若使用REV参数,就必须将start和stop的值反过来,也就是 start > stop,否则将返回一个空的结果。
- 默认情况下
BYSCORE:依据score;
BYLEX:依据字典序;在此模式下不支持REV参数,会返回错误;
REV:查询结果默认排序为从低到高,使用REV参数后排序改为从高到低;
LIMIT:在获得结果中取出指定范围的数据进行返回;offset为起点;count为取出的数量,若count为负则取出从offset到最后所有的元素;注意若offset很大,需要遍历从offset到最后一个元素之间的所有元素,时间复杂度为O(N);
WITHSCORES:返回值包含score;
返回值
返回数组,包含元素列表;若有WITHSCORES,则同时包含scores。
代码示例
1 | 127.0.0.1:6379> zadd ss 12 a 23 b 34 c 45 d 56 e 67 f |
ZRANGESTORE
ZRANGESTORE dst src min max [BYSCORE | BYLEX] [REV] [LIMIT offset count]
查询方式与ZRANGE一致;
不同的是,可以将返回结果存储到指定集合中;
返回值为结果集的元素数量;
注意:不能使用WITHSCORES。
1 | 127.0.0.1:6379> zrange ss 45 56 BYSCORE WITHSCORES |
ZRANK
ZRANK key member
将集合按照score大小进行排序,返回排序结果中member的位置。
排序顺序从小到大;
1 | 127.0.0.1:6379> zrange ss 0 -1 |
ZREVRANK
ZREVRANK key member
返回集合按照score排行,反转后的member的位置;
排行按照从高到低;
返回值:若成员存在,返回成员的排行;若成员或key不存在,返回nil;
ZRANGEBYLEX、ZRANGEBYSCORE (弃用)
将会被ZRANGE取代;
ZRANGEBYLEX key min max [LIMIT offset count]
ZRANGEBYSCORE key min max [LIMIT offset count] WITHSCORES
ZREVRANGE(弃用)
ZREVRANGE key start stop [WITHSCORES]
ZREVRANGEBYLEX(弃用)
ZREVRANGEBYLEX key max min [LIMIT offset count]
ZRANGEBYSCORE(弃用)
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
并集
ZUNIONSTORE
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREAGTE <SUM | MIN MAX>]
计算numkeys个集合的并集结果,对于每个相同的member,将相应的score进行处理(相加,MAX,MIN),然后存储计算结果到destination中;
在提供key和其他参数之前,必须提供numkeys;
参数介绍:
使用WEIGHTS参数,指定多个乘数,将为每个集合的score值在处理之前与指定的乘数相乘,乘法因子默认为1;
- 如:
- 设 k1 = {a:1,b:2} k2 = {b:3,c:4}
- 如:ZUNIONSTORE out 2 k1 k2 WEIGHTS 2 3 AGGREGATE SUM
- k1’ = {a:2,b:4} k2’ = {b:9,c:12}
- out = {a:2,b:13,c:12}
使用AGGREGATE选项,可以指定UNION过程score的处理方法,默认为SUM;
- SUM:将所有score相加;
- MAX:取所有score最大值;
- MIN:取所有score最小值。
若destination中有值,则进行覆盖。
1 | 127.0.0.1:6379> zadd s1 1 a 4 b # s1 = {a:1, b:4} |
ZUNION
ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>] [WITHSCORES]
功能类似于ZUNIONSTORE,不同的是,ZUNION将计算结果返回到客户端;
交集
ZINTER
ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>][WITHSCORES]
将交集结果返回到客户端;
时间复杂度:
O(NK)+O(Mlog(M))
N:最小有序集合
K:有序集合的数量
M:结果集元素数量
返回交集结果。
ZINTERCARD
ZINTERCARD numkeys key [key ...] [LIMIT limit]
返回结果集的基数;
若key为空,则被视为空集合,返回0;
默认情况下,ZINTERCARD计算集合中所有的数量,可以通过给出参数LIMIT(默认为0)来限制计算数量,这样可以减少计算加速运行;
ZINTERSTORE
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN |MAX>]
计算交集结果并存放在destination中;
若destination原本存在,则进行覆盖。
1 | 127.0.0.1:6379> zrange s1 0 -1 WITHSCORES # s1 = {a:1, b:4} |
差集
ZDIFFSTORE
ZDIFFSTORE destination numkeys key [key ...]
计算第一个集合与其他集合的差集,将结果存放到destination;
numkeys为指定key的数量;
若destination存在,则进行覆盖。
与INTER和UNION不同,DIFF不对SCORE进行运算,而是仅使用member作为依据对集合进行差集运算。
1 | 127.0.0.1:6379> zrange s1 0 -1 WITHSCORES |
ZDIFF
ZDIFF numkeys key [key ...] [WITHSCORES]
功能类似于ZDIFFSTORE,不同的是,ZDIFF将计算结果返回到客户端;