Redis——商品秒杀之库存遗留问题

  • 简介
    • 库存遗留问题的起因
    • 库存遗留问题的原因分析
    • 库存遗留问题的解决方法
      • lua脚本
    • 总结

简介

这章将介绍什么是库存遗留的问题,为什么会产生库存遗留,以及如何解决库存遗留问题。

库存遗留问题的起因

当Redis做商品秒杀案例的时候,就会出现一个常见的问题,那就是出现超卖以及超时的问题,超卖简而言之就是在秒杀结束后所卖出的商品超过了原本所要被卖出的数量,就是说假如特价要卖出10件商品,但可能在高并发的秒杀场景下,卖出了11件甚至是更多的商品,使商品总数成为负数;而超时就是redis连接出现超时。这个时候就会用到乐观锁进行解决这两个问题,如下图所示。

使用乐观锁后就会出现一个新的问题,那就是——会产生库存遗留的问题

库存遗留问题的原因分析

官方的客观解释是说:利用乐观锁之所以出现库存遗留问题,是因为在高并发的情况下,如果有两千个人同时获取到V1.0版本的数据,然后同时提交的话,那么最终将只会有一个人修改成功,其余的一千九百九十九个人都会修改失败。

如果这种客观解释不太能理解的话,还有另一种理解的角度:乐观锁的Version版本变更并不是完全的、绝对的具备原子性,换言之,也就是说当一个人获取了版本号并且修改数据时,由于高并发的原因,在版本未变更之前,有许多请求都获取到了这个Version版本,所以导致了当前结果的发生。

库存遗留问题的解决方法

这个时候我们就需要用到lua脚本进行解决这个库存遗留的问题。lua脚本是一个类似于redis事务,具有一定的原子性的脚本,在原来用于游戏的简单外挂、插件等等功能。
lua脚本在Redis中的优势:

lua脚本

local userid=KEYS[1];
local prodid=KEYS[2];
local qtkey="sk:"..prodid..":qt";
local userskey="sk:"..prodid..":user";
local userExists=redis.call("sismember",userskey,userid);
if tonumber(userExists)==1 thenreturn 2;
end
local num=redis.call("get",qtkey);
if tonumber(num)<=0 thenreturn 0;
elseredis.call("decr",qtkey);redis.call("sadd",userskey,userid);endreturn 1

此脚本的逻辑和乐观锁的实现基本是一样的。
1.首先判断当前用户userid是否存在,如果存在返回2;
2.判断库存是否存在,如果库存小于等于0,则返回0;
3.执行扣减库存和淘汰用户的命令。

关键代码实现:

总结

库存遗留问题是一个十分常见的问题,要掌握这种lua脚本方法的使用。

Redis——商品秒杀之库存遗留问题相关推荐

  1. java redis 商品秒杀_redis编写lua脚本实现商品秒杀

    编写lua脚本 --是否秒杀 local hasBuy = redis.call('sismember',KEYS[1],ARGV[1]) if hasBuy~=0 then return 0; en ...

  2. java redis 商品秒杀_使用redis秒杀出现产品超发现象求解?

    亲测,用ab 压测并发500 请求4000 无超卖! header("content-type:text/html;charset=utf-8"); $redis = new re ...

  3. Redis | 26.Redis事务案例 - 秒杀 - 库存遗留问题

    文章目录 0.前言 1.何为库存遗留问题? 2.解决方案 0.前言 参考视频:27-尚硅谷-Redis6-事务和锁机制-秒杀案例-库存遗留问题 1.何为库存遗留问题? 假设商品库存100件,在上一期使 ...

  4. redisdemo php,一个简单的用redis做秒杀支撑的demo (PHP版)

    用redis做秒杀的库存扣除, 限制每个账号只能抢购一次, 这个简单的demo使用了string, hash, list三种基本类型. 用string类型的int值来存储剩余库存, 并在抢购成功后减1 ...

  5. Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:涛哥谈篮球 来源:toutiao.com/i68366119 ...

  6. redis如何解决秒杀超卖java_Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了...

    作者:涛哥谈篮球 来源:toutiao.com/i6836611989607809548 问题描述 在众多抢购活动中,在有限的商品数量的限制下如何保证抢购到商品的用户数不能大于商品数量,也就是不能出现 ...

  7. 【Java秒杀方案】11.功能开发-【商品秒杀及优化】防止超卖 接口优化(redis预减库存,内存标记减少redis访问,RabbitMQ异步下单) 安全优化(隐藏秒杀接口,验证码,接口防刷)

    商品秒杀核心功能及优化 1. 正常秒杀流程 在商品详情页面等待秒杀倒计时–http://localhost:8080/goodsDetail.htm?goodsId=2 倒计时为0,开始秒杀,点[秒杀 ...

  8. gin redis 链接不上_php + redis 高并发商品秒杀 完整业务模拟流程 实现方案

    关于商品秒杀 之前百度了很多关于商品秒杀的业务怎么做,网上的答案真的是五花八门,归纳一下就两种方式 队列或计数器 网上大部分都没有写具体的代码业务 我这里模拟一个业务小场景进行实践 商品:1 每日限量 ...

  9. .NetCore+Jexus代理+Redis模拟秒杀商品活动

    开篇叙 ,顺手点个推荐也不错: a. 秒杀流程 b. 封装StackExchange.Redis的使用类 c. Ubuntu16.04上使用Jexus搭建代理完成分布式部署 d. NetCore写实时 ...

最新文章

  1. delphi7升级delphi2007可以互用马_奶爸带娃玩“升级版摇摇马”火了,像极了传说中的“甘为孺子牛”...
  2. easyui 转换 html5,easyUI Tabs
  3. java解决特殊字符输出
  4. Cause: org.postgresql.util.PSQLException: ERROR: column province_id does not exist
  5. 【汇编】汇编学习入门-系列更新20180705
  6. profile 安卓work_androidWorkProfileGeneralDeviceConfiguration 资源类型
  7. 脚本输出当前 “yyyy-MM-dd WeakDay Festval”
  8. python中的内建函数
  9. VNC 远程控制工具软件
  10. 一个@Transaction哪里来这么多坑?
  11. linux管理员权限命令_每个系统管理员应该知道的20个Linux命令
  12. java addall 不能传null_null 之AddAll、Add和Boolean
  13. 【Spring Boot 实战】数据库千万级分库分表和读写分离实战
  14. 利用遗传算法求解旅行商问题
  15. NCC2105关于分管领导审批流设置另一方法
  16. 软件安全测试是为了什么,一航软件测评有这些见解
  17. vmware使用教程
  18. 萝卜青菜各有所爱------htm 与 html
  19. mysql容灾方案_mysql 容灾 灾备 备份
  20. 交易开拓者-附录一:计算公式

热门文章

  1. linux内核入口函数start_kernal
  2. 医护管理平台系统服务器,康软智能移动医护管理系统
  3. docker的安装以及加速器的配置
  4. 现提供“威力导演10极致版(多国语言含中文)+ 有效激活方法如下——
  5. 知识图谱推理问题总结
  6. ZOJ--3778--Talented Chef--数学智力题
  7. [pytest]夹具使用注意事项
  8. 炫酷的console
  9. access内置函数:(适用access2000)-…
  10. js实现手机拨号功能