最新《Redis实战篇》五、分布式锁-redission(1)

if(redis.call(‘hexists’, key, threadId) == 1) then
– 存在, 获取锁,重入次数+1
redis.call(‘hincrby’, key, threadId, ‘1’);
– 设置有效期
redis.call(‘expire’, key, releaseTime);
return 1; – 返回结果
end;
return 0; – 代码走到这里,说明获取锁的不是自己,获取锁失败


* 释放锁的Lua脚本:



local key = KEYS[1]; – 锁的key
local threadId = ARGV[1]; – 线程唯一标识
local releaseTime = ARGV[2]; – 锁的自动释放时间
– 判断当前锁是否还是被自己持有
if (redis.call(‘HEXISTS’, key, threadId) == 0) then
return nil; – 如果已经不是自己,则直接返回
end;
– 是自己的锁,则重入次数-1
local count = redis.call(‘HINCRBY’, key, threadId, -1);
– 判断是否重入次数是否已经为0
if (count > 0) then
– 大于0说明不能释放锁,重置有效期然后返回
redis.call(‘EXPIRE’, key, releaseTime);
return nil;
else – 等于0说明可以释放锁,直接删除
redis.call(‘DEL’, key);
return nil;
end;


**2、测试Redission的分布式锁的可重入效果**



/**
* @author lxy
* @version 1.0
* @Description 测试Redisson的分布式锁的可重入性质
* @date 2022/12/21 16:01
*/
@Slf4j
@SpringBootTest
public class RedissonTest {

@Resource
private RedissonClient redissonClient;

private RLock lock;

@BeforeEach
void setUp(){
    lock = redissonClient.getLock("order");
}

@Test
void method1() throws InterruptedException {
    // 尝试获取锁
    boolean isLock = lock.tryLock(1L, TimeUnit.SECONDS);
    if (!isLock){
        log.error("获取锁失败....1");
        return;
    }
    try
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值