Redis——zset类型相关指令

目录

添加元素/更新权重

删除元素

查询元素权重

查看指定下标范围内的元素

获取元素个数

获取权重在某范围内的元素个数

获取某元素在集合中的下标

增加某元素的权重

求两个集合的交集,并集

应用场景


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来解决这个问题)