redis分布式锁实现与种种问题解析(Java版)升级版redisson的使用与介绍

本文深入探讨了Redis分布式锁的实现,从简易版到解决各种问题的升级版,包括自动解锁、UUID标识和Lua脚本确保原子性。最后介绍了Redisson的分布式方案,如ReadWriteLock和Semaphore,为Java开发者提供了实用的分布式解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis分布式锁:

默认大家都对redis有了解~安装类使用之类的问题就直接跳过了。
先讲讲分布式锁的使用场景:
应用场景在分布式集群的环境中,一个服务的莫个缓存资源过期时,就有多个请求访问同一个资源 然后进行Db的查询,这时只能放一个请求过去减少对持久层数据库的压力,一个请求占到这个坑其他的请求就只能在外面等待,等待一段时间后可以再次来占坑,业务执行后,释放锁,那么其他请求在有需求查询数据库的时候就可以来占这个坑。

在这里插入图片描述

简易版:

使用的是redis的setnx(“lock”,“111”)
对应java的方法redisTemplate.opsForValue().setIfAbsent(“lock”, “111”)

  public Map<String, List<Catelog2Vo>> gtCatalogJsonFromDbWithRedisLock() {
   
        //1.占分布式锁,去redis占坑
        Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "111");
        if(lock){
   
            //加锁成功...执行业务
            Map<String, List<Catelog2Vo>> fromDb = getDataFromDb();
            redisTemplate.delete("lock");//删除锁
            return fromDb;
        }else {
   
            //加锁失败。。。重试。 自旋的方式
            //避免重试的频率过高  可以休眠100毫秒 这个数值根据各自情况设置
            return gtCatalogJsonFromDbWithRedisLock();
        }
    }

问题一:

这里出现的第一个问题:
1.setnx占位后,业务代码出现异常或者程序在执行过程中宕机。都没有执行删除的逻辑。照成死锁。

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

自动解锁版:

换一个带时间参数的方法即可
加锁设置过期时间,必须和加锁是同步的 需要原子性
在这里插入图片描述

    public Map<String, List<Catelog2Vo>> gtCatalogJsonFromDbWithRedisLock() {
   
        //1.占分布式锁,去redis占坑
        Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "111",300, TimeUnit.SECONDS);
        //2.设置过期时间,必须和加锁是同步的,原子的
        if(lock){
   
            //加锁成功...执行业务
            Map<String, List<Catelog2Vo>> fromDb = getDataFromDb();
            redisTemplate.delete("lock");//删除锁
            return fromDb;
        }else {
   
            //加锁失败。。。重试。 自旋的方式
            //避免重试的频率过高  可以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值