首页 > 数据库 >【Redis Zset】Redis Zset多字段排序方案设计

【Redis Zset】Redis Zset多字段排序方案设计

时间:2024-12-27 15:10:38浏览次数:6  
标签:10000 Zset channelId Redis score 排序 RedisUtil 多字段

背景

最近拿到多个排行榜相关的需求,按财富值,魅力值等单个或多个字段进行排序默认取前N条数据,考虑使用Redis进行排行榜实现,数据结构使用zset,本文对财富值和魅力值二个或多个字段排序的思路进行说明;  

需求背景

排行榜,按财富值和魅力值进行倒序排序,优先财富值排序,财富值相同则取魅力值数据  

需求设计

思路:这里使用Redis zset数据结构,主要考虑将score字段进行分段,例如,完整的score:1000020000,财富值:10000,魅力值:20000,分段去维护两个数据,整体作为score去查询 具体代码如下:
//key: channelId,频道ID
//score:  分段排序:10000  20000
//member: userId,用户ID
log.info("1.数据初始化");
RedisUtil.zAdd("channelId", "1000", 1000020000);//10000 20000
RedisUtil.zAdd("channelId", "2000", 1000020001);//10000 20001
RedisUtil.zAdd("channelId", "3000", 1000120000);//10001 20000
RedisUtil.zAdd("channelId", "4000", 1000120001);//10001 20001

log.info("2.数据分段处理");
Double score = RedisUtil.zScore("channelId", "4000");
//获取第一段排序
int scorePart1 = (int) ((score / 1000000000) * 10000);
//获取第二段排序
int scorePart2 = (int) (score % 100000);
log.info("member 10000,scorePart1:{},scorePart2:{}", scorePart1, scorePart2);

log.info("3.数据查询结果");
Set<String> members = RedisUtil.zRange("channelId", 0, 4);
log.info("members:{}", members);

return BaseOutput.success();
  缓存数据

 

执行结果日志
024-12-27 14:39:20.550 [TID: N/A] INFO  [abc123456789] [http-nio-9004-exec-1] c.l.i.u.controller.app.TestController -1.数据初始化
2024-12-27 14:39:20.770 [TID: N/A] INFO  [abc123456789] [http-nio-9004-exec-1] c.l.i.u.controller.app.TestController -2.数据分段处理
2024-12-27 14:39:20.799 [TID: N/A] INFO  [abc123456789] [http-nio-9004-exec-1] c.l.i.u.controller.app.TestController -member 10000,scorePart1:10001,scorePart2:20001
2024-12-27 14:39:20.799 [TID: N/A] INFO  [abc123456789] [http-nio-9004-exec-1] c.l.i.u.controller.app.TestController -3.数据查询结果
2024-12-27 14:39:20.829 [TID: N/A] INFO  [abc123456789] [http-nio-9004-exec-1] c.l.i.u.controller.app.TestController -members:[1000, 2000, 3000, 4000]

 

标签:10000,Zset,channelId,Redis,score,排序,RedisUtil,多字段
From: https://www.cnblogs.com/july-sunny/p/18635822

相关文章

  • 日志文件爆满_开发脚本每小时自动检测日志大小_定期清理日志_生产环境redis宕机_无法
     今天日志数据占用磁盘爆满,正常运行的系统发生,redis无法写入的报错,导致共用的redis服务器,瘫痪了,很多系统都进不去了. 最后查了一下才知道,是因为磁盘上一个日志文件170多GB了,都是日志.看看怎么处理:首先编写一个脚本,用来循环检测,每一个小时检测文件大小,如果超过......
  • Redis篇--应用篇1--会话存储(session共享)
    1、概述实现Session共享是构建分布式Web应用时的一个重要需求,尤其是在水平扩展和高可用性要求较高的场景下。在分布式服务或集群服务中往往会出现这样一个问题:用户登录A服务后可以正常访问A服务中的接口。但是我们知道,分布式服务通常都是有多个微服务一起构建形成的。如果......
  • (九).NET6.0搭建基于Redis的Hangfire定时器
    1.首先创建新的类库项目Wsk.Core.Hangfire,然后在Wsk.Core.Package包项目下引用hangfire有关的组件,包括Hangfire、Hangfire.Core、Hangfire.Redis、Hangfire.Redis.StaskExchange2.在配置文件新增基于redis的hangfire的数据库连接3.在Wsk.Core.Hangfire项目下,新增Hangfire连......
  • (八).NET6.0添加通用的Redis功能
    1.添加包:StackExchange.Redis2.在配置文件里面,新建Redis的有关配置信息Name是别名,可以任意起。Ip是Redis的服务端地址,例如安装本地,就是127.0.0.1,端口号Port默认是6379,密码可以通过Redis安装的根目录下的配置文件进行设置,Timeout是连接的超时时间,Db是使用Redis的DB区,一般Redis......
  • PHP语言laravel框架中基于Redis的异步队列使用实践与原理
    在Laravel中,基于Redis的异步队列是通过Laravel的队列系统与Redis服务结合来实现的。这种队列机制允许你将任务推送到队列中,并由后台工作进程异步处理这些任务。这样,你就可以将耗时的操作(如发送邮件、处理视频、数据同步等)推迟到后台处理,从而提高应用的响应速度。###1......
  • Redis 性能优化策略
    一、引言在当今数字化时代,Redis作为一款高性能的键值对存储数据库,在众多领域中发挥着关键作用。无论是应对高并发的Web应用场景,还是满足大数据量下的快速读写需求,Redis都展现出了卓越的性能优势。然而,随着业务的不断拓展和数据量的持续增长,如何进一步优化Redis的性能,使......
  • 中型项目中 Redis 的关键作用
    一、引言在中型项目的开发与运维过程中,随着业务量的增长和数据复杂度的提升,数据处理和存储面临着诸多挑战。例如,高并发场景下的数据读写压力、海量数据的快速查询需求以及数据一致性的保障等问题,都对项目的性能和稳定性提出了更高的要求。而Redis作为一款高性能的内存数据库......
  • Redis是什么,怎么安装使用
    ###Redis是什么?Redis(**RE**mote**DI**ctionary**S**erver)是一个开源的、基于内存的高性能键值数据库(key-valuestore)。它不仅支持简单的键值对,还支持多种复杂的数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(SortedSet)等。Redis常被用作缓存、中间件......
  • Redis缓存数据库
    1、介绍redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库redis的官网:redis.io注:域名后缀io属于国家域名,是britishIndianOceanterritory,即英属印度洋领地1、redis的特点:1.丰富的数据结构 -----string,list,set,zset,ha......
  • Redis可视化工具推荐:Another Redis Desktop Manager使用教程与下载
    Redis是一种高性能的Key-Value数据库,被广泛应用于缓存、消息队列等场景。尽管Redis的命令行工具功能强大,但对于许多开发者而言,使用一款可视化工具可以大大提高操作效率和用户体验。今天为大家推荐一款功能强大的Redis可视化工具——AnotherRedisDesktopManager,并提供资源下载链......