首页 > 数据库 >redis分布式锁

redis分布式锁

时间:2023-09-01 12:13:19浏览次数:31  
标签:return redis Redis ARGV expire key 分布式


public static final String SET_NX_SCRIPT = "if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then return redis.call('expire', KEYS[1], ARGV[2]) else return 0 end";
public Boolean setNx(String key, Long expire) {
    return stringRedisTemplate.execute(new DefaultRedisScript<>(SET_NX_SCRIPT, Boolean.class), Collections.singletonList(key), 1, expire);
}

执行脚本语言所需要参数,会在execute()方法中的参数中获取也就是    KEYS[1], ARGV[1]     keys[1]指的是Collections.singletonList(key),

                                          ARGV[1] 指的是 ’1‘(内容)   ARGV[2]指的是 expire(时间)

 

setIfAbsent(K key, V value, long timeout, TimeUnit unit);

上面这个方法就是实现Redis分布式锁的方法,但是这个方法有问题就是,设置key对应的value值与key存活时间是分两步进行的,

如果在多线程的情况下刚设置完key,在设置key的存活时间之前做了一些别的操作 或者 刚设置完key,Redis宕机了,那么这个锁将永远不会消失(除非你打开Redis自行删除)

所以可以选择最上面的方法,执行lua脚本语言进行原子操作可以排除这个问题(Redis就是用lua写的)

标签:return,redis,Redis,ARGV,expire,key,分布式
From: https://www.cnblogs.com/lly-rainbow/p/17494350.html

相关文章

  • Redis缓存相关问题
    缓存穿透:就是,一个请求携带的参数是,id为负一我缓存中肯定没有,而且数据库肯定也没有,那么这个参数为负一的请求就直接绕过了redis,直接就访问了数据库,这就是缓存穿透缓存击穿:就是我有一个热点数据,比如秒杀,好巧不巧在秒杀开始的时候,刚好我缓存的KEY到期了,那么秒杀的请求全部打进了我......
  • redis——docker安装部署
    1.redis镜像拉取dockerpullredis注:Redis镜像默认没有redis.conf文件,默认允许远程用户连接。2.启动redis容器dockerrun--restart=always-uroot-p6379:6379--namemyredis-v/root/redis/myredis.conf:/etc/redis/redis.conf-v/root/redis/data:/data-......
  • redis7.2.0 centos源码编译安装并设置开机自启动
    下载源码包wgethttps://github.com/redis/redis/archive/7.2.0.tar.gztar-zxf7.2.0.tar.gz编译编码编译编码cdredis-7.2.0make&&makeinstall此时默认redis-serverredis-cli等命令行安装到目录/usr/local/bin/目录中。如果你想安装命令行到指定目录中你可以指定......
  • Seata解决分布式事务
    简介Seata是阿里开源的一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。初始化数据库创建seata库,初始化脚本如下----------------------------------ThescriptusedwhenstoreModeis'db'----------------------------------thetablet......
  • 分布式深度学习技术概述
    分布式深度学习技术有哪些?分布式深度学习技术是指将深度学习模型的训练过程分布在多个计算资源上进行加速的技术。这样可以充分利用集群中的多个GPU、CPU或者多台计算机,加快深度学习模型的训练过程,提高训练效率。以下是一些常见的分布式深度学习技术:数据并行:将训练数据划分成......
  • PyTorch多卡分布式训练DDP单机多卡
    前言因为课题组发的卡还没有下来,先向导师问了实验室的两张卡借用。之前都是单卡训练模型,正好在这个机会实践以下单机多卡训练模型的方法。关于DDP网上有很多资料,但都比较零碎(有些博客的代码甚至没办法run),Pytorch给出的官方文档看起来也比较吃力。因此这篇文章的主要目的是......
  • Redis相关知识
    什么是Redis?它主要用来什么的?Redis是一个基于Key-Value存储结构的Nosql开源内存数据库。它提供了5种常用的数据类型,String、Map、Set、ZSet、List。它可以覆盖应用开发中大部分的业务场景,比如Top10问题、好友关注列表、热点话题等。Redis是基于内存存储,并且在数据结构上做了......
  • springboot整合redis,连接两个redis
    在SpringBoot中,可以使用RedisTemplate进行Redis的连接和操作。要连接多个Redis实例,你可以创建多个RedisTemplate实例,并通过配置不同的连接工厂来连接到不同的Redis实例。首先,在application.properties(或application.yml)配置文件中添加Redis连接信息:#第一个Redis......
  • redis
    redis-server.exeredis.windows.confredis-cli.exe-h127.0.0.1-p123456configgetrequirpassconfigsetrequirpasswx_123456_qzxauth"wx_123456_qzx"setmyKeyabcgetmyKey安装命令:redis-server.exe--service-installredis.windows.conf--loglevelve......
  • Redis的五大数据类型的数据结构
    概述  Redis底层有六种数据类型包括:简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。这六种数据结构五大数据类型关系如下:String:简单动态字符串List:双向链表、压缩列表Hash:压缩列表、哈希表SortedSet:压缩列表、跳表Set:哈希表、整数数组       ......