ZSet数据结构
3 分钟阅读
•
434 字
+
219 词
Zsets实现原理
- listpack (在7.0版本之前是ziplist):使用条件是集合元素个数小于或等于某个配置值(默认128),且member占用字节数小于或等于zset-max-listpack-value的配置值(默认64)。 将member和score紧凑排列作为listpack的一个元素存储。
- skiplist+dict :当不满足上述条件时,将数据分别存储在skiplist和dict中,是一种空间换时间的思想。散列表的key存储的是元素的member,value存储的是member关联的score。
使用场景:
# 为每个用户/IP/API创建一个zset
# user:123:requests 是zset的键名
# 当前时间戳是分数
# 请求ID是成员
ZADD user:123:requests <current_timestamp> <request_id>
# 移除时间窗口外的所有请求(例如1分钟前的)
ZREMRANGEBYSCORE user:123:requests 0 <current_timestamp - 60000>
# 计算当前窗口内的请求数
ZCARD user:123:requests
# 如果请求数低于限制,允许请求
# 如果请求数达到或超过限制,拒绝请求
延迟队列,使用score存储过期时间,从小到大排序,最靠前的就是最先到期的数据。