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

基于Redis setNX命令实现分布式加解锁

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

基于Redis setNX命令实现分布式加解锁

1、setNX命令说明:
SET resource_name my_random_value NX PX 30000
2、代码演示:
@Service
public class baseSetNXDistributeLockService {

    private static final Logger LOGGER = LoggerFactory.getLogger(baseSetNXDistributeLockService.class);

    @Autowired
    private RedisTemplate redisTemplate;

    public String redisLock() {
        LOGGER.info("我进入了方法!");
        String key = "redisKey";
        String value = UUID.randomUUID().toString();

        RedisCallback redisCallback = connection -> {
            //设置NX
            RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
            //设置过期时间
            Expiration expiration = Expiration.seconds(30);
            //序列化key
            byte[] redisKey = redisTemplate.getKeySerializer().serialize(key);
            //序列化value
            byte[] redisValue = redisTemplate.getValueSerializer().serialize(value);
            //执行setnx操作
            Boolean result = connection.set(redisKey, redisValue, expiration, setOption);
            return result;
        };
        //获取分布式锁
        Boolean lock = (Boolean) redisTemplate.execute(redisCallback);
        if (lock) {
            LOGGER.info("我进入了锁!");
            try {
                Thread.sleep(15000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                String script = "if redis.call("get",KEYS[1]) == ARGV[1] thenn"+
                        "  return redis.call("del",KEYS[1])n"+
                        "elsen"+
                        "  return 0n"+
                        "end";
                Redisscript redisscript = Redisscript.of(script, Boolean.class);
                List keys = Arrays.asList(key);
                Boolean result = (Boolean) redisTemplate.execute(redisscript,keys,value);
                LOGGER.info("释放锁的结果:"+result);

                
            }
        }
        return "方法执行完成!";
    }

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

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

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