如何通过redis减库存的秒杀场景实现
如何通过redis减库存的秒杀场景实现
如何通过redis减库存的秒杀场景实现
更新时间:2022年06月01日 10:42:34 作者:
本文通过解决秒杀系统中的一个场景即数据预加载,即把库存数据事先加载到缓存,然后通过缓存来更新库存,简单介绍了如何通过redis减库存的秒杀场景实现,感兴趣的可以了解一下
Redis扣库存,主要目的是减少对数据库的访问,之前的减库存,直接访问数据库,读取库存,当高并发请求到来的时候,大量的读取数据有可能会导致数据库的崩溃。
大家可以先读一下《秒杀系统设计》对整体的秒杀流程有个了解之后,在来读一下这篇文章。
本文只是解决秒杀系统中的一个场景即数据预加载redis 缓存java 秒杀,即把库存数据事先加载到缓存,然后通过缓存来更新库存。
使用思路:第一步:系统初始化后就将所有商品库存放入缓存
/**
* 秒杀接口优化之--- 第一步: 系统初始化后就将所有商品库存放入 缓存
*/
@Override
public void afterPropertiesSet() throws Exception {
List goods = goodsService.getGoodsList();
if (goods == null) {
return;
}
for (GoodsVo goodsVo : goods) {
redisService.set(GoodsKey.getId(), goodsVo.getStockCount());
isOverMap.put(goodsVo.getId(), false);//先初始化 每个商品都是false 就是还有
}
}

第二步: 预减库存从缓存中减库存
/**秒杀接口优化之 ----第二步: 预减库存 从缓存中减库存
* 利用 redis 中的方法,减去库存,返回值为 减去1 之后的值
* */
long stock = redisService.decr(GoodsKey.getGoodsStock, "" + goodsId);
/*这里判断不能小于等于,因为减去之后等于 说明还有是正常范围*/
if (stock < 0) {
isOverMap.put(goodsId, true);//没有库存就设置 对应id 商品的map 为true
return Result.error(CodeMsg.MIAO_SHA_NO_STOCK);
}
整体的逻辑如下:
1.先将所有数据读出来,初始化到缓存中,并以 stock + 的形成存入Redis。
2.在秒杀的时候,先进行预减库存检测redis 缓存java 秒杀,从redis中,利用decr 减去对应商品的库存,如果库存小于0,说明此时 库存不足,则不需要访问数据库。直接抛出异常即可。
我们上面还使用到了,这个是内存标记。
内存标记
由于接口优化很多基于Redis的缓存操作,当并发很高的时候,也会给Redis服务器带来很大的负担,如果可以减少对Redis服务器的访问,也可以达到的优化的效果。
于是,可以加一个内存map,标记对应商品的库存量是否还有,在访问Redis之前,在map中拿到对应商品的库存量标记,就可以不需要访问Redis 就可以判断没有库存了。

1.生成一个map,并在初始化的时候,将所有商品的id为键,标记false 存入map中。
private Map isOverMap = new HashMap();
/**
* 秒杀接口优化之--- 第一步: 系统初始化后就将所有商品库存放入 缓存
*/
@Override
public void afterPropertiesSet() throws Exception {
List goods = goodsService.getGoodsList();
if (goods == null) {
return;
}
for (GoodsVo goodsVo : goods) {
redisService.set(GoodsKey.getGoodsStock, "" + goodsVo.getId(), goodsVo.getStockCount());
isOverMap.put(goodsVo.getId(), false);//先初始化 每个商品都是false 就是还有
}
}
/**再优化: 优化 库存之后的请求不访问redis 通过判断 对应 map 的值
* */
boolean isOver = isOverMap.get(goodsId);
if (isOver) {
return Result.error(CodeMsg.MIAO_SHA_NO_STOCK);
}
if (stock < 0) {
isOverMap.put(goodsId, true);//没有库存就设置 对应id 商品的map 为true
}
2.在预减库存之前,从map中取标记,若标记为false,说明库存
3.预减库存,当遇到库存不足的时候,将该商品的标记置为true,表示该商品的库存不足。这样,下面的所有请求,将被拦截,无需访问redis进行预减库存。
所以利用缓存的整体思路如下:
将商品的库存数据加载至内存如何通过redis减库存的秒杀场景实现,同时初始化内存标记redis 缓存java 秒杀,即把每个产品的id存放至map,都是初始化为false,在每次需要执行秒杀逻辑之前,在在内存标记中取值,如果仍有库存即map里返回的为false,则 执行秒杀逻辑如何通过redis减库存的秒杀场景实现,否则直接抛出异常。
同时扣减库存时,需要判断缓存中的库存数量是否仍然大于0,如果小于等于0,修改内存标记。
到此这篇关于如何通过redis减库存的秒杀场景实现的文章就介绍到这了,更多相关redis减库存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » 如何通过redis减库存的秒杀场景实现
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

