栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

redis 分布式锁

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

redis 分布式锁

直接上代码

package com.example.test2.test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.util.Collections;

@Component
public class RedisLock {
    @Autowired
    private StringRedisTemplate redisTemplate;

    
    public Boolean lock(String key,String value,Long time){
        Boolean lockStatus = redisTemplate.opsForValue().setIfAbsent(key,value, Duration.ofSeconds(time));
        return lockStatus;
    }

    
    public Long unLock(String key,String value){
        String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        RedisScript redisScript = new DefaultRedisScript<>(luaScript,Long.class);
        Long releaseStatus = redisTemplate.execute(redisScript, Collections.singletonList(key),value);
        return releaseStatus;
    }
}

锁的使用

    @RequestMapping(value = "order")
    public void addLock(){
        String orderId = "111111";//订单id
        // 锁的过期时间要根据业务处理时间分析
        boolean lock = redisLock.lock(orderId,"12",1L);
        // 如果获取到锁,执行业务
        if(lock) {
            System.out.println("业务代码");
        }else {
            System.out.println("返回友好提示");
        }
        long unlock = redisLock.unLock(orderId,"12");
        // 主动解锁失败是否需要进行业务回退
        // 锁的过期时间到了,主动解锁失败
        if (unlock == 0){
            // 根据业务分析这里是否需要回退,如果需要回退,自定义异常,触发事务,回退
        }
        System.out.println("解锁:"+unlock);
    }

 测试结果

业务代码
解锁:1

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936819.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号