Redis分布式缓存怎么实现微信抢红包
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,本篇内容主要讲解"Redis分布式缓存怎么实现微信抢红包",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Redis分布式缓存怎么实现微信抢红包"吧!一、场景
千家信息网最后更新 2025年01月24日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安全错误
数据库的锁怎样保障安全
软件开发的是什么
oracle数据库降序
网络安全远离黄赌毒班会
戴尔 数据库
好用的经济数据库是哪些
网易我的世界最火的生存服务器
ssctf全国网络安全大赛
邯郸进销存软件开发团队
家用wifi网络安全吗
软件开发的安全性要考虑哪些
万维网数据库缩写
鸡西网络安全罪
软件开发中网关的目的和作用
我的世界超出服务器范围
数字媒体艺术网络技术学的什么
神通数据库Dba手册下载
网络安全故障排查常用命令
武汉大学数据库原理期末考试
服务器cpu几块钱
用友u8安装sql数据库
win8无线网络安全属性
2 什么是网络安全体系
如何应对网络安全风险文章
各大企业服务器设在哪里
魔兽世界怀旧服燃烧的远征奥金斧服务器
罗李 软件开发
利星行平治 软件开发
网络安全大脑入选科技部
前端服务器端渲染
网络安全应急响应目的