首页 > 数据库 >使用 Redis Zset 有序集合实现排行榜功能

使用 Redis Zset 有序集合实现排行榜功能

时间:2024-05-16 17:10:30浏览次数:14  
标签:PRODUCT Zset Redis SALES RANK 排行榜 withscores 排序

一、前言
排行榜功能是非常常见的需求,例如商品售卖排行榜单、游戏中的积分排行榜、配送员完单排行榜等。实现排行榜功能需要高效地对大量数据进行排序和查询,如果直接进行数据库查询对应业务排行榜资源开销会非常大,一般会将对应榜单需要的数据做单独存储记录,查询时只要对榜单数据表进行遍历排序即可,因为榜单数据表的数据是无序的,还要对具体数据进行排序,并且每次数据变动都要更新表中数据,当数据量过大或者高并发时性能一般,要想高效地实现排行榜功能需要使用 Redis Zset 有序集合,可以非常高效方便地实现排行榜功能。

需要Redis常用命令集文章可以查看:https://blog.csdn.net/weixin_44606481/article/details/133672258

二、Redis Zset 的基本操作

# 添加以一个过着多个元素,score为评分,集合按照从低到高及进行排序,评分可以重复
zadd  <key> <score1> <value1> <score2> <value2>

# 获取有序集合中成员的数量
zcard <key>

# 统计score评分在某个范围内的数据的数量
zcount <key> <min> <max>

# 查一定范围的元素,end为-1时,查询所有,按照分数从小到大排序,withscores加上他,连着评分一起查出
zrange <key> <start> <end> [LIMIT offset count] [withscores]

# 查一定范围的元素,end为-1时,查询所有,按照分数从大到小排序,withscores加上他,连着评分一起查出
zrevrange <key> <start> <end> [LIMIT offset count] [withscores]

# 查询score评分在某个范围内的数据,从小到大排序,min 和 max 可以是 -inf 和 +inf来表示无穷小和无穷大,withscores加上他,连着评分一起查出
zrangebyscore <key> <min> <max> [withscores] [limit offset count]

# 查询score评分在某个范围内的数据,从大到小排序,min 和 max 可以是 -inf 和 +inf来表示无穷小和无穷大,withscores加上他,连着评分一起查出
zrevrangebyscore  <key> <max> <min> [withscores] [limit offset count]

# 为元素的score加上指定的增量
zincrby  <key> <increment> <value>

# 删除数据
zrem <key> <value1> <value2>

# 返回集合中value的排名,按分数递增排序。分数值最小者排名为0
zrank  <key> <value>

# 返回集合中value的排名,按分数递减排序。分数值最大者排名为0
zrevrank  <key> <value>

三、通过Redis 命令模拟排行榜功能
这里模拟一个商品销量排行榜缓存key为PRODUCT:RANK:SALES,假设有6个商品,商品ID分别为 P001-P006。

3.1、排行榜生成
1、初始化排行榜数据(为了演示这里先给每个商品销量设置0,一般在业务中会先将数据库中的销量数据查询出来初始化到排行榜中)

127.0.0.1:6379> zadd  PRODUCT:RANK:SALES 0 P001 0 P002 0 P003 0 P004 0 P005 0 P006
(integer) 6

  

  • 2、给商品ID为P002、P005、P006的商品分别添加销量7、2、9
127.0.0.1:6379> zincrby PRODUCT:RANK:SALES 7 P002
"7"
127.0.0.1:6379> zincrby PRODUCT:RANK:SALES 2 P005
"2"
127.0.0.1:6379> zincrby PRODUCT:RANK:SALES 9 P006
"9"

 

3.2、排行榜查询

  • 1、查询排行榜全部数据按照分数从大到小排序
    127.0.0.1:6379> zrevrange PRODUCT:RANK:SALES 0 -1 withscores
     1) "P006"
     2) "9"
     3) "P002"
     4) "7"
     5) "P005"
     6) "2"
     7) "P004"
     8) "0"
     9) "P003"
    10) "0"
    11) "P001"
    12) "0"
    

      

 

  • 2、查询排行榜销量前三的数据按照分数从大到小排序
127.0.0.1:6379> zrevrange PRODUCT:RANK:SALES 0 2 withscores
1) "P006"
2) "9"
3) "P002"
4) "7"
5) "P005"
6) "2"

  

  • 3、查询排行榜销量大于等于1的数据从小到大排序,并且进行分页,每页2条数据查询第1页
# 不分页
127.0.0.1:6379> zrangebyscore PRODUCT:RANK:SALES 1 +inf withscores
1) "P005"
2) "2"
3) "P002"
4) "7"
5) "P006"
6) "9"
# 分页 limit 0 2 (0:代表偏移量 2:显示条数)
127.0.0.1:6379> zrangebyscore PRODUCT:RANK:SALES 1 +inf withscores limit 0 2
1) "P005"
2) "2"
3) "P002"
4) "7"

  

  

标签:PRODUCT,Zset,Redis,SALES,RANK,排行榜,withscores,排序
From: https://www.cnblogs.com/cxy2020/p/18196284

相关文章

  • Docker Desktop部署微软微服务Dapr(Redis+Zipkin+Placement)
    DockerDesktop部署微软微服务Dapr(Redis+Zipkin+Placement)说明系统:Windows11专业版23H2Docker:DockerDesktopv4.29.0+本文为开发环境学习和测试使用安装DaprCLI使用MSI安装程序安装每个DaprCLI的发布版本还包括一个适用于Windows的安装程序。您可以手动下......
  • redis
    redis介绍安装#0数据库-存数据的软件#1关系型数据库-PostgreSQL(后面安装了解看看),mysql,sqlserver,oracle。。。-sql语句,通用#2非关系型数据库-redis,mongod,clickhouse,infludb,elasticsearch。。。#3非关系型数据库:nosql-c语言写的服务(监听端......
  • redis之哈希类型
    在Redis中,哈希(Hash)类型是一种将多个键值对存储在单个键中的数据结构。哈希类型被用来表示对象,其中每个键都是对象的属性,并且每个属性都与一个值相关联。哈希类型在Redis中通常用于存储对象的属性集合。哈希类型和python中的字典类型很像哈希类型常用方法【1】hset#用于设置......
  • redis之字符串
    【1】set#1SET命令用于设置给定key的值。如果key已经存储其他值,SET就覆写旧值,且无视类型。res=conn.set(name='name',value='green')print(res)#插入成功后返回True#1.1设置过期时间conn.set(name='name',value='green',ex=5)#ex=5在5秒后过期conn.s......
  • django中使用redis
    【1】通用方式########写个pool.pyimportredisPOOL=redis.ConnectionPool(max_connections=10,decode_responses=True)######在哪里用,导入用即可fromutils.poolimportPOOLimportredisclassRedisView(ViewSet):deflist(self,request):conn=red......
  • redis通用操作
    通用操作的意思就是与数据类型无关,都可以操作的方法【1】delete#删除某个键对应的值可用一次性删多个res=conn.delete('color')#删除color对应的数据【2】exists#判断某个键是否存在存在返回1不存在返回0res=conn.exists('girls')【3】keys#返回所有键或......
  • redis之list类型
    在redis中,list类型是一种有序的字符串元素集合。redis的list和python中的列表类型有一些相似之处,但也有一些不同点redis列表类型的特点有序性:列表中的元素是按照插入顺序存储的,每个元素都有一个索引位置。允许重复元素:列表中可以包含重复的元素。支持头部和尾部的操作:Redis......
  • Redis总结
    【一】redis基础【二】python连接redis【三】Redis连接池【四】redis之字符串【五】redis之哈希类型【六】redis之list类型【七】redis通用操作【八】django中使用redis......
  • Redis连接池
    【一】Redis连接池的优点​ Redis连接池的存在主要是为了优化Redis客户端和Redis服务器之间的连接管理,提升性能和稳定性。具体而言,Redis连接池具有以下几个优点:提升响应速度:由于连接池中已经存在可用的连接,客户端可以快速获取连接并执行操作,而不需要等待新的连接建立过程。这......
  • redis基础
    redis介绍Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis与其他key-value缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供l......