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

黄岛区做网站的软件库合集软件资料链接

黄岛区做网站的,软件库合集软件资料链接,六安网站建设六安,什么叫网站开发转#xff1a;https://segmentfault.com/a/1190000011421467 废话不多说#xff0c;首先分享一个业务场景-抢购。一个典型的高并发问题#xff0c;所需的最关键字段就是库存#xff0c;在高并发的情况下每次都去数据库查询显然是不合适的#xff0c;因此把库存信息存入Red… 转https://segmentfault.com/a/1190000011421467 废话不多说首先分享一个业务场景-抢购。一个典型的高并发问题所需的最关键字段就是库存在高并发的情况下每次都去数据库查询显然是不合适的因此把库存信息存入Redis中利用redis的锁机制来控制并发访问是一个不错的解决方案。 首先是一段业务代码 Transactional public void orderProductMockDiffUser(String productId){//1.查库存int stockNum stock.get(productId);if(stocknum 0){throw new SellException(ProductStatusEnum.STOCK_EMPTY);//这里抛出的异常要是运行时异常否则无法进行数据回滚这也是spring中比较基础的 }else{//2.下单orders.put(KeyUtil.genUniqueKey(),productId);//生成随机用户id模拟高并发sotckNum stockNum-1;try{Thread.sleep(100);} catch (InterruptedExcption e){e.printStackTrace();}stock.put(productId,stockNum);} } 这里有一种比较简单的解决方案就是synchronized关键字。 public synchronized void orderProductMockDiffUser(String productId) 这就是java自带的一种锁机制简单的对函数加锁和释放锁。但问题是这个实在是太慢了感兴趣的可以可以写个接口用apache ab压测一下。 ab -n 500 -c 100 http://localhost:8080/xxxxxxx 下面就是redis分布式锁的解决方法。首先要了解两个redis指令SETNX 和 GETSET可以在redis中文网上找到详细的介绍。SETNX就是set if not exist的缩写如果不存在就返回保存value并返回1如果存在就返回0。GETSET其实就是两个指令GET和SET首先会GET到当前key的值并返回然后在设置当前Key为要设置Value。 首先我们先新建一个RedisLock类 Slf4j Component public class RedisService {Autowiredprivate StringRedisTemplate stringRedisTemplate;/**** 加锁* param key* param value 当前时间超时时间* return 锁住返回true*/public boolean lock(String key,String value){if(stringRedisTemplate.opsForValue().setIfAbsent(key,value)){//setNX 返回booleanreturn true;}//如果锁超时 ***String currentValue stringRedisTemplate.opsForValue().get(key);if(!StringUtils.isEmpty(currentValue) Long.parseLong(currentValue)System.currentTimeMillis()){//获取上一个锁的时间String oldvalue stringRedisTemplate.opsForValue().getAndSet(key,value);if(!StringUtils.isEmpty(oldvalue)oldvalue.equals(currentValue)){return true;}}return false;}/**** 解锁* param key* param value* return*/public void unlock(String key,String value){try {String currentValue stringRedisTemplate.opsForValue().get(key);if(!StringUtils.isEmpty(currentValue)currentValue.equals(value)){stringRedisTemplate.opsForValue().getOperations().delete(key);}} catch (Exception e) {log.error(解锁异常);}} } 这个项目是springboot的项目。首先要加入redis的pom依赖该类只有两个功能加锁和解锁解锁比较简单就是删除当前key的键值对。我们主要来说一说加锁这个功能。首先锁的value值是当前时间加上过期时间的时间戳Long类型。首先看到用setiFAbsent方法也就是对应的SETNX在没有线程获得锁的情况下可以直接拿到锁并返回true也就是加锁最后没有获得锁的线程会返回false。 最重要的是中间对于锁超时的处理如果没有这段代码当秒杀方法发生异常的时候后续的线程都无法得到锁也就陷入了一个死锁的情况。我们可以假设CurrentValue为A并且在执行过程中抛出了异常这时进入了两个value为B的线程来争夺这个锁也就是走到了注释*的地方。currentValueA这时某一个线程执行到了getAndSet(key,value)函数(某一时刻一定只有一个线程执行这个方法其他要等待)。这时oldvalue也就是之前的value等于A在方法执行过后oldvalue会被设置为当前的value也就是B。这时继续执行由于oldValuecurrentValue所以该线程获取到锁。而另一个线程获取的oldvalue是B而currentValue是A所以他就获取不到锁啦。多线程还是有些乱的需要好好想一想。接下来就是在业务代码中加锁啦首要要Autowired注入刚刚RedisLock类不要忘记对这个类加一个Component注解否则无法注入 private static final int TIMEOUT 10*1000; Transactional public void orderProductMockDiffUser(String productId){long time System.currentTimeMillions()TIMEOUT;if(!redislock.lock(productId,String.valueOf(time)){throw new SellException(101,换个姿势再试试)}//1.查库存int stockNum stock.get(productId);if(stocknum 0){throw new SellException(ProductStatusEnum.STOCK_EMPTY);//这里抛出的异常要是运行时异常否则无法进行数据回滚这也是spring中比较基础的 }else{//2.下单orders.put(KeyUtil.genUniqueKey(),productId);//生成随机用户id模拟高并发sotckNum stockNum-1;try{Thread.sleep(100);} catch (InterruptedExcption e){e.printStackTrace();}stock.put(productId,stockNum);}redisLock.unlock(productId,String.valueOf(time)); } 大功告成了比synchronized快了不知道多少倍再也不会被老板骂了! 转载于:https://www.cnblogs.com/duende99/p/11553745.html
http://www.zqtcl.cn/news/573068/

相关文章:

  • 重庆手机网站推广定做net创建网站之后怎么做
  • 网站仿静态做it的兼职网站
  • 建站用wordpress好吗hui怎么做网站
  • 从用户旅程角度做网站分析做网站还是做淘宝
  • 妇科医院网站优化服务商品牌型网站设计推荐
  • 西安网站制作排名网站建设对企业的帮助
  • lamp网站开发 pdf纯html5 网站
  • 白云区同和网站建设购物网站怎么建立
  • 公司制作网站需要espcms易思企业网站管理系统
  • 开发一个网站需要哪些步骤广西建设主管部门网站
  • 网站建设培训西安制作微信小程序开发
  • delphi 做直播网站wordpress 商务
  • 各大网站的软文怎么做wordpress教程菜鸟教程
  • 破解php网站后台账号密码wordpress二维码 插件下载
  • 石家庄哪里可以做网站做网站用的pm是啥
  • 租服务器网站有趣的设计网站
  • 建设部监理网站官网信阳市两学一做网站
  • 网站被攻击会影响收录么微信网站 影楼
  • 社区网站开发search搜索引擎
  • 章丘做网站哪家强原阳网站建设
  • 做网站前期构架图中国建设银行手机银行网站
  • tp5企业网站开发百度云青岛vi设计公司
  • 网站建设实验原理建站之星 discuz
  • 购物网站如何备案建设部施工合同范本
  • 网站模板安装建站之星凡客
  • 有没有电脑做兼职的网站吗网站和域名区别
  • 免费html网页模板素材网站修改wordpress后台登陆
  • 男女做啊免费视频网站网站做全景图
  • 网站域名 安全网站开发语言一般是用什么
  • 麦包包的网站建设分析网站开发一般要用到哪些软件有哪些