目录
zset是有序集合类型,其中的元素是会按照权重升序排序。集合中的每个元素member都对应一个score来表示其权重用于排序。跳表查找一个元素的时间复杂度为O(logN)
添加元素/更新权重
时间复杂度为O(logN)
sql
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member
...]
NX:如果不存在才新增member,如果存在则不更新
XX:如果存在才更新member,不存在则不新增
GT:如果更新后的score值更大才进行
LT:如果更新后的score值更小才进行
CH:ZADD一般返回新增member的个数,而CH表示让其返回新增+更新的member的个数
INCR:使用示例:zadd key incr x member 给member的权重加x
删除元素
sql
zrem key member,member2... ...删除指定元素
zremrangebyrank key start end 删除下标范围内的元素,闭区间
zremrangebyscore key min max 删除在权重范围内的元素,闭区间
zpopmax key [count] 删除权重最大的元素 时间复杂度为O(logN)
zpopmin key [count]
bzpopmax key,key2... timout 阻塞式的删除若干个集合中任意一个不为空的集合(相当于优先级队列)的最大元素,timeout是最长阻塞时间
bzpopmin key,key2... timout 阻塞式的删除若干个集合中任意一个不为空的集合(相当于优先级队列)的最小元素,timeout是最长阻塞时间
权重相同删除字典序最大/最小的
查询元素权重
时间复杂度为O(1)
sql
zscore key member
查看指定下标范围内的元素
sql
zrange key start end [withscores]
zrevrange key start end [withscores] //相当于把集合元素降序之后再执行zrange
zrangebyscore key min max [withscores] //相当于zcount
withscores:同时显示每个member的权重
获取元素个数
时间复杂度为O(1)
sql
zcard key
获取权重在某范围内的元素个数
时间复杂度是O(logN)
sql
zcount key [(]min [(]max 返回集合中在[min,max]内的元素个数
(:表示去掉这个边界
min和max的特殊取值:inf是无穷大 -inf是负无穷大
获取某元素在集合中的下标
时间复杂度是O(logN)
sql
zrank key member
zrevrank key member 相当于让集合降序,然后调用zrank
增加某元素的权重
sql
zincrby key x memeber 增加member的权重
求两个集合的交集,并集
sql
//交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
destination:指定存放交集的集合
numkeys:指定要用几个集合相交
weights:指定用于求交集的每个集合的权重(假设是p),设置这个之后每个集合中的每个元素的权重 = 本来的权重*P
aggregate:指定交集里的元素的权重是怎么取的,sum表示将各个集合中该元素的权重之和作为交集中该元素的权重,不指定的话默认就是sum
//并集
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
应用场景
游戏排行榜,微博热度排行(热度是综合多方面得出的结果,每个方面有不同的权重,可以用zinterstore来解决这个问题)