> 文档中心 > springboot的RedisTemplate实现分布式锁

springboot的RedisTemplate实现分布式锁


springboot的RedisTemplate实现分布式锁

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

直接上代码!

@Slf4jpublic 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("获取不到锁"); }    }}