springboot + redistemplate 实现锁的方案
- 1、通过set命令设置锁
- 2、判断返回结果是否是OK
- 1)Nil,获取失败,结束或重试(自旋锁)
- 2)OK,获取锁成功
- 执行业务
- 释放锁,DEL 删除key即可
- 3、异常情况,服务宕机。超时时间EX结束,会自动释放锁
代码清晰简洁 废话不多说直接上demo
这里使用的单元测试;欢迎研究讨论,下一篇讲解分布式锁;
1 package com.example.demo.controller; 2 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.slf4j.Logger; 6 import org.slf4j.LoggerFactory; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.boot.test.context.SpringBootTest; 9 import org.springframework.data.redis.core.RedisTemplate; 10 import org.springframework.test.context.junit4.SpringRunner; 11 12 import java.util.concurrent.TimeUnit; 13 14 /** 15 * Description: demo <br> 16 * 17 * @author Liang lp 18 * Date: 2019/12/13 12:27 <br> 19 */ 20 @SpringBootTest 21 @RunWith(SpringRunner.class) 22 public class demo { 23 24 private static final Logger log = LoggerFactory.getLogger(demo.class); 25 26 @Autowired 27 RedisTemplate redisTemplate; 28 29 @Test 30 public void test() { 31 String key = "test"; 32 //创建锁 33 boolean isLock = lock(key, 1, 50); 34 // 判断是否获取锁 35 if (!isLock) { 36 //获取所失败 37 log.info("获取所失败 "); 38 return; 39 } 40 try { 41 log.info("获取锁成功,开始执行逻辑"); 42 //模拟程序执行 43 Thread.sleep(2000); 44 } catch (Exception e) { 45 log.error("程序执行异常{}", e); 46 } finally { 47 // 释放锁 48 deleteLock(key); 49 log.info("执行完毕。释放锁完成;"); 50 } 51 } 52 53 /** 54 * 创建锁 55 * 56 * @param key 锁的Key 57 * @param value 值(随便写毫无意义) 58 * @param releaseTime 锁过期时间 防止死锁 59 * @return 60 */ 61 public boolean lock(String key, int value, long releaseTime) { 62 // 尝试获取锁 63 Boolean boo = redisTemplate.opsForValue().setIfAbsent(key, value, releaseTime, TimeUnit.SECONDS); 64 // 判断结果 65 return boo != null && boo; 66 } 67 68 /** 69 * 根据key'删除锁 70 * 71 * @param key 72 */ 73 public void deleteLock(String key) { 74 // 删除key即可释放锁 75 redisTemplate.delete(key); 76 } 77 }