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

discuz网站模板下载器抄袭网站案例

discuz网站模板下载器,抄袭网站案例,艺术字体在线生成器转换器,wordpress二级导航2023.12.10 集群模式下的并发安全问题及解决 随着现在分布式系统越来越普及#xff0c;一个应用往往会部署在多台机器上#xff08;多节点#xff09;#xff0c;通过加锁可以解决在单机情况下的一人一单安全问题#xff0c;但是在集群模式下就不行了。见下图#xff1a…2023.12.10 集群模式下的并发安全问题及解决 随着现在分布式系统越来越普及一个应用往往会部署在多台机器上多节点通过加锁可以解决在单机情况下的一人一单安全问题但是在集群模式下就不行了。见下图 多台服务器会对应多个jvm synchronized锁可以锁住单台服务器的多线程多台服务器就锁不住了所以我们需要有一个多服务器共享的锁监视器这里就需要使用到分布式锁了这里我们使用redis的SETNX这个方法来实现。  流程图如下 首先定义一个锁的接口并实现它 public interface ILock {/*** 尝试获取锁* param timeoutSec 锁持有的超时时间过期后自动释放* return true代表获取锁成功; false代表获取锁失败*/boolean tryLock(long timeoutSec);/*** 释放锁*/void unlock(); } public class SimpleRedisLock implements ILock{private String name;private StringRedisTemplate stringRedisTemplate;public SimpleRedisLock(String name, StringRedisTemplate stringRedisTemplate) {this.name name;this.stringRedisTemplate stringRedisTemplate;}private static final String KEY_PREFIX lock:;Overridepublic boolean tryLock(long timeoutSec) {//获取线程标识long threadId Thread.currentThread().getId();//获取锁Boolean success stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX name,threadId ,timeoutSec, TimeUnit.SECONDS);return Boolean.TRUE.equals(success);//防止拆箱的时候出现空指针异常}Overridepublic void unlock() {//释放锁stringRedisTemplate.delete(KEY_PREFIX name);} } 再修改业务代码 Overridepublic Result seckillVoucher(Long voucherId) {//1.查询优惠券SeckillVoucher voucher seckillVoucherService.getById(voucherId);//2.判断秒杀活动是否开始if(voucher.getBeginTime().isAfter(LocalDateTime.now())){//尚未开始return Result.fail(秒杀尚未开始);}//3.判断秒杀活动是否已经结束if(voucher.getEndTime().isBefore(LocalDateTime.now())){//尚未开始return Result.fail(秒杀已经结束);}//4.判断库存是否充足if(voucher.getStock() 1){return Result.fail(库存不足);}//此处需要将整个函数锁起来Long userId UserHolder.getUser().getId();//创建锁对象SimpleRedisLock lock new SimpleRedisLock(order: userId, stringRedisTemplate);//获取锁boolean isLock lock.tryLock(1200);//判断是否获取锁成功if(!isLock){//获取锁失败不能让黄牛不断重复所以直接返回失败return Result.fail(不允许重复下单!);}//获取锁成功try {//获取代理对象IVoucherOrderService proxy (IVoucherOrderService) AopContext.currentProxy();return proxy.createVoucherOrder(voucherId);} finally {//释放锁lock.unlock();} 再使用jmeter多台服务器进行测试集群模式下的并发安全问题得到解决。 redis分布式锁误删问题及解决 考虑一种情况假设线程1获取了分布式锁然后业务阻塞了阻塞的时间超过了redis中锁的超时时间redis将锁释放了。这时线程2就顺利获取了该锁并执行它的业务。此时线程1苏醒了并执行完自己的业务于是释放锁此时释放的锁是线程2刚刚获取的锁意味着此时其他线程也可以获取锁进来了这就又出现了并发安全问题了。 核心原因就在于线程1在释放锁之前没有判断一下这把锁是不是自己之前获取的锁导致误删了其他线程的锁。 解决办法就是在获取锁的时候存入线程标识用UUID标识在一个JVM中ThreadId一般不会重复但是我们现在是集群模式有多个JVM多个JVM之间可能会出现ThreadId重复的情况在释放锁的时候先获取锁的线程标识判断是否与当前线程标识一致如果一致则允许释放。 流程图改为 需要修改SimpleRedisLock.java代码 public class SimpleRedisLock implements ILock{private String name;private StringRedisTemplate stringRedisTemplate;public SimpleRedisLock(String name, StringRedisTemplate stringRedisTemplate) {this.name name;this.stringRedisTemplate stringRedisTemplate;}private static final String KEY_PREFIX lock:;private static final String ID_PREFIX UUID.randomUUID().toString(true) -;Overridepublic boolean tryLock(long timeoutSec) {//获取线程标识String threadId ID_PREFIX Thread.currentThread().getId();//获取锁Boolean success stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX name,threadId,timeoutSec, TimeUnit.SECONDS);return Boolean.TRUE.equals(success);//防止拆箱的时候出现空指针异常}Overridepublic void unlock() {//获取线程标示String threadId ID_PREFIX Thread.currentThread().getId();//获取锁中的标示String id stringRedisTemplate.opsForValue().get(KEY_PREFIX name);//判断标示是否一致if(threadId.equals(id)) {//释放锁stringRedisTemplate.delete(KEY_PREFIX name);}} } 分布式锁的原子性问题及解决 然而上述解决方案在极端情况下还有问题当线程1在判断完锁的标示之后准备释放锁之前如果出现阻塞的话(由于jvm的垃圾回收机制等原因)redis的超时时间到了将锁释放掉其他线程又可以获取锁了则又会出现和上述一样的情况线程1会将其他线程的锁误释放掉。 产生此问题的核心原因就在于判断锁标示和释放锁这两个操作不具有原子性。 导致在这期间又有可能出现并发安全问题。 这里我们使用Lua脚本解决多条命令原子性问题。Redis提供了Lua脚本功能在一个脚本中编写多条Redis命令确保多条命令执行时的原子性。 编写lua脚本 --比较线程标示与锁中的标示是否一致 if(redis.call(get,KEYS[1]) ARGY[1]) then--释放锁return redis.call(del,KEYS[1]) end return 0 调用lua脚本 Overridepublic void unlock() {//调用lua脚本stringRedisTemplate.execute(UNLOCK_SCRIPT,Collections.singletonList(KEY_PREFIX name),ID_PREFIX Thread.currentThread().getId());} 这样判断和释放操作就具有原子性了。
http://www.zqtcl.cn/news/787284/

相关文章:

  • wordpress 代码模块昆明seo和网络推广
  • 匈牙利网站后缀沛县做网站xlec
  • 企业网站建设的成本国内做网站建设最好的公司是
  • 威海做企业网站云南建筑工程网
  • 旅游网站建设报价网站空间管理信息
  • app展示网站手机端app开发公司
  • 在湖南建设人力资源网站wordpress widget
  • 英文网站建站山东做网站用虚拟主机还是服务器
  • 网站设计佛山顺德投资公司注册条件和要求
  • 肇庆网站优化建设淄博网站建设优惠臻动传媒
  • 电子商务网站模板 html服装网站栏目调研
  • 抚州市做棋牌网站邯郸信息港聊天室
  • 李静做的化妆品网站树莓派lamp WordPress
  • 建站之星网站建设系统个人网站有什么外国广告做
  • 残联网站建设概况专业产品画册设计公司
  • 德尔普的网站建设的价格windows2008做网站
  • 画品展现手机网站短网址生成器有哪些
  • 如何做好网站推广营销网站 需求
  • 济宁做网站大约多少钱做设计兼职的网站有哪些
  • 教务系统网站开发方法网站建设在哪里
  • 房产网站如何做手机在网上怎么创建自己的网站
  • 金华网站建设luopan公司网站模板图片
  • 建个购物网站网站建设公司合同
  • 建设银行企业版网站网站里的动态是如何制作
  • 360网站建设的目标是什么微信哪个公司开发
  • c++可以做网站吗极验 wordpress 表单
  • 电脑做系统都是英文选哪个网站找外贸客户的联系方式软件
  • 商城网站建设咨询建工社官网
  • 国土资源局网站建设制度蓝牙 技术支持 东莞网站建设
  • 12380网站建设建议上海网站推广服务