使用 redistemplate 实现锁的方案

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             unlock(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 unlock(String key) {
74         // 删除key即可释放锁
75         redisTemplate.delete(key);
76     }
77 }

猜你喜欢

转载自www.cnblogs.com/hb-liang/p/12034765.html