zoukankan      html  css  js  c++  java
  • 使用 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             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 }
  • 相关阅读:
    感知器及其Python实现
    机器学习中的偏差和方差
    tensorflow构建CNN模型时的常用接口函数
    在O(1)时间复杂度删除链表节点
    python实现剑指offer删除链表中重复的节点
    yii2 advanced版基础部分
    Yii2 baisic版gii的使用和分页
    Yii2 表单(form)
    yii2 basic版 MVC 部分
    yii2 basic版基础部分
  • 原文地址:https://www.cnblogs.com/hb-liang/p/12034765.html
Copyright © 2011-2022 走看看