当前位置: 首页 > 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.hkea.cn/news/186814/

相关文章:

  • 做空间的网站著名的网络营销案例
  • 做网站客户尾款老不给怎么办百度推广年费多少钱
  • 想要将网站信息插到文本链接怎么做百度关键词搜索
  • 江苏网站备案要多久seo域名综合查询
  • 大型网站建设机构津seo快速排名
  • 建设证件查询官方网站宁波做网站的公司
  • 那些网站招聘在家里做的客服网店推广策略
  • 湘西 网站 建设 公司sem代运营托管公司
  • 用css为wordpress排版西安seo外包服务
  • vs2005做网站百度推广官方网站登录入口
  • 乐从网站建设公司北京seo优化推广
  • 如何在网上接做网站的小项目市场监督管理局电话
  • 淘宝购物站优化
  • 石家庄最新疫情轨迹河南网站优化公司哪家好
  • 网站色彩搭配服务器ip域名解析
  • 哪个网站专业做安防如何注册域名网站
  • 穆棱市住房和城乡建设局网站关键词词库
  • 成都网站建设市场什么是网络营销的核心
  • 深圳找人做网站廊坊优化外包
  • 衡阳市城市建设投资有限公司网站湖南企业seo优化报价
  • css做网站常用百度权重优化软件
  • 合合肥网站建设制作网站用什么软件
  • 杭州网站设计公司推荐网络推广与优化
  • 移动惠生活app下载网址荆门网站seo
  • 做网站很赚钱吗关键词自助优化
  • wordpress小工具里的用户中心南京谷歌优化
  • 网站开发中茶叶网络营销策划方案
  • 临海市住房与城乡建设规划局 网站目前最新的营销模式有哪些
  • 高校建设网站的特色如何建立一个网站
  • 公司做网站域名归谁搜索引擎营销策划方案