鼠扑 发表于 3 天前

Redis中的zset用法详解

Redis中的zset用法详解

一、引言

Redis是一个开源的高性能键值对数据库,它支持多种类型的数据布局,此中之一就是有序聚集(zset)。有序聚集类似于聚集(set),但它为每个元素关联了一个分数(score),使得元素可以按照分数进行排序。这种数据布局在实现排行榜、延时队列等场景中非常有效。
二、zset的根本概念和操作

1、zset的添加和删除

1.1、添加元素

向zset中添加元素可以使用ZADD命令。这个命令允许你将一个或多个元素及其分数添加到有序集会合。
ZADD myzset 1 "one" 2 "two" 3 "three"
上述命令将元素"one"、"two"和"three"及其对应的分数添加到名为myzset的有序集会合。
1.2、删除元素

从zset中删除元素可以使用ZREM命令。
ZREM myzset "two"
上述命令将元素"two"从myzset有序集会合删除。
2、zset的查询

2.1、获取元素分数

可以使用ZSCORE命令获取有序集会合元素的分数。
ZSCORE myzset "one"
上述命令将返回元素"one"的分数。
2.2、获取元素排名

可以使用ZRANK和ZREVRANK命令获取元素的排名,此中ZRANK返回升序排名,而ZREVRANK返回降序排名。
ZRANK myzset "two"
ZREVRANK myzset "two"
上述命令分别返回"two"的升序和降序排名。
3、zset的范围查询

3.1、按排名查询

可以使用ZRANGE和ZREVRANGE命令按排名查询元素。
ZRANGE myzset 0 -1 WITHSCORES
ZREVRANGE myzset 0 -1 WITHSCORES
上述命令分别返回myzset中全部元素及其分数,按照升序和降序分列。
3.2、按分数查询

可以使用ZRANGEBYSCORE命令按分数查询元素。
ZRANGEBYSCORE myzset 1 3
上述命令返回myzset中分数在1到3之间的全部元素。
三、zset的应用场景

1、排行榜

假设我们正在开辟一个在线游戏,必要实现一个玩家得分排行榜。以下是如何使用Redis的zset来实现这个功能的具体步骤和代码示例。
1.1、添加玩家得分

当玩家完成游戏并获得分数时,我们将他们的得分和用户名添加到zset中。
ZADD game_scores 1000 user1 2000 user2 1500 user3
这里,game_scores是zset的名称,1000、2000和1500是玩家的得分,user1、user2和user3是对应的用户名。
1.2、获取排行榜

要获取排名前三的玩家,我们可以使用ZREVRANGE命令。
ZREVRANGE game_scores 0 2 WITHSCORES
这个命令将返回得分最高的三个玩家及其得分。
2、延时队列

假设我们必要实现一个使命队列,此中使命必要在特定时间后实行。以下是如何使用zset来实现延时队列的具体步骤和代码示例。
2.1、添加使命

当添加一个必要在未来实行的使命时,我们将使命的实行时间和使命ID作为元素和分数添加到zset中。
ZADD delayed_tasks <未来时间戳> task1 <另一个未来时间戳> task2
这里,<未来时间戳>是使命应该实行的时间(以时间戳表现),task1和task2是使命的唯一标识符。
2.2、处理到期使命

定期运行一个脚本来检查是否有使命到期,并实行它们。
ZRANGEBYSCORE delayed_tasks 0 <当前时间戳>
这个命令将返回全部到期的使命(分数小于或即是当前时间戳的使命)。然后,你可以遍历这些使命并实行它们,末了从zset中删除这些使命。
ZREM delayed_tasks task1 task2
3、滑动窗口限流

假设我们必要对一个API接口进行限流,以确保在一分钟内不凌驾100次请求。以下是如何使用zset来实现滑动窗口限流的具体步骤和代码示例。
3.1、记录请求

每次API被调用时,我们将当前时间戳和请求标识符添加到zset中。
ZADD api_limit:<接口名称> <当前时间戳> <请求标识符>
这里,api_limit:<接口名称>是zset的名称,<当前时间戳>是请求发生的时间,<请求标识符>是每个请求的唯一标识符。
3.2、检查请求频率

在处理请求之前,检查过去一分钟内是否有凌驾100次请求。
ZCOUNT api_limit:<接口名称> <当前时间戳-60000> <当前时间戳>
这个命令将返回过去一分钟内(60000毫秒)的请求数量。如果这个数量凌驾了100,那么拒绝当前请求。
3.3、清理旧请求

为了保持zset的巨细,定期删除凌驾时间窗口的请求。
ZREMRANGEBYSCORE api_limit:<接口名称> 0 <当前时间戳-60000>
这个命令将删除全部凌驾一分钟的请求记录。
以上示例展示了如何使用Redis的zset来实现排行榜、延时队列和滑动窗口限流功能。这些应用场景展示了zset的灵活性和强大的功能。
四、总结

Redis的zset是一个功能强大的有序聚集数据布局,它不但支持元素的添加、删除和查询,还支持范围查询和排名查询,非常适合实现排行榜、延时队列和限流等场景。通过合理使用zset,可以有效地解决许多实际问题。
版权声明:本博客内容为原创,转载请保留原文链接及作者信息。
参考文章:


[*]零底子手把手带你阅读Redis源代码系列-ZSet底层原理详解(跳表SkipList)-阿里云开辟者社区
[*]redis 中Zset(有序聚集)介绍 及常用命令(附有示例)_redis zset-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Redis中的zset用法详解