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

虚拟主机 两个网站葫芦岛市城乡建设局网站

虚拟主机 两个网站,葫芦岛市城乡建设局网站,文化馆网站建设,织梦网站程序安装引言 在分布式系统中,保证数据的一致性和避免竞争条件是至关重要的。分布式锁是一种常用的机制,而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/328383/

相关文章:

  • 怎样做网站推广啊抖音网站建设 用英语
  • 用word文档做网站在源码之家下载的网站模板可以作为自己的网站吗
  • 网站开发所需要的时间 知乎海外网络推广方案
  • 江苏纬信网站建设滕州个人兼职做网站
  • 深圳市鸿运通网站建设龙岗网站制作培训班
  • 阿里云建设网站好不好山东展厅设计公司
  • 公众号微网站制作淘宝网站咋做
  • 网站制作软件平台wordpress如何去除页眉部分
  • 打开网站门户网址
  • 长清做网站公司中国设计网站排行榜前十名
  • 帝国cms如何做网站地图深圳集团网站建设企业
  • 企业产品做哪个网站推广好中交路桥建设有限公司电话
  • 网站seo优化公司英文网站推广方法
  • 姓氏网站建设的意见和建议版面设计图大全 模板
  • 丰都县网站专业郑州企业网站建设
  • 唐山哪个公司做网站网站建设得步骤
  • 安徽省交通建设股份有限公司网站如果在网站做推广连接
  • 网站改版需要重新备案吗无锡做网站优化价格
  • 广告策划书案例完整版站长工具seo综合查询是什么意思
  • 做电影网站用什么空间wordpress 全文检索
  • 云南省新农村建设网站做网站网站建设专业公司哪家好
  • 汕头站扩建有连接华东线吗wordpress所有文章新窗口打开
  • 厦门服装商城网站建设中企动力是干什么的
  • 百姓网网站源码手机app注册免费下载
  • 苏州做网站费用中国建筑材料网
  • 网站设计开发中的具体步骤上海互联网企业50强
  • 手机网站酷站家装博览会2023
  • 建设银行找招聘网站免费算命免费 生辰八字
  • 做一个人网站需要注意什么网站设计需求表
  • 嘉兴网站快照优化公司邵东网页定制