在高并发的情况下,利用redis来处理库存超卖和遗留问题

首先现在redis中放上商品的库存数量为100间商品,在初始化一个set集合用于放秒杀成功的用户id,本用例先放进去一个id=10000的用户。

 @RequestMapping("skill")@ResponseBodypublic String kill(HttpServletRequest request){String userId=new Random().nextInt(50000)+"";String productId="0101";boolean b=doSkill(productId,userId);return "";}private boolean doSkill(String productId, String userId) {Jedis jedis = redisUtil.getJedis();String kcKey="Seckill:"+productId+":kc";String userKey="Seckill:"+productId+":user";String s    = jedis.get(kcKey);if (null==s){System.out.println("秒杀还么开始");jedis.close();return false;}//秒杀已经成功不能再次秒杀if (jedis.sismember(userKey,userId)){System.out.println("秒杀已经成功不能再次秒杀");jedis.close();return false;}if (Integer.parseInt(s)<=0){System.out.println("秒杀结束");jedis.close();return false;}//减库存,家人jedis.decr(kcKey);jedis.sadd(userKey,userId);jedis.close();return true;}

下面进行压力测试(使用ab工具,具体可百度,不在此做详细说明):

从上图结果看明显超卖了。

下面解决超卖:主要加事务,更改两处代码

下图显示redis的数据明显没有超卖,但是会有库存遗留,本次数据量和并发量小才没有。

解决库存遗留:lua脚本解决

把库存容量加到200,再次请求结果如下图,明显出现了库存遗留

简单介绍下lua脚本:它类似于redis的事务具有一定的原子性,不会被其他命令插队,可以完成一些redis的事务的工作。

注意:redis的版本在2.6及以上的版本

 private void doSkillByScript(String uid,String prodid){Jedis jedis = redisUtil.getJedis();String secKillScript ="local userid=KEYS[1];\r\n" +"local prodid=KEYS[2];\r\n" +"local qtkey='Seckill:'..prodid..\":kc\";\r\n" +"local usersKey='Seckill:'..prodid..\":user\";\r\n" +"local userExists=redis.call(\"sismember\",usersKey,userid);\r\n" +"if tonumber(userExists)==1 then \r\n" +"   return 2;\r\n" +"end\r\n" +"local num= redis.call(\"get\" ,qtkey);\r\n" +"if tonumber(num)<=0 then \r\n" +"   return 0;\r\n" +"else \r\n" +"   redis.call(\"decr\",qtkey);\r\n" +"   redis.call(\"sadd\",usersKey,userid);\r\n" +"end\r\n" +"return 1" ;/*    String sha1=  jedis.scriptLoad(secKillScript);Object result= jedis.evalsha(sha1, 2, uid,prodid);*/Object result = jedis.eval(secKillScript, 2, uid, prodid);String reString=String.valueOf(result);if ("0".equals( reString )  ) {System.err.println("已抢空!!");}else if("1".equals( reString )  )  {System.out.println("抢购成功!!!!");}else if("2".equals( reString )  )  {System.err.println("该用户已抢过!!");}else{System.err.println("抢购异常!!");}jedis.close();}

在高并发的情况下,利用redis来处理库存超卖和遗留问题相关推荐

  1. 在高并发分布式情况下生成唯一标识id

    做项目的时候经常会用id作为唯一标识. 但是当有这样一个需求出现的时候:工程分布式部署,要求抗住高并发.并且生成的id是根据时间自增的.解决这个问题有很多种方法,但是要选择一个性价比比较高的策略比较不 ...

  2. java异步处理_SpringBoot异步开发之异步请求,在高并发的情况下,提高性能

    何为异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果一个请求需要进行IO操作,比如 ...

  3. 记录一次并发情况下的redis导致服务假死的问题

    问题描述 最近项目在做性能压测,框架使用的是 spring boot 2.1.2 + jedis 2.9.1,80个并发持续压测4-5分钟服务就假死,所有的请求就pending,查看服务日志没有任何异 ...

  4. MySql(15)——Mysql在高并发情况下,防止库存超卖而小于0的解决方案

    本人上次做申领campaign的PHP后台时,因为项目上线后某些时段同时申领的人过多,导致一些专柜的存货为负数(<0),还好并发量不是特别大,只存在于小部分专柜而且一般都是-1的状况,没有造成特 ...

  5. 在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?

    在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执 ...

  6. Mysql在高并发情况下,防止库存超卖而小于0的解决方案

    背景: 本人上次做申领campaign的PHP后台时,因为项目上线后某些时段同时申领的人过多,导致一些专柜的存货为负数(<0),还好并发量不是特别大,只存在于小部分专柜而且一般都是-1的状况,没 ...

  7. java唯一订单号_java web在高并发和分布式下实现订单号生成唯一的解决方案

    方案一: 如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间戳正常不同,因此用时间戳+随机数(或自增数)就可以区分各个订单.如果存在并发,且订单号是由一个进程中的多个 ...

  8. ArrayList问题之高并发多线程环境下会出现内部成员会出现null

    问题描述 最近在做飞机大战游戏,发现一个问题,就是游戏运行了一定时间后会停止,同时eclipse会报出空指针异常. 为此,我针对性地在 遍历list列表并取出列表元素 的for循环中输出每个对象,发现 ...

  9. mysql处理高并发,防止库存超卖

    参考:http://blog.csdn.net/caomiao2006/article/details/38568825 今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年 ...

最新文章

  1. DeeplyTough | 学习蛋白质结合位点的结构比较
  2. python最新版本-Python 3.8 已发布 现在是切换至新版本的好时机吗?
  3. Eclipse中新建jsp文件访问页面时乱码问题
  4. linux查找文件命令 要查找包含某字符
  5. python代码模板_python 代码模板
  6. jqgrid删除某一列(隐藏)
  7. LeetCode-1004:最大连续1的个数 III
  8. [小工具] 文本形式转储二进制
  9. java 主流算法_java常用算法
  10. php包含大马执行,分析一个常见的php大马并且解码过程
  11. nadcházející basketbalové boty velkoobchodní další
  12. matlab由自相关函数求功率谱密度,转:matlab求功率谱密度代码实例
  13. Myeclipse10怎么找到 Servers
  14. Android股票app模拟同花顺,适合练手的Android项目
  15. Python经典编程习题100例:第20例:落体反弹问题
  16. 达梦|我和达梦不打不相识的故事
  17. matlab 梯度图像,快速计算matlab中图像的梯度
  18. upload-labs前三关详解
  19. 开源的「变」与「恒」:七大开源基金会负责人尖峰对谈
  20. 考博英语题型及难度分析

热门文章

  1. html5+canvas+javascript开发打灰机小游戏
  2. 一款赛丽麦进销存软件V0.99-9已开源,永久免费,Mysql数据库
  3. linux看剩余电量命令,用Linux命令行检测笔记本电池用量
  4. 全错位排列 配对概率问题
  5. 几种常见的传统汽车总线传输通信技术
  6. [转载]威力导演14旗舰破解版(中文简体)|取消30天限制CyberLinknb
  7. 超频温度测试软件,超频和温度测试及总结:
  8. How project description length and expected duration affect bidding and project success 论文笔记
  9. 6、react 模块和组件
  10. 企业网站推广有效方法