springboot + redistemplate 实现锁的方案

1、通过set命令设置锁 2、判断返回结果是否是OK 1)Nil,获取失败,结束或重试(自旋锁) 2)OK,获取锁成功 执行业务 释放锁,DEL 删除key即可 3、异常情况,服务宕机。超时时间EX结束,会自动释放锁 代码清晰简洁 废话不多说直接上demo

package com.example.demo.controller;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.concurrent.TimeUnit;

/**
 * Description: demo <br>
 *
 * @author Liang lp
 * Date: 2019/12/13 12:27 <br>
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class demo {
          
   

    private static final Logger log = LoggerFactory.getLogger(demo.class);

    @Autowired
    RedisTemplate redisTemplate;

    @Test
    public void test() {
          
   
        String key = "test";
        //创建锁
        boolean isLock = lock(key, 1, 50);
        // 判断是否获取锁
        if (!isLock) {
          
   
            //获取所失败
            log.info("获取所失败 ");
            return;
        }
        try {
          
   
            log.info("获取锁成功,开始执行逻辑");
            //模拟程序执行
            Thread.sleep(2000);
        } catch (Exception e) {
          
   
            log.error("程序执行异常{}", e);
        } finally {
          
   
            // 释放锁
            deleteLock(key);
            log.info("执行完毕。释放锁完成;");
        }
    }

    /**
     * 创建锁
     *
     * @param key         锁的Key
     * @param value       值(随便写毫无意义)
     * @param releaseTime 锁过期时间 防止死锁
     * @return
     */
    public boolean lock(String key, int value, long releaseTime) {
          
   
        // 尝试获取锁
        Boolean boo = redisTemplate.opsForValue().setIfAbsent(key, value, releaseTime, TimeUnit.SECONDS);
        // 判断结果
        return boo != null && boo;
    }

    /**
     * 根据key删除锁
     *
     * @param key
     */
    public void deleteLock(String key) {
          
   
        // 删除key即可释放锁
        redisTemplate.delete(key);
    }
}```
经验分享 程序员 微信小程序 职场和发展