产业气象站|Boot + redis解决商品秒杀库存超卖,看这篇文章就够了,Spring
文章图片
2020年Java面试题库连载中
!
问题描述
【产业气象站|Boot + redis解决商品秒杀库存超卖,看这篇文章就够了,Spring】在众多抢购活动中 , 在有限的商品数量的限制下如何保证抢购到商品的用户数不能大于商品数量 , 也就是不能出现超卖的问题;还有就是抢购时会出现大量用户的访问 , 如何提高用户体验效果也是一个问题 , 也就是要解决秒杀系统的性能问题 。 本文主要介绍基于redis实现商品秒杀功能 。 先来跟大家讲下大概思路 。
总体思路就是要减少对数据库的访问 , 尽可能将数据缓存到Redis缓存中 , 从缓存中获取数据 。
在系统初始化时 , 将商品的库存数量加载到Redis缓存中;接收到秒杀请求时 , 在Redis中进行预减库存 , 当Redis中的库存不足时 , 直接返回秒杀失败 , 否则继续进行第3步;将请求放入异步队列中 , 返回正在排队中;服务端异步队列将请求出队 , 出队成功的请求可以生成秒杀订单 , 减少数据库库存 , 返回秒杀订单详情 。 当后台订单创建成功之后可以通过websocket向用户发送一个秒杀成功通知 。 前端以此来判断是否秒杀成功 , 秒杀成功则进入秒杀订单详情 , 否则秒杀失败 。
下面直接上代码系统初始化的时候将秒杀商品库存放入redis缓存
文章图片
第二创建消息队列(这里为了方便 , 我直接使用redis队列来进行模拟操作)
文章图片
第三配置RedisTemplate序列化
文章图片
下面创建一个接口 , 在这个接口中创建10000个线程来模拟用户商品抢购场景
文章图片
文章图片
这里使用到了redisapi中的decrement操作 , 预先减轻用户抢购的数量 , 同时判断redis中的库存是否大于用户抢购数量 , 如果小于0 , 直接提示用户秒杀失败 , 否则秒杀成功 , 进入redis消息队列执行数据库建库存操作 。 以上操作注意保证redis缓存与数据库库存数据保持一致性 。
文章图片
下面测试演示
文章图片
初始化商品库存100 , 在测试一万并发量后 , 最终发现不会不会出现超卖问题 。 因为这里一万个并发 , 每个并发抢购10件商品 。 经过redis减库存之后 , 最后只会有10个线程去更新数据库 。
之前 , 给大家发过四份Java面试宝典 , 这次新增了更全面的资料 , 相信在跳槽前准备准备 , 基本没大问题 。
《java基础:设计模式等》(初中级)
《JVM:整理BAT最新题库》《并发编程》(中高级)
《分布式微服务架构》《架构|软技能》(资深)
《一线互联网公司面试指南》(资深)
学习视频包含深入运行时数据区、垃圾回收、详解类装载过程及类加载机制、手写Spring-IOC容器、redis入门到高性能缓存组件等等
推荐阅读
- 产业气象站|5G基站太耗电!三大运营商正式官宣:将智能化关闭5G基站节约电费
- 产业气象站|他从不打无准备之仗,华为联手哈工大究竟想干啥?依任总性格
- 产业气象站|G是否影响健康?,张朝阳用手机保持30厘米
- 爱集微APP|“芯”势力助推游戏产业发展,芯片成为ChinaJoy的关键词之一
- 产业气象站|电力机器人“小白”上岗巡检
- 产业气象站|苏宁智能宣布五项Biu+共享政策,从生态赋能到生态共享
- 产业气象站|点赞“中国芯里的南大智慧”!华为公司CEO任正非一行访问南京大学
- 产业气象站|花多少钱收购,微软正在谈判收购TikTok美国业务
- 产业气象站|包括王兴,马云创办支付宝的本质不是为了支付,很多人没理解
- 上观新闻|半导体产业如何发展?嘉定举办的这个论坛指明了方向