使用 redistemplate 实现锁的方案

springboot + redistemplate 实现锁的方案

 

  • 一、经过set命令设置锁
  • 二、判断返回结果是不是OK
    • 1)Nil,获取失败,结束或重试(自旋锁)
    • 2)OK,获取锁成功
      • 执行业务
      • 释放锁,DEL 删除key便可
  • 三、异常状况,服务宕机。超时时间EX结束,会自动释放锁

 

代码清晰简洁 废话很少说直接上demojava

这里使用的单元测试;欢迎研究讨论,下一篇讲解分布式锁;redis

 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 }
相关文章
相关标签/搜索