redis的活动倒计时秒杀问题
版权声明:本文为博主原创文章,转载需标明出处哦 ^-^。 https://blog.csdn.net/qq_33101675/article/details/83118461
我们知道电商里有很多场景,就是活动倒计时的秒杀问题,比如:明天10点开始抢购,倒计时2分钟等,那么这个到底有多精确呢?是不是2分钟时间刚刚到活动就准时开始呢?我们今天先来说下倒计时,改天说秒杀问题。
我说一下做法,这里有三种方案,是我思考出来的,可能不对,也可能有更好的方案,仅供参考吧。
首先还有一张表,记录着活动商品,里面有活动的状态、价格,标签,最重要的是有活动的开始时间
1、新建一个缓存,key为固定的,查询活动商品表,把所有的活动待开始的商品,放进该缓存里。然后写个定时任务,可以每5秒(如果要很精准的话,那就每秒去查询该缓存),去查询该缓存key,获取到所有的待开始的商品list,遍历这个list,拿每条数据的开始时间与当前时间相比,如果开始时间 <= new Date()时,表明该商品活动已经开始了,List<Integer> needUpdates = new ArrayList<>();那就用needUpdates.add(该商品ID),用来最后批量更新的,把这些商品的状态由 未开始 批量更新为 进行中;更新DB成功后,要将刚刚活动已开始的商品,从缓存中移除掉,由于redis没有提供按照index来操作list中的某一条数据,那我们的做法是,jedis.del(key),然后再查询DB,把所有的活动待开始的商品,放进该缓存里,全删全增。
List<Dto> list = jedis.get(key);
for(Dto dto : list){
if(dto.getStartTime().getTime() <= new Date().getTime()){//商品已达到活动时间了
needUpdates.add(dto.getId());
contiune;
}
contiune;
}
if(Collentions.isNotEmpty(needUpdates)){
mapper.updateBatch(needUpdates);//活动状态批量更新为 进行中
jedis.del(key);
jedis.set(key,"DB里所有待开始的活动商品")
}
2、上面的做法,可以满足需求,但是要全删全增缓存,为了避免这种做法,我们可以借助redis中list类型里的rpop和lpop来做。新建一个缓存,key是固定的,查询活动商品表,把所有的活动待开始的商品,按照活动开始时间进行从大到小排序,放进该缓存里。然后开启一个定时任务,每5秒执行一次,List<Dto> list = jedis.get(key); 得到排序好的list。
List<Integer> needUpdates = new ArrayList<>();
for(Dto dto : list){
if(dto.getStartTime().getTime() <= new Date().getTime()){//商品已达到活动时间了
jedis.Lpop(key);//移出并获取列表的第一个元素,从缓存中移除该条数据
needUpdates.add(dto.getId());
contiune;
}else{//因为是按开始时间从大到小排序的,所以上面的条件不满足,下面的数据也不需要判断了
break;
}
}
if(Collentions.isNotEmpty(needUpdates)){
mapper.updateBatch(needUpdates);//活动状态批量更新为 进行中
}
这样的话,定时任务里就不用全删和全增数据了,但是在后台,新增或更新活动商品的时候,还是要删除缓存,查询数据并按开始时间排序,放进缓存的,也需要全删全增。
3、与第二种类似,只不过这里借助redis里的有序集合,这样的话,就不用我们自己按照时间排序了,让redis来帮我们排序,直接上伪代码吧。
后台新增或者更新活动商品的时候
ZADD key 开始时间的毫秒数1 dto1(数据)
ZADD key 开始时间的毫秒数2 dto2(数据)
ZADD key 开始时间的毫秒数3 dto3(数据)。。。
这样存到redis里,redis就会自动帮我们排序了,把 开始时间的毫秒数 最大的放在第一位
然后起一个定时任务,每5秒执行一次,List<Dto> list = jedis.get(key);
for(Dto dto : list){
if(dto.getStartTime().getTime() <= new Date().getTime()){//商品已达到活动时间了
zremrangebyrank key 0 0;//从缓存里移除掉第一个数据
needUpdates.add(dto.getId());
contiune;
}else{//因为是按开始时间从大到小排序的,所以上面的条件不满足,下面的数据也不需要判断了
break;
}
}
if(Collentions.isNotEmpty(needUpdates)){
mapper.updateBatch(needUpdates);//活动状态批量更新为 进行中
}
这个方案比较第二种,就是少了手动内存排序这一步骤,提升效率。
redis的活动倒计时秒杀问题相关推荐
- 使用Redis搭建电商秒杀系统
作者:小热爱 来源:https://juejin.cn/post/6955372476649963556 秒杀活动是绝大部分电商选择的低价促销.推广品牌的方式.不仅可以给平台带来用户量,还可以提高平台 ...
- html5倒计时秒杀怎么做,vue 设计一个倒计时秒杀的组件
HTML CSS HTML5 CSS3 vue 设计一个倒计时秒杀的组件 简介: 倒计时秒杀组件在电商网站中层出不穷 不过思路万变不离其踪,我自己根据其他资料设计了一个vue版的 核心思路:1.时间 ...
- 活动倒计时的一些想法
经常会遇到秒杀或者活动倒计时的需求,这个应该是工作过程中经常能遇到的. 不可避免的,会产生一些深入思考的行为.这篇笔记就记一下吧. 场景: 后台返回本次活动参与活动的产品的所有倒计时信息以及当前服务器 ...
- bwiki样式的活动倒计时html代码(带渐变色进度条)
首先我发现b站wiki它这个样式很好看,于是就仿照着,并根据一些其他代码模仿了一个,很适合其他需要做活动倒计时的小网站,只需要html代码就能实现. 废话不多说,直接上代码. <div id=& ...
- vue 设计一个倒计时秒杀的组件
简介: 倒计时秒杀组件在电商网站中层出不穷 不过思路万变不离其踪,我自己根据其他资料设计了一个vue版的 核心思路:1.时间不能是本地客户端的时间 必须是服务器的时间这里用一个settimeout ...
- tp6 使用lock_TP5使用Redis处理电商秒杀
本篇文章介绍了ThinkPHP使用Redis实现电商秒杀的处理方法,具有一定的参考价值,希望对学习ThinkPHP的朋友有帮助! TP5使用Redis处理电商秒杀 1.首先在TP5中创建抢购活动所需要 ...
- Redis实战篇--优惠券秒杀
文章目录 Redis实战篇--优惠券秒杀 全局唯一ID 实现优惠券秒杀下单 超卖问题 一人一单 分布式锁 基于redis的分布式锁 Redis实战篇–优惠券秒杀 全局唯一ID 为什么需要全局唯一id? ...
- 活动倒计时范例(日期倒计时例子)
活动倒计时范例(日期倒计时例子) <!DOCTYPE html> <html lang="en"> <head><meta charset ...
- redis使用watch完成秒杀抢购功能
redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内 ...
最新文章
- 人工智能时代,怎样高效关注行业趋势、了解AI技术与落地?
- python文本替换 数据库_Python pptx(Power Point)查找和替换文本(ctrl+H)
- python 调用linux命令-四种执行python系统命令的方法
- UOJ 152 汉诺塔 分治
- mysql查询数据库报错sql_mode_MySQL数据库的sql_mode
- 一个简单的性能计数器:CodeTimer
- 高性能可扩展mysql-数据库设计规范
- 5分钟k线数据 存储_短线高效炒股——60分钟K线买卖法,抓住买卖时机,看完受益匪浅!...
- 洛谷 p1434 滑雪【记忆化搜索】
- 十分钟理解Actor模式
- 安卓帧数监测软件_手机帧数测试软件-手机fps帧数显示软件1.6 免root版-东坡下载...
- 如何利用模型对大客户风险评估——信用额度进行推测
- 虚拟机ubuntu与真实机实现实现复制粘贴、传输文件
- PS使模糊图片变清晰
- Mysql Workbench 8,连接时显示An AppArmor policy prevents this sender from sending this message to this rec
- pdm系统是归档服务器吗,PDM系统的主要功能
- QGraphicsView制作绘制图元工具资料整理(鼠标、平移、缩放)
- 鼠标右键转圈圈_了解原理并解决鼠标右键转圈圈
- OpenPortal Wifi认证、Portal协议认证、WEB认证解决方案
- perl安装不全导致的Can't locate Time/HiRes.pm in @INC错误的处理方法
热门文章
- Spring容器是怎么初始化的?
- 使用RX方式模拟DoubanFm的登陆
- 人工智能各学派简介:符号主义,连接主义,行为主义
- 区块链重塑经济与世界
- spotify mp3_创建无监督学习的Spotify播放列表
- pdf文件太大?看pdf压缩大小的方法吧
- java中arSigal_基于AR模型谱估计算法(Yule-Walker方法与Burg方法)的C++实现
- 我的世界 服务器 无限载入地形,我的世界:奇特地形被官方隐藏,群系无限重复,你能发现规律吗?...
- node 脚手架项目,快速删除 node_modules 包的 rimraf 命令
- AMD显卡性能测试软件,谁更适合Win7?AMD与NVIDIA显卡性能对比