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