Redis 是一款高性能的 key-value 存储系统,提供了多种数据结构来满足不同的应用场景。其中,zset 是一种有序集合,能够快速地进行范围查找和排名操作,被广泛用于排行榜、计分板等场景。
zset 的基本概念
zset 是一种键值对集合,其中每个键都对应一个唯一的值(称为 score),并按照 score 的大小进行排序。zset 的实现方式是使用一颗跳跃表(Skip List)和一个哈希表(Hash Table)来维护数据结构。
zset 中的元素是唯一的,相同 score 的元素按照插入顺序排列。每个元素都包含两个属性:一个是 member(成员),另一个是 score(分数)。其中,member 是一个字符串,score 是一个浮点数。
zset 的常用操作
添加元素
使用 ZADD 命令向 zset 中添加元素,可以同时添加多个元素,支持批量操作。例如:
ZADD myzset 1 "one" ZADD myzset 2 "two" 3 "three"
删除元素
使用 ZREM 命令从 zset 中删除元素,同样支持批量操作。例如:
ZREM myzset "one" ZREM myzset "two" "three"
获取元素个数
使用 ZCARD 命令获取 zset 中元素的个数。例如:
ZADD myzset 1 "one" 2 "two" 3 "three" ZCARD myzset
获取元素的 score
使用 ZSCORE 命令获取 zset 中指定元素的 score。例如:
ZADD myzset 1 "one" ZSCORE myzset "one"
获取排名
使用 ZRANK 或 ZREVRANK 命令获取 zset 中指定元素的排名(从小到大或从大到小)。例如:
ZADD myzset 1 "one" 2 "two" 3 "three" ZRANK myzset "two" ZREVRANK myzset "two"
获取指定范围的元素
使用 ZRANGE 或 ZREVRANGE 命令获取 zset 中指定范围内的元素(从小到大或从大到小)。例如:
ZADD myzset 1 "one" 2 "two" 3 "three" 4 "four" 5 "five" ZRANGE myzset 0 2 ZREVRANGE myzset 0 2
获取指定分数范围的元素
使用 ZRANGEBYSCORE 或 ZREVRANGEBYSCORE 命令获取 zset 中指定分数范围内的元素(从小到大或从大到小)。例如:
ZADD myzset 1 "one" 2 "two" 3 "three" 4 "four" 5 "five" ZRANGEBYSCORE myzset 2 4 ZREVRANGEBYSCORE myzset 2 4
获取指定排名范围的元素
使用 ZRANGE 或 ZREVRANGE 命令获取 zset 中指定排名范围内的元素(从小到大或从大到小)。例如:
ZADD myzset 1 "one" 2 "two" 3 "three" 4 "four" 5 "five" ZRANGE myzset 1 3 ZREVRANGE myzset 1 3
获取指定成员的排名和分数
使用 ZRANK 和 ZSCORE 命令一起获取 zset 中指定成员的排名和分数。例如:
ZADD myzset 1 "one" 2 "two" 3 "three" 4 "four" 5 "five" ZRANK myzset "two" ZSCORE myzset "two"
zset 的应用场景
排行榜
zset 最常见的应用场景就是排行榜。例如,游戏中的积分排名、音乐网站中的歌曲排行榜等。通过将用户的分数作为 score,将用户的 ID 作为 member,就可以很方便地实现排行榜功能。
计分板
类似于排行榜,计分板也是一种常见的应用场景,例如网站上的评分、投票等。通过将分数作为 score,将用户 ID 或者投票对象的 ID 作为 member,就可以很方便地实现计分板功能。
示例代码
下面是一个使用 zset 实现排行榜的示例代码:
-- -------------------- ---- ------- ----- ----- - ----------------- ----- ------ - --------------------- -- ------ ------------------- ---- --------- ------------------- ---- --------- ------------------- ---- --------- -- ------ -------------------- -------- ----- ------ -- - ------------------ ------- ------- --- -- ------ --------------------- -------- ----- ------ -- - ------------------ -------- ------- --- -- ------- --------------------- -- -- ----- ------ -- - ---------------- - -------- ------- ---展开代码
通过以上代码,我们可以向排行榜中添加用户分数、获取用户排名和分数、以及获取前三名用户。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cadc8ee46428fe9e36fba1