首页 > 数据库 >Redis如何实现自动续期

Redis如何实现自动续期

时间:2023-10-17 15:01:48浏览次数:43  
标签:acquiredLock lockTimeout Redis lockValue 自动 续期 local lockKey String

  在Redis中,可以使用Lua脚本结合SET命令和EXPIRE命令来实现自动续期和加锁的操作。可以在给定的超时时间内自动续期锁。

local lockKey = KEYS[1] -- 锁的键名
local lockValue = ARGV[1] -- 锁的值
local lockTimeout = tonumber(ARGV[2]) -- 锁的超时时间(秒)

-- 尝试获取锁
local acquiredLock = redis.call("SET", lockKey, lockValue, "NX", "EX", lockTimeout)

if acquiredLock then
    -- 获取到锁,设置自动续期定时器
    redis.call("PEXPIRE", lockKey, lockTimeout * 1000)
end

return acquiredLock

  在上边的这个脚本中,SET命令用于尝试获取锁,如果成功获取到锁,会再使用PEXPIRE命令设置一个毫秒级的过期时间,用于自动续期锁。如果脚本执行返回了1(代表成功),则表示获取到了锁,否则表示未能获取到锁。

      那我们如何使用JAVA代码去调用Lua脚本嘞?

  可以考虑使用Redis的'EVAL’命令。

使用Jedis的调用:

Jedis jedis = new Jedis("localhost", 6379);
String lockKey = "myLock";
String lockValue = "myValue";
int lockTimeout = 10; // 锁的超时时间(秒)

String script = "local lockKey = KEYS[1] ...(简单点,咱这省略脚本内容)";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Arrays.asList(lockValue, String.valueOf(lockTimeout)));
boolean acquiredLock = (Long) result == 1;
if (acquiredLock) {
    // 成功获取到锁,执行业务逻辑
} else {
    // 未能获取到锁,处理逻辑
}

  

如果使用StringRedisTemplate

public boolean acquireLock(String lockKey, String lockValue, int lockTimeoutInSeconds) {
        RedisScript<Long> script = new DefaultRedisScript<>(
                "local lockKey = KEYS[1] " +
                "local lockValue = ARGV[1] " +
                "local lockTimeout = tonumber(ARGV[2]) " +
                "local acquiredLock = redis.call('SET', lockKey, lockValue, 'NX', 'EX', lockTimeout) " +
                "if acquiredLock then " +
                "   redis.call('PEXPIRE', lockKey, lockTimeout * 1000) " +
                "end " +
                "return acquiredLock",
                Long.class);

        Object result = redisTemplate.execute(script, Collections.singletonList(lockKey), lockValue, String.valueOf(lockTimeoutInSeconds));

        return result != null && (long) result == 1;
    }

  

记得:在业务操作完成后,记得释放锁。

 

标签:acquiredLock,lockTimeout,Redis,lockValue,自动,续期,local,lockKey,String
From: https://www.cnblogs.com/leon2019/p/17769706.html

相关文章

  • 为网站接入免费SSL证书let's encrypt 并实现自动续签功能
    以ubuntu系统为例:1.安装certbot:aptupdateaptupgradesudoaptinstallcertbotpython3-certbot-nginx2.验证Web服务器端口是否打开并允许通过防火墙sudoufwstatusverbose3.获取SSL证书sudocertbot--nginx-dyour_domain.com-dwww.your_domain.com4.检查C......
  • vs自动生成ignore文件
    第一步,进入vs,点击工具->选项第二步,点击添加(如果是第一次,不是显示编辑,显示的是添加)添加文件到git远程仓库即可......
  • 爬虫ip如何加入到代码里实现自动化数据抓取
    以下是一个使用HTTP:Tiny和www.weibo.com的音频爬虫程序的示例。这个示例使用了https://www.duoip.cn/get_proxy来获取爬虫IP。请注意,这个示例可能需要根据你的实际需求进行调整。#!/usr/bin/perlusestrict;usewarnings;useHTTP::Tiny;useLWP::UserAgent;useJSON;my$......
  • 搭建redis分片集群
    搭建redis分片集群第一章:测试环境搭建1.1、版本信息:操作系统:CentOS-7-x86_64-Minimal-2009.isoredis:6.0.81.2、地址规划与结构图ip地址端口描述192.168.118.20020300master1192.168.118.20020301slave2。从于192.168.118.201的master192.168.118.20120300master2192.168.118.20120......
  • redisson不同版本的配置地址格式问题
       不同版本的redisson在配置地址时需要注意例如3.2.0是127.0.0.1:63793.15.4是redis://127.0.0.1:6379 在用ip地址配置时需要注意在测试环境配置地址时因为时域名所以没有暴露出来  Releases·redisson/redisson·GitHub从redisson-3.4.3......
  • Redis系列---【Linux系统离线安装redis5.0.7】
    Linux系统离线安装redis5.0.71.下载redis安装包方式一:shell命令下载wgethttp://download.redis.io/releases/redis-5.0.7.tar.gz方式二:手动官网下载官网地址:https://redis.io/download2.上传到服务器上传到/opt/app/middles/目录下3.解压并安装tar-zvxfredi......
  • 一文带你了解自动化测试是什么?
    本章主要讲解自动化测试的含义、分类、项目使用,以及自动化测试工具的优势。一、自动化测试概述1、什么是自动化测试?自动化测试是软件测试活动中的一个重要分支和组成部分。随着软件产业的不断发展,市场对软件周期的要求越来越高,于是催生了各种开发模式,如大家熟知的敏捷开发,从而......
  • C++接入redis
    项目地址https://github.com/sewenew/redis-plus-plushttps://github.com/redis/hiredis#1、编译安装hiredis项目wgethttps://github.com/redis/hiredis/archive/refs/tags/v1.2.0.tar.gzcdhiredis#编译安装make&&makePREFIX=安装到指定目录install#2、编译......
  • redis 介绍和安装
    1.redis是什么-数据库就是个存数据的地方:只是不同的数据库数据组织,存放形式不一样-mysql关系型数据库(oracle,sqlserver,postgrasql)-非关系型数据(nosql):redis,mongodb,clickhouse,infludb,elasticsearch,hadoop。。。-没有sql:没有sql语句-not......
  • 自动化测试
    接口自动化测试整体步骤接口需求分析确定接口测试范围和目标测试范围登录接口注册接口测试目标接口功能测试阅读文档,需求分析要点获取需求规格说明书《apitest接口需求.pdf》,设计说明书等接口文档分析接口的功能要求(实现何种业务)接口地址(协议、服务器IP、端口号、接口名、/是否可以......