Redis分布式缓存怎么实现微信抢红包
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,本篇内容主要讲解"Redis分布式缓存怎么实现微信抢红包",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Redis分布式缓存怎么实现微信抢红包"吧!一、场景
千家信息网最后更新 2025年11月16日Redis分布式缓存怎么实现微信抢红包
本篇内容主要讲解"Redis分布式缓存怎么实现微信抢红包",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Redis分布式缓存怎么实现微信抢红包"吧!
一、场景分析
微信抢红包已经在我们生活中很常见的场景了,特别是年底公司开年会和春节2个时间段,长辈领导都发红包,手都点抽筋了,也没抢到多少。
在这段时间里,对于单个群里的单个红包,qps也是上千的,对于整个微信红包系统,高峰的并发量是上亿的。
高峰的抢红包有3大特点:
包红包的人多:也就是创建红包的任务比较多,即红包系统是以单个红包的任务来区分,特点就是在高峰期红包任务多。
抢红包的人更多:当你发红包出去后,是几十甚至几百人来抢你的红包,即单红包的请求并发量大。
低延迟:当你发现红包时,要越快抢到越开心,所以要求抢红包的响应速度要快,一般1秒响应。
二、技术方案
1.包红包
先把金额拆解为小金额的红包,例如 总金额1000元,发10个,用户在点保存的时候,就自动拆解为10个随机小红包。
这里的存储就是个难题,多个金额(例如10个小金额的红包)如何存储?
2.抢红包
高并发的抢红包时核心的关键技术,就是控制各个小红包的操作的原子性。
例如 10个红包在100人的群里被抢,10个红包被抢走一个的同时要红包的库存减1,即剩下19个。在整个过程中抢走一个和红包库存减1个是一个原子操作。
list的pop操作弹出一个元素的同时会自动从队列里面剔除该元素,它是一个原子性操作。

三、案例实战
包红包
/** * 包红包的接口 */ @GetMapping(value = "/set") public long setRedpacket(int total, int count) { //拆解红包 Integer[] packet= this.splitRedPacket(total,count); //为红包生成全局唯一id long n=this.incrementId(); //采用list存储红包 String key=RED_PACKET_KEY+n; this.redisTemplate.opsForList().leftPushAll(key,packet); //设置3天过期 this.redisTemplate.expire(key,3, TimeUnit.DAYS); log.info("拆解红包{}={}",key,packet); return n; }拆解红包
/** * 拆解红包 * 1.红包金额要被全部拆解完 * 2.红包金额不能差太离谱 * total 红包金额 * count 红包数量 */public Integer[] splitRedPacket(int total, int count) { int use = 0; Integer[] array = new Integer[count]; Random random = new Random(); for (int i = 0; i < count; i++) { if (i == count - 1) array[i] = total - use; else { // 红包随机金额浮动系数 int avg = (total - use) * 2 / (count - i); array[i] = 1 + random.nextInt(avg - 1); } use = use + array[i]; } return array;}抢红包
/** * 抢红包接口 */ @GetMapping(value = "/rob") public int rob(long redid,long userid) { //第一步:验证该用户是否抢过 Object packet=this.redisTemplate.opsForHash().get(RED_PACKET_CONSUME_KEY+redid,String.valueOf(userid)); if(packet==null){ //第二步:从list队列,弹出一个红包 Object obj=this.redisTemplate.opsForList().leftPop(RED_PACKET_KEY+redid); if(obj!=null){ //第三步:抢到红包存起来 this.redisTemplate.opsForHash().put(RED_PACKET_CONSUME_KEY+redid,String.valueOf(userid),obj); log.info("用户={}抢到{}",userid,obj); //TODO 异步把数据落地到数据库上 return (Integer) obj; } //-1 代表抢完 return -1; } //-2 代表已抢 return -2; }到此,相信大家对"Redis分布式缓存怎么实现微信抢红包"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
红包
金额
拆解
分布式
缓存
任务
单个
原子
就是
用户
高峰
存储
代表
元素
内容
同时
场景
库存
技术
接口
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
国内主流数据库
数据库安全性最重要的是什么
数据库开发技术发展趋势
数据库和空间一样么
fiddler远程服务器代理
关于防止网络安全的作文
电脑搭建数据库服务器
羽盛网络技术工作室
端游吃鸡选哪个服务器
换路由器后连不上服务器
网络安全宣传周 直播
湖南郴州安卓软件开发培训班
财务资料放云服务器安不安全
品质网络技术开发不二之选
服务器钣金件
java应用数据库连接未关闭
幼儿园网络安全工作排查总结
越秀靠谱的网络安全建设
怎么看域名服务器价格
大学生网络安全应该注意哪些
陵县软件开发学习网址哪家好
服务器推送消息到pc
宣传网络安全活动信息
数据库设置小数位数
安畅网络安全绘画
湖南郴州安卓软件开发培训班
巨牛天下网络技术
软件开发需求反讲
数据库怎么建Windows窗体
通讯网络技术支持