redis2.分布式锁

转自尚硅谷------阳哥

1.redis的分布式锁

加锁:

stringRedisTemplate.opsForValue().setIfAbsent(REDIS_LOCK_KEY, value);//setnx

释放锁:

stringRedisTemplate.delete(REDIS_LOCK_KEY);//释放锁

2.出异常无法释放锁,则强制完成删锁,防止阻塞

也就是把释放锁加入finally{}代码块中

3.加过期时间,处理服务器突发宕机

stringRedisTemplate.expire(REDIS_LOCK_KEY,10L, TimeUnit.SECONDS);

4.设置key+过期时间分开了,必须要合并成一行具备原子性:

加锁和设置过期时间合并为同一语句保证原子性:

Boolean lockFlag = stringRedisTemplate.opsForValue().setIfAbsent(REDIS_LOCK_KEY, value,10L, TimeUnit.SECONDS);

5.★张冠李戴,删了其他线程的锁,解决:

先判断再删除
finally {
   
                if (value.**equalsIgnoreCase**(stringRedisTemplate.opsForValue().get(REDIS_LOCK_KEY))){
   
                    stringRedisTemplate.delete(REDIS_LOCK_KEY);//释放锁
}

6.finally块的判断+del删除操作不是原子性的

不用lua脚本,如何实现(实际工作中100%用lua!)???

解决:redis事务版:

在这里插入图片描述

finally {
   
            while (true)
            {
   
                stringRedisTemplate.watch(REDIS_LOCK_KEY); //加事务,乐观锁
                if (value.equalsIgnoreCase(stringRedisTemplate.opsForValue().get(REDIS_LOCK_KEY))){
   
                    stringRedisTemplate.setEnableTransactionSupport(true);
                    stringRedisTemplate.multi();//开始事务
                    stringRedisTemplate.delete(REDIS_LOCK_KEY);
                    List<Object> list = stringRedisTemplate.exec();
                    if (list == null) {
     //如果等于null,就是没有删掉,删除失败,再回去while循环那再重新执行删除
                        continue;
                    }
                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要手动移除分布式锁,可以使用Redis的del命令来删除锁的键。在使用SimpleRedisLock的情况下,可以通过以下步骤来手动移除分布式锁: 1. 首先,创建一个SimpleRedisLock对象,传入与获取锁时相同的参数,确保使用相同的锁。 2. 然后,使用del命令删除锁的键。在Redis中,可以使用StringRedisTemplate的delete方法来执行del命令。 3. 最后,释放SimpleRedisLock对象。 以下是一个示例代码,展示了如何手动移除分布式锁: ```java SimpleRedisLock redisLock = new SimpleRedisLock("order", stringRedisTemplate); stringRedisTemplate.delete(redisLock.getLockKey()); redisLock.unlock(); ``` 在这个示例中,我们首先创建了一个SimpleRedisLock对象,传入与获取锁时相同的参数。然后,使用StringRedisTemplate的delete方法删除锁的键,即调用redisLock.getLockKey()来获取锁的键,并将其作为参数传递给delete方法。最后,我们释放了SimpleRedisLock对象,确保锁被正确释放。 请注意,手动移除分布式锁需要谨慎操作,确保在适当的时机和条件下进行移除,以避免可能的并发问题和数据不一致性。 #### 引用[.reference_title] - *1* *2* *3* [【RedisRedis高级:分布式锁](https://blog.csdn.net/qq_50675319/article/details/126959964)[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^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值