springboot的RedisTemplate实现分布式锁

2 篇文章 0 订阅
2 篇文章 0 订阅

springboot的RedisTemplate实现分布式锁

背景:通过synchronized创建一个同步代码块,保证多线程并发下数据的准确,这是一个最简单的线程安全的例子。但这是JVM层面上的数据安全。当下我们的系统,为了安全性、可靠性一般是部署在多台服务器的,或者是在k8s上部署了多个节点。这个时候JVM层面的数据安全就不适用了,那么可以通过redis实现分布式的线程安全的业务。

直接上代码!

@Slf4j
public class RedisLock {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    private static final String REQUEST_CONTAINER = "TEST_LOCK";

    /**
     * 锁的过期时间可设置的长一些(业务执行完就释放了),至少要比预计的业务执行时间长(防止业务没执行完就释放了锁)
     */
    private static final long EXPIRE_TIME = 300L;

    public void lock(String lockName) {

        String key = REQUEST_CONTAINER + lockName;

        boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(key,1);
        if (aBoolean) {
            try {
                log.info("====================进入锁:{}==================",key);
                // 这里设置锁的过期时间和finally代码块都是为了防止死锁(JVM 崩溃,操作系统死掉等,finally是不会执行的)
                redisTemplate.expire(key,EXPIRE_TIME, TimeUnit.SECONDS);
                /*已进入业务*/
                // ********业务逻辑处理中****** //
                log.info("处理业务中");
                // *******业务逻辑处理结束****** //
            }catch (Exception e) {
                log.info("出现了点小问题-{}", e.getMessage());
            } finally {
                // 业务异常,手动释放锁
                redisTemplate.delete(key);
                log.info("------------redis锁释放成功-----------");
            }
        }else {
            log.info("获取不到锁");
        }

    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值