基于redis数据结构ZSET实现邀请人排行榜

零售-公司间关联交易退货STO的实现方式 零售-公司间关联交易采购 STO-退货 集团公司下经常会出现一家公司和另外一家公司的公司间的关联交易,如跨公司销售、总分公司之间采购,分公司之间的采购等业务;通常公司间采购会采取STO的模式来实现(根据业务模式可以将库存转储统一做成STO的模式,公司间STO、同公司工厂间、同工厂库存地点间 的STO SAP都是支持的); 公司间STO 正向A向B采购都很熟悉,公司间退货STO的其实也是比较普遍的业务现象,很多实施着也将其做成反向的STO(B向A采购),而不是退货STO(A向B,item 选择return的标 阅读详情

基于redis数据结构ZSET实现邀请人排行榜

  1. 背景:用户注册可以填写邀请人id,系统记录邀请人排行情况
  2. 方案:因为ZSET是一个天然有序的数据结构,我们可以把积分当做score,userId当做member,放到zset中,zset会默认按照SCORE进行排序的。
  3. 代码实现

maven依赖

        <!--    Redisson    -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.24.3</version>
        </dependency>
    //用户注册
    //更新排名(inviterId邀请人ID)
    updateInviteRank(inviterId);

updateInviteRank的具体代码实现:

//定义RScoredSortedSet对象
private RScoredSortedSet<String> inviteRank;
//初始化
@Override
public void afterPropertiesSet() throws Exception {
    this.inviteRank = redissonClient.getScoredSortedSet("inviteRank");
}

private void updateInviteRank(String inviterId) {
    // 如果邀请者ID为空,则直接返回,不进行操作
    if (inviterId == null) {
        return;
    }
    // 获取Redisson的锁对象
    RLock rLock = redissonClient.getLock(inviterId);
    // 对邀请者ID对应的锁进行加锁操作,避免并发更新
    rLock.lock();
    try {
        // 获取邀请者的当前排名分数
        Double score = inviteRank.getScore(inviterId);
        // 如果当前分数为空,则设置默认为0.0
        if (score == null) {
            score = 0.0;
        }
        // 将邀请者的排名分数增加100.0,并更新到排行榜中
        inviteRank.add(score + 100.0, inviterId);
    } finally {
        // 最终释放邀请者ID对应的锁
        rLock.unlock();
    }
}

RScoredSortedSet提供了很多方法方便对ZSET进行操作,以下是一些常用的排行方法:

  • Double getScore(V var1); 获取指定成员的分数。
  • boolean add(double var1, V var3); 向有序集合中添加一个成员,指定该成员的分数。
  • Integer rank(V var1); 获取指定成员在有序集合中的排名(从小到大排序,排名从 0 开始)。
  • Integer revRank(V var1);获取指定成员在有序集合中的排名(从大到小排序,排名从 0 开始)。
  • Collection<ScoredEntry> entryRange(int var1, int var2); 获取分数在指定范围内的成员及其分数的集合。

获取前N个用户的排名信息

//按照分数从高到低,获取前N个用户的排名信息
public List<InviteRankInfo> getTopN(Integer topN) {
    Collection<ScoredEntry<String>> rankInfos = inviteRank.entryRangeReversed(0, topN - 1);

    List<InviteRankInfo> inviteRankInfos = new ArrayList<>();

    if (rankInfos != null) {
        for (ScoredEntry<String> rankInfo : rankInfos) {
            InviteRankInfo inviteRankInfo = new InviteRankInfo();
            String userId = rankInfo.getValue();
            if (StringUtils.isNotBlank(userId)) {
                User user = findById(Long.valueOf(userId));
                if (user != null) {
                    inviteRankInfo.setNickName(user.getNickName());
                    inviteRankInfo.setInviteCount(rankInfo.getScore().intValue() / 100);
                    inviteRankInfos.add(inviteRankInfo);
                }
            }
        }
    }
    return inviteRankInfos;
}
学Simulink——基于风力发电系统的建模与仿真场景:基于自适应控制的风力发电系统输出功率调节 本文详细介绍了使用Simulink搭建风力发电系统自适应控制模型的完整流程。首先阐述了风速波动对电网的影响及自适应控制的优势,然后逐步指导创建Simulink项目、搭建系统结构(包括风速源、风轮机、发电机等模块),重点讲解了模型参考自适应控制器(MRAC)的设计步骤和参数设置方法。通过仿真分析验证了系统在风速变化时仍能保持输出功率稳定,展示了自适应控制的响应速度和鲁棒性。最后提出了引入深度学习预测、多变量控制等优化方向,为新能源领域工程师提供了实用的建模与仿真指导。 阅读详情

相关推荐

图腾柱无桥PFC控制逻辑解析:从双闭环到电压前馈的设计演进

本文深入解析图腾柱无桥PFC控制逻辑的设计演进,从经典双闭环控制到电压前馈技术的实现。通过分析功率波动问题和动态响应慢的症结,提出引入电压前馈的解决方案,并详细探讨数字实现中的关键注意事项。文章还涵盖控制框图的构建、稳定性分析方法及实际应用中的调参技巧,为开关电源设计提供实用指导。

weixin_29268267的博客 571

✅Redis的zset实现排行榜,实现分数相同按照时间顺序排序,怎么做?

使用zset提供的排序功能,可以按照分数从高到低排序,**但是如果分数相同,按照默认的排序规则会按照value值排序**,而不是按照时间顺序排序。假设现在的时间戳是1680417299000,除以1e13得到0.1680417299000,再加上一个固定的分数(比如10),那么最终的分数就是10.1680417299000,可以将它作为zset中某个成员的分数,用来排序。实现了分数倒序排列,分数相同时间戳大的排在了前面,这和我们的需求相反了,所以,就需要在做一次转换。

小赵的博客 2261

AutoDock Vina实战:从零开始完成分子对接(附7VU6案例详解)

本文提供了一份详细的AutoDock Vina分子对接实战指南,以SARS-CoV-2 3CL蛋白酶(PDB ID: 7VU6)为例,从零开始手把手教学。内容涵盖软件安装、环境配置、受体与配体文件准备、对接参数设置,以及结果分析与可视化解读,旨在帮助计算生物学与药物发现领域的新手快速掌握这一核心技能。

ooo22的博客 535

【分布式】Redis分布式之ScoreSortedSet

使用 package com.demo.redis.zset; import org.redisson.api.RScoredSortedSet; import org.redisson.api.RedissonClient; import org.redisson.client.codec.StringCodec; import org.redisson.client.protocol.ScoredEntry; import org.springframework.stereotype.Componen

比嗨皮兔 2900

GEO优化实战:用AnswerBit量化AI搜索可见度与品牌监控体系

生成式引擎优化(GEO)正取代传统SEO,成为品牌在AI搜索生态中获取可见度的关键。当用户习惯从“翻列表”转向“直接问AI”,品牌能否被生成式引擎识别、引用并正向推荐,直接决定了其在用户决策链条中的存在感。AI搜索可见度因此从模糊概念演变为可度量的运营指标,涵盖提及率、引文率、情感分与回源质量等维度。腾讯AnswerBit作为答案侧分析工具,帮助运营者拆解AI回复中的品牌语境与引用来源,让优化动作有据可循。从内容结构化改造、品牌实体建设到第三方权威背书,GEO要求团队建立“度量-优化-再度量”的闭环。文章结

weixin_31100517的博客 150

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 281

分布式系统中确保邀请码唯一性的六种方式

数据库唯一约束 + 重试机制适用于小规模应用,但在高并发情况下性能可能受限。分布式锁适用于高并发应用,但实现较复杂,需要引入额外的中间件。预生成码池适用于对性能要求较高的场景,但需要维护额外的码池和存储空间。基于UUID生成唯一邀请码适用于对实现简单性要求较高的场景,但可能需要处理长字符串的问题。基于雪花算法(Snowflake)适用于需要高性能和全局唯一性的场景,但实现复杂度较高。基于哈希函数适用于灵活性要求较高的场景,但需要处理冲突和依赖输入质量的问题。

qq_28791753的博客 3234

手把手教你用STM32实现SPWM逆变器控制(附完整代码)

本文详细介绍了如何使用STM32微控制器实现SPWM逆变器控制,包括硬件设计、PWM生成配置、正弦表生成与DMA传输,以及闭环控制与性能优化。通过完整的代码示例和实测数据,帮助开发者快速掌握SPWM技术,应用于新能源和电力电子领域。

weixin_29296241的博客 316

Redis-多字段排序-排名设计

Redis的sorted set集合提供了一种有序的集合,集合中的每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 使用场景通常是作为排名。 在上一篇说了选择题型题目表设计,接着这篇说下用户回答题目后的排行设计,这里使用redis的有序集合进行排名,排名条件是正确率高,耗时少。 有序集合添加元素时需设定一个分数,这里两个排序条件不同,一个按照正...

wang704987562的博客 5856

【WRFDA教程】客观分析(OBSGRID)详解

客观分析(OBSGRID)详解

WW、forever的博客 1133

福建公共资源交易平台 portal-sign与响应Data解密逆向实录

本文分析了福建公共资源交易电子公共服务平台的接口加密机制。通过抓包和代码分析,发现请求头中的portal-sign由MD5算法生成,包含固定秘钥和排序后的参数拼接。响应数据采用AES-256-CBC加密,需使用特定Key和IV解密。文章详细介绍了签名生成规则、参数处理流程及加密常量定位方法,为接口对接提供了技术参考。整个过程展示了如何通过逆向工程还原前端加密逻辑,最终实现脱离浏览器环境的纯协议调用。

自成背后的博客 1157

zSet实现排行榜功能

一.写在前面 最近做完直播的基础功能后,又多了很多相关的需求,其中有一个就是直播间分享榜单的功能,顾名思义就是:分享本直播间并成功拉用户进来的数量做一个排行。比如我分享了这个直播间,别人通过我分享的直播间链接点进来,那么这个人就是我邀请来的,我总共邀请了10个人,你总共邀请了6个人,他总共邀请了11个人。实时排名就是他>我>你。 简单介绍了一下功能,其实就是个根据某个权重值做排行榜的...

景川的博客 1万+

推荐系统(六)双塔模型

双塔模型是推荐场景中常用的粗排模型之一,本节主要介绍几种典型的双塔模型及其变型,如SENet 双塔模型,并联双塔,蒸馏学习,对偶增强双塔,阿里 COLD。

Jin_Kwok的博客 5143

使用redis实现排行榜功能

项目需要做排行榜功能,实现员工邀请用户注册排行榜,要求是实时更新,查询要快。员工所属支行、二级行、省行,界面要根据条件显示排名数据。

bank8818bank的专栏 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

redis ZSet实现排行榜功能

一.写在前面 最近做完直播的基础功能后,又多了很多相关的需求,其中有一个就是直播间分享榜单的功能,顾名思义就是:分享本直播间并成功拉用户进来的数量做一个排行。比如我分享了这个直播间,别人通过我分享的直播间链接点进来,那么这个人就是我邀请来的,我总共邀请了10个人,你总共邀请了6个人,他总共邀请了11个人。实时排名就是他>我>你。 简单介绍了一下功能,其实就是个根据某个权重值做排行榜的功能。 二.介绍redis的zset 这里就不说具体的zset实现了(我太菜,不敢放肆,等我牛逼了我再写zs

Smilelfq的专栏 1592

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c

AI 编程时代,开发语言选型需综合考量AI适配度、编译速度、跨平台与学习成本。Python以海量语料和即时执行成首选,适用于AI/ML与原型开发;TypeScript凭借类型系统与秒级构建,成为前端及应用层主流;Go以极速编译与统一风格,契合AI代理高效迭代需求。Rust/C++虽性能强,但编译慢、学习成本高,不适于快速试错。综合推荐:优先选Python、TypeScript、Go,兼顾效率与生态,实现最优AI协作体验。

freewebsys的专栏 516

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 417

Spring Boot 工程通用能力建设:声明式事务定制与 Redis 缓存实践

本文探讨Spring Boot中声明式事务的进阶实践,通过解耦“切点”与“事务属性”,实现灵活控制。核心包括:基于方法名的只读规则(如get*、find*自动设为只读),组合事务属性源确保@Transactional注解优先于命名规则,以及自定义切点实现事务统一织入。该方案提升代码可维护性,避免误写,同时支持特殊场景覆盖,构建更健壮的事务治理体系。

BADAO_LIUMANG_QIZHI的博客 242

Docker多阶段构建实现基于Alpine的Redis的编译安装

【代码】Docker多阶段构建实现基于Alpine的Redis的编译安装。

一直在努力学习的菜鸟 316

Redis 数据类型全解 - ZSet:两个编码,七种玩法(五)

Redis ZSet 是唯一支持按可变分值有序且成员可快速定位的数据结构,适用于排行榜、延迟队列、滑动窗口限流等场景。其核心价值在于用 score 表达业务语义,但使用不当易引发性能问题:轮询导致 CPU 飙升、全量查询拖垮实例、非原子操作致超发。关键陷阱包括 ZRANGE 0 -1 误用为分值范围、GT/LT 条件逻辑误解、双精度精度上限导致分值冲突。正确使用需掌握原子写入(如 ZADD GT)、避免轮询、合理控制范围,并注意编码类型对复杂度的影响。

IT规划师 513

SQLite 是什么?和 MySQL、Redis 有什么区别,项目中应该怎么选?

SQLite 是轻量级嵌入式关系型数据库,无需独立服务,直接通过文件存储数据,适合本地工具、桌面应用、移动端离线数据及单机轻量业务。与 MySQL 相比,它部署简单但并发写入受限;与 Redis 不同,它支持完整 SQL 与事务,适用于结构化数据持久化。三者可协同使用:MySQL 处理核心业务,Redis 实现高速缓存与计数,SQLite 降低部署复杂度。选型应基于场景需求,而非技术偏好。

栈外手记|2018 年起深耕后端开发。跳出代码栈,分享技术、项目踩坑与行业思考,看见技术之外更多可能。 334

RabbitMQ 消费端幂等:唯一索引、条件更新、Redis 去重三种方案的真实代价

MQ 只承诺至少投递一次,重复消息只能消费端自己吃掉。这篇对比唯一索引、条件更新、Redis 短路三种去重方案在 AI 任务场景下的实际代价,附三个踩过的坑。

zhangpan 184

redis

AOF 文件体积更大,恢复慢,因为恢复的时候要逐条重放命令。AOF 还有重写机制,用来消除冗余,比如同一个 key 连续 set a、set b、set c、set d,重写之后就只保留一条 set key d,精简文件。消息会被分发到每一个实例的队列,所有实例监听自己的队列,收到消息之后,各自删除本机 Caffeine 里面对应的本地缓存,实现一处修改、全部实例本地缓存失效。HyperLogLog 不存原始数据,基于概率算法估算独立数量,内存极小,支持海量 UV 统计,缺点是结果有微小误差,拿不到明细。

2401_84390420的博客 167

如何在本地 Docker 容器中运行 Redis,并使用 Redis Insight 和 Redis CLI 进行管理

本文教程介绍了如何使用Docker本地运行Redis服务器与RedisInsight,实现数据的可视化管理。通过RedisInsight和RedisCLI,学习了对哈希、字符串、列表、集合、有序集、流及JSON等数据类型的增删改查(CRUD)操作,涵盖HSET、GET、SADD、XADD等核心命令,帮助开发者高效掌握Redis基本用法。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 271

Redis 从 0 到 1(二十五):连接池又打满了——PoolSize 公式、泄漏排查与 PoolStats

流量一涨就 connection pool timeout,加 PoolSize 治标不治本——可能是连接泄漏。本文给出 PoolSize 计算公式(QPS×RT),用 PoolStats 的 4 个指标判断池太小还是没归还,并演示典型泄漏代码与修复。

2501_92769340的博客 587

Redis 从 0 到 1(二十七):JSON 体积是 Protobuf 的 3.7 倍?3 种序列化的 Go 基准测试

缓存对象直接用 json.Marshal,1 亿条 key 多花 20G 内存和 3 倍带宽。本文对 JSON / MessagePack / Protobuf 做 Go 基准测试(体积、编解码耗时、CPU),给出不同场景的选型表和统一序列化封装。

2501_92769340的博客 176
上一篇: Linux上安装部署Redis(7.0.11)
下一篇: 基于Lua+Redis实现库存的秒杀扣减
AllowM
博客等级 码龄7年 111粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值