前言:
最近做项目,为了实现积分排行榜功能,就采用了redis zset有序集合来实现。在此记录一下,方便日后再做同样功能的时候回顾下。


1、数据结构

我们首先来看一下zset数据结构是什么样的:
row:redis根据score自动生成的排名(有序序号)
value:我们往zset中add进来的值,zset是当做string类型存储的;我这里存的是用户id
score:double类型的分数;我们在往zset中add值的时候,同时要给这个值指定分数;我这里存的是用户积分
redis zset数据结构


2、基本概念

  • redis的有序集合与集合一样也是String类型元素的集合,不允许有重复的元素
  • 每一个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行排序
  • 有序集合中的成员是唯一的,但是分数可以重复
  • 集合是通过哈希表实现的,集合中的最大元素是2的32次方减1。Zset是有序且不重复的

3、常用操作命令

3.1、增

# 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZADD key score1 member1 [score2 member2]

# 将指定key对应的集合中的member元素对应的分值递增加 increment
# 如果key不存在,则创建key并赋值为increment (原子操作)
zincrby key increment member

3.2、删

# 删除集合
del key

# 删除指定key对应的集合中的一个或多个成员
zrem key member1 member2...

# 根据排名区间删除,删除列表中索引在start~end之间(包括start和end本身)的元素
zremrangebyrank key start end
    
# 根据分数区间删除,删除分值在min~max之间的元素
zremrangebyscore by min max

3.3、改

# 将指定key对应的集合中的member元素对应的分值递增加 increment
# 如果key不存在,则创建key并赋值为increment (原子操作)
zincrby key increment member

3.4、查

# 返回指定key对应的有序集合的元素数量
zcard key

# 返回指定key对应的有序集合中,分值在min~max之间的元素个数
zcount key min max
    
# 返回指定key对应的有序集合中,指定元素member在集合中排名,从0开始切分值是从小到大升序
zrank key member
    
# 返回指定key中的集合中指定member元素对应的分值
zscore key member
    
# 返回指定key对应的有序集合中,索引在min~max之间的元素信息,如果带上 withscores 属性的话,可以将分值也带出来
zrange key min max [withscores]
    
# 返回指定key对应的集合中,指定member在其中的排名,注意排名从0开始且按照分值从大到小降序
zrevrank key member

# 指定key对应的集合中,分值在 start~end之间的降序,加上 withscores 的话可以将分值以及value都显示出来
zrevrange key start end [withscores]
    
# 同zrange命令不同的是,zrange命令是索引在startend范围的查询,而zrangebyscore命令是根据分值在startend之间的查询且升序展示
zrangebyscore key start end [withscores]
    
# 同zrangebyscore命令不同的是,zrangebyscores是根据分值从小到大升序展示,而zrevrangebyscore命令是从max到min降序展示
zrevrangebyscore key max min [withscores]

# 获取指定数量的key的交集。例如有 key1:{10:A,20:B,30:C},key2{40:B,50:C,60:D},那么命令 zinterstore key3 2 key1 key2 意思就是 将key1 key2这两个集合的交集 赋给key3,如何获取key1与key2的交集呢。 key1中存在 A B C,key2中存在 B C D,那么交集就是 B 和 C,且 B与C对应的score也会叠加,即 key3{B:20+40=60,C:30+50=80}
zinterstore desk-key key-count key...
    
# 获取指定数量key的并集,例如有 key1{10:A,20:B,30:C},key2{40:B,50:C,60:D},可以看出 A和D不是key1与key2共有的,但是并集中只要存在就会记录进去,然后B与C是共有的,即 并集的结果就是 key3{10:A,B:60,D:60,C:80}
zunionstore desk-key key-count key...

更多、更详细的命令介绍看这个“redis中文网”
https://www.redis.net.cn/order/3609.html


4、命令与RedisTemplate API的对应关系

直接看这个博主的文章吧
https://blog.csdn.net/fhf2424045058/article/details/110801351

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐