redisTemplate分布式锁演变、redission分布式锁实现

if (StringUtils.isEmpty(catalogJson)) {

System.out.println(“缓存不命中,准备查询数据库。。。”);

Map<String, List> categoriesDb= getCategoriesDb();

String toJSONString = JSON.toJSONString(categoriesDb);

ops.set(“catalogJson”, toJSONString);

return categoriesDb;

}

System.out.println(“缓存命中。。。。”);

Map<String, List> listMap = JSON.parseObject(catalogJson, new TypeReference<Map<String, List>>() {});

return listMap;

}

问题: setnx占好了位,业务代码异常或者程序在页面过程中宕机。没有执行删除锁逻辑,这就造成了死锁

解决: 设置锁的自动过期,即使没有删除,会自动删除

阶段二

===

redisTemplate分布式锁演变、redission分布式锁实现

public Map<String, List> getCatalogJsonDbWithRedisLock() {

Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent(“lock”, “111”);

if (lock) {

//设置过期时间

stringRedisTemplate.expire(“lock”, 30, TimeUnit.SECONDS);

Map<String, List> categoriesDb = getCategoryMap();

stringRedisTemplate.delete(“lock”);

return categoriesDb;

}else {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

return getCatalogJsonDbWithRedisLock();

}

}

问题: setnx设置好,正要去设置过期时间,宕机。又死锁了。

解决: 设置过期时间和占位必须是原子的。redis支持使用setnx ex命令

阶段三

===

redisTemplate分布式锁演变、redission分布式锁实现

public Map<String, List> getCatalogJsonDbWithRedisLock() {

//加锁的同时设置过期时间,二者是原子性操作

Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent(“lock”, “1111”,5, TimeUnit.SECONDS);

if (lock) {

Map<String, List> categoriesDb = getCategoryMap();

//模拟超长的业务执行时间

try {

Thread.sleep(6000);

} catch (InterruptedException e) {

e.printStackTrace();

}

stringRedisTemplate.delete(“lock”);

return categoriesDb;

}else {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

return getCatalogJsonDbWithRedisLock();

}

}

问题: 删除锁直接删除???如果由于业务时间很长,锁自己过期了,我们直接删除,有可能把别人正在持有的锁删除了。

解决: 占锁的时候,值指定为uuid,每个人匹配是自己的锁才删除。

阶段四

===

redisTemplate分布式锁演变、redission分布式锁实现

public Map<String, List> getCatalogJsonDbWithRedisLock() {

String uuid = UUID.randomUUID().toString();

ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();

//为当前锁设置唯一的uuid,只有当uuid相同时才会进行删除锁的操作

Boolean lock = ops.setIfAbsent(“lock”, uuid,5, TimeUnit.SECONDS);

if (lock) {

Map<String, List> categoriesDb = getCategoryMap();

String lockValue = ops.get(“lock”);

if (lockValue.equals(uuid)) {

try {

Thread.sleep(6000);

} catch (InterruptedException e) {

e.printStackTrace();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习

已经将知识体系整理好(源码,笔记,PPT,学习视频)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

[外链图片转存中…(img-xTexhQsX-1712185386775)]

[外链图片转存中…(img-14Z7NsIM-1712185386775)]

[外链图片转存中…(img-2vnEVTHx-1712185386775)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Redis分布式锁Redission都是解决高并发中分布式锁的问题的方法。Redis分布式锁是通过使用K-V存储来判断是否拥有锁,避免了释放他人的锁的问题。当业务没有执行完毕但是锁已经过期时,可以采用守护线程的方式来定期检查锁是否过期,并延长锁的过期时间,也就是锁的续期机制。而Redission是一种实现分布式锁的解决方案,它首先获取锁,然后尝试加锁,加锁成功后执行业务逻辑,最后释放锁。Redission解决了Redis实现分布式锁中的锁过期和释放他人锁的问题,通过内部机制和看门狗机制来保证锁的有效性。然而,RedissionRedis主从架构下存在高一致性问题,解决高一致性问题可以使用红锁或者zk锁,但这可能会牺牲高可用性。总的来说,Redis分布式锁Redission都是解决高并发中分布式锁的方法,但需要根据具体情况选择合适的方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [RedisRedission两种方式实现分布锁](https://blog.csdn.net/weixin_45150104/article/details/125131846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值