七、Redis之sorted set
sorted set也是Redis中常用的类型。可以用来解决热搜,排名前十等问题。
ZADD
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
zadd将多个分数和元素对添加到sorted set中。还有些选项影响了zadd的行为:
- XX: 仅更新已存在的元素。不要添加新元素。
- NX:只添加新元素。不要更新现有元素。
- LT:仅在新得分低于当前得分时更新现有元素。此标志不会阻止添加新元素。
- GT:只有当新分数大于当前分数时,才更新现有元素。此标志不会阻止添加新元素。
- CH:CH是changed的缩写,返回值表示修改的元素数量。
- INCR:当指定此选项时,ZADD的行为类似于ZINCRBY。在此模式下只能指定一个分数元素对。
ZCARD
ZCARD key
zcard返回排序集中分数-元素对的数量。
ZCOUNT
ZCOUNT key min max
zcount返回分数在min和max范围(包含两端)内分数-元素对的数量。
ZINCRBY
ZINCRBY key increment member
ZINCRBY将成员的分数递增increment。
ZLEXCOUNT
ZLEXCOUNT key min max
当sorted set中所有的分数都相同时,比较的是元素的字典顺序。ZLEXCOUNT返回元素在min和max范围内分数-元素对的数量
-
表示无穷小,+
表示无穷大,[
表示包含,(
表示不包含。
ZMSCORE
ZMSCORE key member [member ...]
zmscore返回排序集中多个成员对应的分数。
ZRANDMEMBER
ZRANDMEMBER key [count [WITHSCORES]]
zrandmember随机返回count个元素。withscores选项同时返回分数。
ZRANGE
ZRANGE key start stop [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
返回存储在
元素的顺序是从最低到最高的分数。具有相同分数的元素按字典顺序排列。可选的REV参数颠倒了顺序,因此元素从最高分数到最低分数排序,分数关系通过反向词典排序来解决。
zrange默认是按照分数从小到大排序。WITHSCORES选项同时查询出分数。-1表示最后一个元素,-2表示倒数第二个元素。
还可以用[
表示包含,(
表示不包含。
rev选项就是从大到小排序。
bylex选项就是当所有分数都相同时,按照元素的字段顺序比较。-
表示无穷小,+
表示无穷大。
最后的limit offset count就是类似sql中的分页参数。
ZRANGEBYLEX
ZRANGEBYLEX key min max [LIMIT offset count]
zrangebylex等同于zrange key min max bylex limit offset count。
ZRANGEBYSCORE
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
zrangebyscore等同于zrange key min max byscore limit offset count。
ZRANGESTORE
ZRANGESTORE dst src min max [BYSCORE|BYLEX] [REV] [LIMIT offset count]
zrangestore的效果类似与将zrange src min max [BYSCORE|BYLEX] [REV] [LIMIT offset count]的结果保存到dst的sorted set中。
如果zset2原来就有数据,执行后zset2的数据会被覆盖。
ZRANK
ZRANK key member [WITHSCORE]
zrank返回member在sorted set中的排名(按照分数从小到大或分数都相同时,按照元素的字典顺序从小到大)。排名第一的返回0.
ZREM
ZREM key member [member ...]
zrem从sorted set中移除多个member。
ZREMRANGEBYLEX,ZREMRANGEBYRANK,ZREMRANGEBYSCORE
ZREMRANGEBYLEX key min max
ZREMRANGEBYRANK key start stop
ZREMRANGEBYSCORE key min max
以上三个命令都是从sorted set中移除指定范围内的元素。ZREMRANGEBYLEX是当所有分数都相同时,移除在指定范围内的所有元素。ZREMRANGEBYRANK是移除指定排名范围内的所有元素。ZREMRANGEBYSCORE是移除指定分数内的所有元素。
ZREVRANGE
ZREVRANGE key start stop [WITHSCORES]
返回存储在key处的排序集中的指定元素范围。这些元素被认为是从最高分数到最低分数排序的。对于得分相等的元素,使用降序词典顺序。
ZREVRANGEBYLEX
ZREVRANGEBYLEX key max min [LIMIT offset count]
当所有元素的分数都相等时,按照元素的字典顺序逆序返回在max到min之间的所有元素。注意:max和min之间的位置。
ZREVRANK
ZREVRANK key member [WITHSCORE]
逆序返回元素在sorted set中的排名。
ZSCAN
ZSCAN key cursor [MATCH pattern] [COUNT count]
zscan的效果类似于hscan。
ZSCORE
ZSCORE key member
zscore返回member在sorted set中的分数。
集合运算
在来看下集合运算:
ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
ZINTERCARD numkeys key [key ...] [LIMIT limit]
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
ZDIFF numkeys key [key ...] [WITHSCORES]
ZDIFFSTORE destination numkeys key [key ...]
ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
sorted set也是一种set。它的集合运算与set的集合运算基本相似。差别在于sorted set多个了分数。
使用WEIGHTS选项,可以为每个输入排序集指定一个乘法因子。这意味着,在传递给聚合函数之前,每个输入排序集中每个元素的得分都要乘以这个因子。当未给出权重时,乘法因子默认为1。聚合函数是SUM、MIN、MAX。聚合函数处理元素间的分数。SUM是分数相加。min是分数间的最小值。max是分数间的最大值。
当指定aggregate为sum时,求并集后b的分数为5.
当指定weights后,计算分数时要乘以相应的weight。zset4的weight指定为2,zset5的weight指定为1.所有zset4的b计算后的分数为2乘2等于4.大于zset5计算后的分数为3。
ZMPOP,BZMPOP,ZPOPMAX,BZPOPMAX,ZPOPMIN,BZPOPMIN
ZMPOP numkeys key [key ...] MIN|MAX [COUNT count]
BZMPOP timeout numkeys key [key ...] MIN|MAX [COUNT count]
ZPOPMAX key [count]
BZPOPMAX key [key ...] timeout
ZPOPMIN key [count]
BZPOPMIN key [key ...] timeout
ZMPOP从提供的键名列表中的第一个非空排序集中弹出一个或多个元素,这些元素是成员分数对。可以弹出多个元素,但是只从一个key中取
。当使用MIN选项时,弹出的元素是第一个非空排序集中得分最低的元素。MAX选项会弹出得分最高的元素。可选的COUNT可用于指定要弹出的元素数量,默认设置为1。BZMPOP是ZMPOP的阻塞版本,如果都没有数据时会阻塞,直到指定的超时时间。ZPOPMAX相当于zmpop max。ZPOPMIN相当于zmpop min。
在第一个控制台运行bzmpop 2000 2 zset6 zset7 min
后,在启动另一个控制台,运行zadd zset7 1 a 3 c
。
再次运行: