redis如何实现分布式锁

Redisson是怎么实现分布式锁的

分布式锁:Redisson 提供了一种简单而强大的方式来实现分布式锁。
它支持多种锁模式,如公平锁、可重入锁、读写锁等,并且提供了锁的超时设置和自动释放功能。
锁的获取
在Redisson中常见获取锁的方式有
lock() 方法 与 tryLock() 方法

我们先来阐述两者的区别,再分析它们的源码。

lock() 与 tryLock() 的区别
(1)返回值: lock() 是没有返回值的;tryLock() 的返回值是 boolean。

(2)时机:lock() 一直等锁释放;tryLock() 获取到锁返回true,获取不到锁并直接返回false。

(3)tryLock() 是可以被打断的,被中断的;lock是不可以。

// 使用 lock() 方法获取锁
RLock lock = client.getLock(“myLock”);
lock.lock();
try {
System.out.println(“获取锁成功,执行被保护的代码…”);
} finally {
lock.unlock();
}

// 使用 tryLock() 方法获取锁
lock = client.getLock(“myLock”);
if (lock.tryLock()) {
try {
System.out.println(“获取锁成功,执行被保护的代码…”);
} finally {
lock.unlock();
}
} else {
System.out.println(“获取锁失败,无法执行被保护的代码…”);
}

在这里插入图片描述

Redis分布式锁实现一(setnx+expire)

seynx key value
expire key time

setnx其实就是set if not exists的意思,仅当key不存在的时候才能进行插入,执行完操作后可以将锁删除
expire命令为锁设置过期时间

del key

Redis分布式锁实现二(set)
上面那种实现方式存在一种问题,如果在执行完 setnx 之后,执行expire之前,服务器 crash 或重启了导致加的这个锁没有设置过期时间,就会导致死锁的情况

jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime)
第一个为key,我们使用key来当锁,因为key是唯一的。
第二个为value,我们传的是requestId

我们公司的实现

 public RLock(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
        lockScript = new DefaultRedisScript<>("return redis.call('set', KEYS[1] , ARGV[1] ,'EX' , ARGV[2],'NX' )");
        lockScript.setResultType(String.class);
        releaseLockScript = new DefaultRedisScript<>("if redis.call('get', KEYS[1]) == ARGV[1]
         then return redis.call('del', KEYS[1]) else return 0 end");
        releaseLockScript.setResultType(Long.class);
    }

    public boolean tryLock(String k, String requestId, int expiredSeconds) {
        Object result = redisTemplate.execute(lockScript, Collections.singletonList(k), 
        requestId, String.valueOf(expiredSeconds));
        return result != null && result.equals(LOCK_SUCCESS);
    }

    public boolean unlock(String lockKey, String requestId) {
        Object result = redisTemplate.execute(releaseLockScript, Collections.singletonList(lockKey), requestId);
        return RELEASE_SUCCESS.equals(result);
    }

Redis分布式锁实现三(Redission框架)

给获得锁的线程,开启一个定时守护线程,每隔一段时间检查锁是否还存在,存在则对锁的过期时间延长,防止锁过期提前释放。Redission框架帮我们实现了此功能,名为看门狗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值