泉州网站建设公司,用户体验设计五要素,跨境电商到什么网站做,百度 门户网站有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的特点#xff0c;但与集合不同的是#xff0c;有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数#xff08;score#xff09;与之关 联#xff0c;着使得有序集合中的元素是可以维… 有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的特点但与集合不同的是有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数score与之关 联着使得有序集合中的元素是可以维护有序性的但这个有序不是⽤下标作为排序依据⽽是⽤这个分数。 有序集合中的元素是不能重复的但分数允许重复。类⽐于⼀次考试之后每个⼈⼀定有⼀ 个唯⼀的分数但分数允许相同。 列表、集合、有序集合三者的异同点 数据结构 是否允许重复元素 是否有序有序依据 应⽤场景 列表 是 是 索引下标 时间轴、消息队列等 集合 否 否 标签、社交等 有序集合 否 是 分数 排⾏榜系统、社交等 特点 1. 元素唯一性Zset 中的每个元素都是唯一的不能重复。即使两个元素的值相同但分数score不同它们也会被视为不同的元素。 2. 有序性Zset 中的元素会根据其分数score自动排序。分数可以是任意的浮点数默认情况下Zset 按照分数从小到大排序但也可以通过命令反转排序方向如果两个元素的分数相同则按照元素值的字典序排序。 3. 高效操作Zset 支持高效的插入、删除和查找操作时间复杂度为 O(logN)。内部使用跳表skiplist或压缩列表ziplist实现对于小集合默认 128 个元素以内使用压缩列表可以节省内存对于大集合跳表提供了高效的范围查询和排序功能。 内部编码 1. 压缩列表ziplist当有序集合满足元素个数小于 128 并且每个元素的值的大小小于 64 字节时Redis 使用 压缩列表ziplist 作为内部编码。压缩列表通过紧凑的存储方式减少内存占用适合存储小数据量的有序集合。 2. 跳表skiplist当有序集合不满足压缩列表的条件时例如元素个数超过 128 或某个元素值大于 64 字节Redis 会切换到 跳表skiplist 作为内部编码。跳表是一种基于多级索引的有序链表结构支持快速的范围查询和元素查找时间复杂度为 O(logN)。跳表能够动态调整索引层级适应不同规模的数据适合存储大量数据的有序集合。 命令 ZADD 添加或者更新指定的元素以及关联的分数到 zset 中分数应该符合 double 类型inf/-inf 作为正负极限也是合法的。 语法 ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...] ZADD 的相关选项 XX仅仅⽤于更新已经存在的元素不会添加新元素。 NX仅⽤于添加新元素不会更新已经存在的元素。 CH默认情况下ZADD 返回的是本次添加的元素个数但指定这个选项之后就会还包含本次更新的元素的个数。 INCR此时命令类似 ZINCRBY 的效果将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。 时间复杂度O(log(N)) 返回值本次添加成功的元素个数。 ⽰例 ZCARD 获取⼀个 zset 的基数cardinality即 zset 中的元素个数。 语法 ZCARD key 时间复杂度O(1) 返回值zset 内的元素个数。 ⽰例 ZCOUNT 返回分数在 min 和 max 之间的元素个数默认情况下min 和 max 都是包含的可以通过 ( 排除。 语法 ZCOUNT key min max 时间复杂度O(log(N)) 返回值满⾜条件的元素列表个数。 ⽰例 ZRANGE 返回指定区间⾥的元素分数按照升序。带上 WITHSCORES 可以把分数也返回。 语法 ZRANGE key start stop [WITHSCORES] 时间复杂度O(log(N)M) 返回值区间内的元素列表。 ⽰例 ZREVRANGE 返回指定区间⾥的元素分数按照降序。带上 WITHSCORES 可以把分数也返回。 语法 ZREVRANGE key start stop [WITHSCORES] 时间复杂度O(log(N)M) 返回值区间内的元素列表。 ⽰例 ZRANGEBYSCORE 返回分数在 min 和 max 之间的元素默认情况下min 和 max 都是包含的可以通过 ( 排除。 语法 ZRANGEBYSCORE key min max [WITHSCORES]时间复杂度O(log(N)M) 返回值区间内的元素列表。 ⽰例 ZPOPMAX 删除并返回分数最⾼的 count 个元素。 语法 ZPOPMAX key [count] 时间复杂度O(log(N) * M) 返回值分数和元素列表。 ⽰例 BZPOPMAX ZPOPMAX 的阻塞版本。 语法 BZPOPMAX key [key ...] timeout 时间复杂度O(log(N)) 返回值元素列表。 ZPOPMIN 删除并返回分数最低的 count 个元素。 语法 ZPOPMIN key [count] 时间复杂度O(log(N) * M) 返回值分数和元素列表。 ⽰例 BZPOPMIN ZPOPMIN 的阻塞版本。 语法 BZPOPMIN key [key ...] timeout 时间复杂度O(log(N)) 返回值元素列表。 ZRANK 返回指定元素的排名升序。 语法 ZRANK key member 时间复杂度O(log(N)) 返回值排名。 ⽰例 ZREVRANK 返回指定元素的排名降序。 语法 ZREVRANK key member 时间复杂度O(log(N)) 返回值排名。 ⽰例 ZSCORE 返回指定元素的分数。 语法 ZSCORE key member 时间复杂度O(1) 返回值分数。 ⽰例 ZREM 删除指定的元素。 语法 ZREM key member [member ...] 时间复杂度O(M*log(N)) 返回值本次操作删除的元素个数。 ⽰例 ZREMRANGEBYRANK 按照排序升序删除指定范围的元素左闭右闭。 语法 ZREMRANGEBYRANK key start stop 时间复杂度O(log(N)M) 返回值本次操作删除的元素个数。 ⽰例 ZREMRANGEBYSCORE 按照分数删除指定范围的元素左闭右闭。 语法 ZREMRANGEBYSCORE key min max 时间复杂度O(log(N)M) 返回值本次操作删除的元素个数。 ⽰例 ZINCRBY 为指定的元素的关联分数添加指定的分数值。 语法 ZINCRBY key increment member 时间复杂度O(log(N)) 返回值增加后元素的分数。 ⽰例 ZINTERSTORE 求出给定有序集合中元素的交集并保存进⽬标有序集合中在合并过程中以元素为单位进⾏合并元素对应的分数按照不同的聚合⽅式和权重得到新的分数。 语法 ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE SUM | MIN | MAX] 时间复杂度O(N*K)O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了⼏个有序集合; M 是最终结果的有序集合的元素个数. 返回值⽬标集合中的元素个数 ⽰例 ZUNIONSTORE 求出给定有序集合中元素的并集并保存进⽬标有序集合中在合并过程中以元素为单位进⾏合并元素对应的分数按照不同的聚合⽅式和权重得到新的分数。 语法 ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE SUM | MIN | MAX] 时间复杂度O(N)O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数. 返回值⽬标集合中的元素个数 ⽰例 使⽤场景 有序集合⽐较典型的使⽤场景就是排⾏榜系统。例如常⻅的⽹站上的热榜信息榜单的维度可能是多⽅⾯的按照时间、按照阅读量、按照点赞量。本例中我们使⽤点赞数这个维度维护每天的热 榜 1添加⽤⼾赞数 例如⽤⼾ james 发布了⼀篇⽂章并获得 3 个赞可以使⽤有序集合的 zadd 和 zincrby 功能 zadd user:ranking:2025-02-14 3 james 之后如果再获得赞可以使⽤ zincrby zincrby user:ranking:2022-03-15 1 james 2取消⽤⼾赞数 由于各种原因例如⽤⼾注销、⽤⼾作弊等需要将⽤⼾删除此时需要将⽤⼾从榜单中删除掉可以使⽤ zrem。例如删除成员 tom zrem user:ranking:2025-02-14 tom 3展⽰获取赞数最多的 10 个⽤⼾ 此功能使⽤ zrevrange 命令实现 zrevrangebyrank user:ranking:2025-02-14 0 9 4展⽰⽤⼾信息以及⽤⼾分数 可以将⽤⼾名作为键后缀将⽤⼾信息保存在哈希类型中⾄于⽤⼾的分数和排名可以使⽤ zscore 和 zrank 来实现。 hgetall user:info:tom
zscore user:ranking:2025-02-14 mike
zrank user:ranking:2025-02-14 mike