当前位置: 首页 > news >正文

北京专业做网站设计公司域名交易中心

北京专业做网站设计公司,域名交易中心,江西省做网站,百度做网站价格系列文章目录 一、SpringBoot连接MySQL数据库实例【tk.mybatis连接mysql数据库】 二、SpringBoot连接Redis与Redisson【代码】 三、SpringBoot整合WebSocket【代码】 四、使用redislua通过原子减解决超卖问题【示例】 五、SpringBoot整合Elasticsearch【代码示例】 文章目录 系…

系列文章目录

一、SpringBoot连接MySQL数据库实例【tk.mybatis连接mysql数据库】
二、SpringBoot连接Redis与Redisson【代码】
三、SpringBoot整合WebSocket【代码】
四、使用redis+lua通过原子减解决超卖问题【示例】
五、SpringBoot整合Elasticsearch【代码示例】

文章目录

  • 系列文章目录
  • 前言
  • 一、准备工作
  • 二、不使用Lua
  • 三、使用Lua


前言

超卖,即在并发的情况下,所售商品数量大于商品的库存数量。在并发量大的情况下,用户请求同时到达,对数据库进行操作,在没有采取相应的处理的情况时从而导致出现超卖现象。

一、准备工作

在redis中放入十件商品

在这里插入图片描述


二、不使用Lua

使用20个线程抢商品

public void test () {ExecutorService service = Executors.newFixedThreadPool(20);for (int i = 0; i < 20; i++) {int finalI = i;service.execute(new Runnable() {@Overridepublic void run() {if (Integer.parseInt(String.valueOf(redisUtils.get("test"))) > 0) {int execute = Integer.parseInt(String.valueOf(redisUtils.decr("test", 1)));if (execute != 0) {log.info("线程" + finalI + "抢到了商品!!!");} else {log.info("线程" + finalI + "未抢到商品");}} else {log.info("商品数量不足");}}});}
}

在这里插入图片描述
运行代码发现已经超出了十个人抢到了商品。
此时redis的存值已经变为了负数,出现了超卖的情况。

在这里插入图片描述


三、使用Lua

public void test_lua () {StringBuilder sb = new StringBuilder();sb.append("if (redis.call('exists', KEYS[1]) == 1) then");    // 判断key是否存在sb.append("    local stock = tonumber(redis.call('get', KEYS[1]));");   // 获取锁sb.append("    if (stock == -1) then");sb.append("        return 1;");sb.append("    end;");sb.append("    if (stock > 0) then");sb.append("        redis.call('decrby', KEYS[1], 1);");    // 商品数量减1sb.append("        return stock;");sb.append("    end;");sb.append("    return 0;");sb.append("end;");sb.append("return -1;");String STOCK_LUA = sb.toString();DefaultRedisScript<Long> objectDefaultRedisScript = new DefaultRedisScript<>();objectDefaultRedisScript.setScriptText(STOCK_LUA);objectDefaultRedisScript.setResultType(Long.class);ArrayList<String> keys = new ArrayList<>();     // 脚本中的KEYS参数keys.add("test");ExecutorService service = Executors.newFixedThreadPool(20);for (int i = 0; i < 20; i++) {int finalI = i;service.execute(new Runnable() {@Overridepublic void run() {int execute = Integer.parseInt(redisTemplate.execute(objectDefaultRedisScript, keys).toString());if (execute != 0) {log.info("线程" + finalI + "抢到了商品!!!");} else {log.info("线程" + finalI + "未抢到商品");}}});}
}

依然使用20个线程抢商品,运行代码只有10个线程抢到了商品
在这里插入图片描述
此时redis中的存值为0
在这里插入图片描述

http://www.ds6.com.cn/news/89797.html

相关文章:

  • wordpress建站 云打印百度云手机登录入口
  • t想学网站建设肇庆网站建设制作
  • 网站开发设计毕业论文做关键词推广
  • wordpress 导出html5商丘优化公司
  • 政府集约化网站群建设百度惠生活商家怎么入驻
  • 烟台中企动力提供网站建设网络营销心得体会1000字
  • 长春餐饮网站建设自助网站建设平台
  • 做兼职网站的项目初衷专门代写平台
  • 建站网站怎么上传代码重庆放心seo整站优化
  • 网站建设交接清单如何做好线上推广和引流
  • 专做新车分期的网站网站排名靠前的方法
  • 基于php网站开发环境360优化大师官方官网
  • 什么类型客户做网站网址注册查询
  • 网站购买正规网站建设服务
  • 泰安集团网站建设多少钱北京搜索引擎优化seo专员
  • 做阿里巴巴网站应怎样定位aso优化是什么意思
  • 做网站换域名怎么做电商创业
  • 网站关键词的分类杭州谷歌seo公司
  • 青海哪家做网站的公司最大同城推广平台
  • 德州公司做网站中国职业培训在线官网
  • 温州网络推广平台建设武汉seo优化公司
  • 长沙做网站设计指数基金排名前十名
  • 专业机械设计公司昆明seo排名外包
  • 网站备案 条例优化设计电子课本
  • 网站建设公司名seo课培训
  • 岳池县网站建设山西seo优化
  • 彩票网站代理怎么做域名推荐
  • 网站空间注册怎么做谷歌推广
  • 南京机关建设网站太原网络推广公司
  • 杭州做网站设计公司链接交换