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

网站推广平台排行网站推广公司 wordpress

网站推广平台排行,网站推广公司 wordpress,衡天 wordpress,网站开发技术 创新点引言 在分布式系统中,保证数据的一致性和避免竞争条件是至关重要的。分布式锁是一种常用的机制,而Redis作为一款高性能的内存数据库,提供了简单而强大的分布式锁方案。本文将深入探讨如何利用Redis高并发分布式锁来解决分布式系统中的并发控…

引言

在分布式系统中,保证数据的一致性和避免竞争条件是至关重要的。分布式锁是一种常用的机制,而Redis作为一款高性能的内存数据库,提供了简单而强大的分布式锁方案。本文将深入探讨如何利用Redis高并发分布式锁来解决分布式系统中的并发控制问题,并提供实战案例。

正常库存扣减代码

public void deductStock(){int stock = Integer.parseInt(redisTemplate.opsForValue().get("stock"));if(stock>0){stock = stock -1 ;redisTemplate.opsForValue().set("stock",stock+"");System.out.println("扣减成功,剩余库存:"+stock);}else {System.out.println("扣减失败,库存不足");}
}
//弊端:两个线程同时执行读取stock为50,然后各自-1 修改为49,实际应该50-2=48

代码调整后

public void deductStock(){synchronized (this){int stock = Integer.parseInt(redisTemplate.opsForValue().get("stock"));if(stock>0){stock = stock -1 ;redisTemplate.opsForValue().set("stock",stock+"");System.out.println("扣减成功,剩余库存:"+stock);}else {System.out.println("扣减失败,库存不足");}}
}
//弊端:适用于单体项目,如果该项目被部署两台服务器,两台服务器同时访问获取stock为50,然后各自-1 修改为49,实际应该50-2=48 也会存在上述问题,因为synchronized只能在当前项目下生效

redis的一个简单的分布式锁

public void deductStock(){String lockKey = "lockKey";try {Boolean result = redisTemplate.opsForValue().setIfAbsent("lockKey", "nuoyi",10, TimeUnit.SECONDS);if(!result){System.out.println("....");return ;}int stock = Integer.parseInt(redisTemplate.opsForValue().get("stock"));if(stock>0){stock = stock -1 ;redisTemplate.opsForValue().set("stock",stock+"");System.out.println("扣减成功,剩余库存:"+stock);}else {System.out.println("扣减失败,库存不足");}}catch (Exception e){e.printStackTrace();}finally {redisTemplate.delete("lockKey");}
}
//弊端:适用于访问量不高的系统  如果访问量非常的大,第一个a请求获取到锁 ,设置过期10s,执行业务需要15s,a业务执行10s后锁自动过期被第二个请求b拿到并执行业务,当b业务执行到第5s时,b的锁被a的请求给释放了,如此高并发循环,导致锁失效

优化上述redis的分布式锁解决不是自己的锁不释放
 

public void deductStock(){String lockKey = "lockKey";String clientId = UUID.randomUUID().toString();try {Boolean result = redisTemplate.opsForValue().setIfAbsent("lockKey", clientId,10, TimeUnit.SECONDS);if(!result){System.out.println("....");return ;}int stock = Integer.parseInt(redisTemplate.opsForValue().get("stock"));if(stock>0){stock = stock -1 ;redisTemplate.opsForValue().set("stock",stock+"");System.out.println("扣减成功,剩余库存:"+stock);}else {System.out.println("扣减失败,库存不足");}}catch (Exception e){e.printStackTrace();}finally {//不是自己的锁不删除if(clientId.equals(redisTemplate.opsForValue().get(lockKey))){redisTemplate.delete("lockKey");}}
}
//不是自己的锁不删除,但是这个只是解决了a请求删除b请求的锁,如果a请求15秒锁第十秒过期了,b请求就进来了还是会有问题,解决方案:给锁续命

 Redisson代码
 

private final Redisson redisson;public void deductStock(){String lockKey = "lockKey";RLock redissonLock = redisson.getLock(lockKey);//获取锁try {redissonLock.lock();//加锁及锁续命   默认锁失效30s  守护线程每10s续命一次int stock = Integer.parseInt(redisTemplate.opsForValue().get("stock"));if(stock>0){stock = stock -1 ;redisTemplate.opsForValue().set("stock",stock+"");System.out.println("扣减成功,剩余库存:"+stock);}else {System.out.println("扣减失败,库存不足");}}catch (Exception e){e.printStackTrace();}finally {redissonLock.unlock();//释放锁}
}
//三行代码即可满足获取锁、锁续命、释放锁,完美解决上述redis的释放锁及锁续命问题  redisson的底层还是redis,使用了大量的lua脚本,lua脚本支持原子性

redisson配置
 

@Bean
public Redisson redisson(){Config config = new Config();//useSingleServer 单机版config.useSingleServer().setAddress("redis://"+instance.getRedisHost()+":"+instance.getRedisPort()).setDatabase(instance.getRedisDataBase());return (Redisson)Redisson.create(config);
}


 

lua脚本语言:

  • 减少网络开销(批量操作)

  • 原子性

  • 替代redis的事务
     

为什么redis不常使用lua?

因为Redis是个单线程,如果lua有耗时运算或循环,Redis则阻塞,不会管其他的操作

通过学习本文,读者将深入了解Redis分布式锁的原理和实践应用。分布式锁在构建高并发、分布式系统中发挥着关键作用,正确使用和理解分布式锁是确保系统稳定性和可靠性的重要一环。希望本文能为读者提供有益的指导和实战经验。

http://www.yayakq.cn/news/589263/

相关文章:

  • 搜索引擎网站推广可以自己做吗计算机网站建设及管理
  • 禹城网站设计住建厅特种作业证全国通用吗
  • 网站建设公司倒闭wordpress 大前端 插件
  • 上海网站建设最好的公司温州网站建设公司哪个好
  • 重庆网站自己推广程序开发用什么笔记本
  • 域名注册好了如何做网站帝国cms做企业网站
  • 建设银行网站安全分析石岩网站建设公司
  • 山西有哪些做网站的公司wordpress主题 demo
  • 网店推广新技术网站网络优化
  • 网上智慧团建网站wordpress ftp设置方法
  • 代做网站公司织梦做的网站有点慢
  • 库尔勒网站佛山手工活外发加工网
  • 网站开发合作保密协议开发手机app多少钱
  • 国内网站空间推荐旅游型网站的建设背景图片
  • 合肥专业网站优化做网站用哪种编程语言
  • 做it的网站有哪些wordpress大文件
  • 知道ip域名如何进入网站阿里巴巴网站导航栏怎么做
  • 专业商城网站建设哪家便宜国内做网站网站风险大吗
  • 网站建设中需求分析说明书营销型网站建设项目需求表
  • 福州做网站fjfzwl电子商务网站建设大二实训
  • 建立网站需要多少钱一个商品详情页怎么制作
  • 网站空间 按流量计费网站semseo先做哪个
  • 网站建设主要问题天津网站定制公司
  • 济南环保行业网站开发wordpress主题学习
  • 网站开发前台开发胶州网站设计
  • 本地怎么做网站服务器吗爱链接
  • wordpress移动显示seo的基本步骤是什么
  • 临沂广润网站建设凡客和凡客诚品一样吗
  • 做网站什么前端框架方便西安专业网站开发联系电话
  • 搜索型网站wordpress 描述设为标题