redis中的zset类型及其常用命令
有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的
特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,这使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数。member和score称为是一个"pair"。分数不同,按照分数来排。分数相同,按照元素自身字符串的字典序来排列。默认按升序排序。
zset常用命令
zadd/zrange/zcard/zcount
zadd:添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型。+inf/-inf 作为正负极限也是合法的。
不添加XX和NX时:如果当前member不存在,此时就会达到“添加新member”的效果。如果当前member已经存在,此时就会更新分数。默认返回新增元素个数。
XX:只更新当前存在的。如果不存在就相当于操作失败。
NX:只添加新的,不会更新已经存在的。
LT:less than 在更新分数时,如果发现给定的分数比之前的分数小,此时便更新成功。否则不更新。
GT:greater than 在更新分数时,如果发现给定的分数比之前的分数大,此时便更新成功。否则不更新。
CH:change 影响zadd的返回值。 不加CH的zadd只会返回新增的元素个数。加了CH,还会返回包含修改的元素个数。
incr:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和
分数。
zcard:获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数。
zcount:返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。给谁加( 就排除谁。
zrange/zrevrange/zrangebyscore
zrange:查看有序集合中的元素详情。带上 WITHSCORES 可以把分数也返回。
zrevrange:按照分数降序进行遍历并打印。
zrangebyscore:返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
zpopmax/bzpopmax/zpopmin/bzpopmin
zpopmax:删除并返回分数最⾼的 count 个元素。多个元素分数相同,删除的时候,会按照member字符串的字典序决定先后。
bzpopmax:ZPOPMAX 的阻塞版本。在有序集合为空的时候触发阻塞,直到有其他客户端插入元素。timeout是超时时间,单位s
zpopmin:删除并返回分数最低的 count 个元素。
bzpopmin:ZPOPMIN 的阻塞版本。
zrank/zrevrank/zscore
zrank:返回指定元素的排名,升序。
zrevrank:返回指定元素的排名,降序。
zscore:返回指定元素的分数。
zrem/zremrangebyrank/zremrangebyscore/zincrby
zrem:删除指定的元素。
zremrangebyrank:按照下标,升序删除指定范围的元素,左闭右闭。
zremrangebyscore:按照分数删除指定范围的元素,左闭右闭。
zincrby:为指定的元素的关联分数添加指定的分数值。
zinterstore/zunionstore
zinterstore:求出给定有序集合中元素的交集并保存进⽬标有序集合中
destination:要把结果存储到哪个key对应的set中。
numkeys:描述了后续有几个key参与交集运算。
weight:设定各个集合的权重。权重乘以各个集合元素的分数,作为元素新的score。
aggregate:当member相同,score不同时。如果给定的是sum模式,就将相同的member的score相加,合并成一个member。min模式,就取最小的。max模式,取最大的。默认sum模式。
zunionstore:求出给定有序集合中元素的并集并保存进⽬标有序集合中。
zset内部的编码方式
有序集合类型的内部编码有两种:
• ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个),同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
• skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时
ziplist 的操作效率会下降。
zset的应用场景
排行榜
有序集合⽐较典型的使⽤场景就是排⾏榜系统。例如常⻅的⽹站上的热榜信息,榜单的维度可能
是多⽅⾯的:按照时间、按照阅读量、按照点赞量。
以上,关于redis,希望对你有所帮助。