当前位置: 首页 > news >正文

集群方式下的java Redis锁 lua脚本

下面说一下集群方式redis 下的原子锁 带超时时间java 代码如下:

List<String> keys =Collections.singletonList("test_key1");

System.out.println("打印前 ::"+jedisCluster.get("test_key1"));

//获取lua 脚本这里你可以所以 我是放在META-INF/scripts/redis/test.lua 路径下,

//获取到之后放到字符串String LUA 里边

URL url = Resources.getResource("META-INF/scripts/redis/test.lua");

List<String> lines = Resources.asCharSource(url, Charsets.UTF_8).readLines();

List<String> args = new ArrayList<>(2);

// 以当前时间戳作为value

args.add(DateUtil.dateToString(new Date(), DateUtil.DEFAULT_TIMESTAMP_FORMAT));

// 超时时间(单位秒)

long lockTimeMs = 5;

args.add(String.valueOf(lockTimeMs));

LUA = "";

lines.forEach(line->{

LUA += (line + "\n");

});

Object result =jedisCluster.eval(LUA, keys, args);

//这是另一种方式 作为一个 补充

jedisCluster.set("lockKey", "lockVal", "NX", "PX", 1000);

//注意这里是用另外一种方式,因为我们redis 大部分是集群方式,很少有单机

//我们这里可以灵活判断 具体走单机还是集群 进行 redis 家所

String result1 = (String)stringRedisTemplate.execute(new RedisCallback<String>() {

public String doInRedis(RedisConnection connection) throws DataAccessException {

Object nativeConnection = connection.getNativeConnection();

// 集群模式和单点模式虽然执行脚本的方法一样,但是没有共同的接口,所以只能分开执行

// 集群

if (nativeConnection instanceof JedisCluster) {

return (String) ((JedisCluster) nativeConnection).eval(LUA, keys,args);

}

// 单点

else if (nativeConnection instanceof Jedis) {

return (String) ((Jedis) nativeConnection).eval(LUA, keys, args);

}

return null;

}

});

System.out.println("打印::result "+result.toString());

System.out.println("打印getValueByKey::"+jedisCluster.get("test_key1"));

long tll =jedisCluster.ttl("test_key1");

System.out.println("打印::超时时间 单位秒"+tll);

Thread.sleep(6000);

System.out.println("打印::"+jedisCluster.get("test_key1"));

Lua脚本如下:

if redis.pcall('GET',KEYS[1]) == false then

if redis.pcall("SET", KEYS[1], ARGV[1]) =='OK' then

end

return redis.pcall("EXPIRE", KEYS[1], ARGV[2])

else

return redis.pcall('TTL',KEYS[1])

end

另一种写法:

if redis.pcall('EXISTS',KEYS[1]) == 0 then

return redis.pcall('SET', KEYS[1], ARGV[1], 'EX', ARGV[2])

else

return redis.pcall('TTL',KEYS[1])

end

相关文章:

集群方式下的java Redis锁 lua脚本

下面说一下集群方式redis 下的原子锁 带超时时间java 代码如下&#xff1a;List<String> keys Collections.singletonList("test_key1");System.out.println("打印前 &#xff1a;&#xff1a;"jedisCluster.get("test_key1"));//获取lua …...

【钓鱼实测】写bug给new bing和chatGPT查。问他们林黛玉倒拔垂杨柳

BUG 错误代码 #include <iostream> #include <vector> using namespace std; int main() {vector<int> vec{1,2,3,2,4};for (auto iter vec.begin(); iter ! vec.end(); iter ){if (*iter 2) {vec.erase(iter);}}cout << vec.size() << endl…...

基于OMAPL138+FPGA核心板多核软件开发组件MCSDK开发入门(上)

本文测试板卡为创龙科技 SOM-TL138F 是一款基于 TI OMAP-L138(定点/浮点 DSP C674x + ARM9)+ 紫光同创 Logos/Xilinx Spartan-6 低功耗 FPGA 处理器设计的工业级核心板。核心板内部OMAP-L138 与 Logos/Spartan-6 通过 uPP、EMIFA、I2C 通信总线连接,并通过工业级 B2B连接器引…...

C#/.net程序调用python

C#/.net程序调用python C#的优势在于window下的开发&#xff0c;不仅功能强大而且开发周期短。而python则有众多的第三方库&#xff0c;可以避免自己造轮子&#xff0c;利用C#来做界面&#xff0c;而具体实现使用python来实现可以大大提高开发效率。本文介绍如何使用pythonnet…...

一文讲清楚如何进行主数据编码

主数据编码作为一类重要的数据资源&#xff0c;在信息化建设中具有重要的地位和作用&#xff0c;是保证现有信息系统和未来新系统建设成功的关键因素&#xff0c;决定着系统中的信息一致性。 编码&#xff0c;是一件简单的事情&#xff0c;但绝对不是一件容易做好的事情&#…...

SAP 详解ST02

问&#xff1a;在st02中看到&#xff0c;Program和Export/Import的Swap出现红的了&#xff0c;这个是什么原因啊&#xff0c;是不是对系统的性能有影响啊&#xff0c;是否应该调整一些参数啊。要怎么调整呢&#xff1f; 复1&#xff1a;双击红色的部分就可以看到相应的参数修改…...

Go程序当父进程被kill,子进程也自动退出的问题记录

平常我们启动一个后台进程&#xff0c;会通过nouhp &的方式启动&#xff0c;这样可以在退出终端会话的时候&#xff0c;进程仍然可以继续在后台执行(进程的父进程id会从原来的bash进程变成1) 在go程序中&#xff0c;通过nouhp &的方式启动子进程&#xff0c;预期是即使…...

window10 下使用docmer-compose使用mysql镜像部署mysql

1. 在wins中找到store&#xff0c;安装Debian 2. 在桌面右键点击 linux shell窗口 3. 安装docker 4. 启动docker&#xff1a; service docker start 5. 配置加速器&#xff0c;为了拉取镜像更快&#xff0c;修改后得重新启动docker&#xff1a; vi /etc/docker/daemon.json…...

软件测试补充

软件开发的生命周期&#xff1a;需求-计划-设计-开发编码-测试-运行维护-上线 那我们的微信APP来进行举例: 需求:我需要你们团队做这样一个社交软件&#xff0c;能够像QQ一样实现聊天功能&#xff0c;发布说说的功能&#xff0c;能够群聊&#xff0c;可以转账 计划:计划软件…...

【算法】Tire字符串

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;或许会很慢&#xff0c;但是不可以停下&#x1f43e; 文章目录1.Trie的基本思想1.1什么是Trie1.2字符串条件1.3如何存储字符串1.4如何查找字符串2.Trie的代码实现2.1怎么用数组建树2.2完整代码1.Trie的基本思…...

【C++】STL——list的模拟实现

list的模拟实现 文章目录list的模拟实现一、list三个基本类的模拟实现总览二、节点类接口实现模拟实现构造函数三、迭代器类接口实现1.正向迭代器默认成员函数构造函数六种运算符重载 */->//--/!/2.反向迭代器四、list类接口实现1.默认成员函数1.1.构造函数1.2.析构函数1.3.…...

SpringBoot小区物业管理系统

文章目录 项目介绍主要功能截图:后台登录车位收费管理物业收费管理投诉信息管理保修信息管理基础信息管理数据分析部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获…...

外网跨网远程控制内网计算机3种方案

远程控制&#xff0c;通俗来讲就是在自己个人电脑直接远程访问另台主机电脑桌面操作。 如何远程控制电脑&#xff1f;远程控制别人计算机的方案通常有两种&#xff0c;一种是开启电脑系统自带的远程桌面功能&#xff0c;如果涉及跨网内、外网互通可以同时用快解析内网映射外网&…...

记录偶发更新失败问题

一&#xff0c;代码如下Transactional(rollbackFor Exception.class) public void updateDelivery(){ // 1.新增反馈记录 // 2.更新订单状态&#xff0c;及其他字段 // 3.新增变更履历 // 4.其他新增逻辑及与其他系统交互逻辑 }二&#xff0c;问题偶尔出现&#xff08;概率极低…...

AI环境搭建步骤(Windows环境)

1. 安装好Anaconda3版本(1) 安装链接&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?CM&OD本文使用Anaconda3下载链接&#xff1a;Anaconda5(2) 注意安装anaconda时一定要把环境变量加入windows环境中。要没有勾选&#xff0c;安装完后还有手动加入…...

Linux系统之history命令的基本使用

Linux系统之history命令的基本使用一、history命令介绍二、本地环境检查1本地系统版本2.检查操作系统的内核版本三、history的命令帮助四、history命令的基本帮助1.查看所有历史执行命令2.指定历史命令条数3.清除历史命令记录4.引用历史命令5.将历史文件中的信息读入到当前缓冲…...

花7000报了培训班,3个月后我成功“骗”进了阿里,月薪拿16K....

“月薪4000元不如报名学IT&#xff0c;挑战年薪百万”这是大多数培训班在互联网上宣传的口号&#xff0c;简单的16个字却戳中了很多人的痛点&#xff0c;同龄人买车买房&#xff0c;自己却拿着微薄的工资连好一点的房子都租不起&#xff0c;这句口号 彻底激起了底层员工的焦虑&…...

Java-枚举类的使用(详解)

枚举类的使用前言一、何为枚举类&#xff1f;二、自定义枚举类&#xff08;JDK1.5之前&#xff09;1、实现1.1 属性1.2 构造器2、代码演示三、用关键字enum定义枚举类&#xff08;JDK 1.5&#xff09;1、实现1.1 属性1.2 构造器2、代码演示四、Enum类的方法五、实现接口的枚举类…...

Docker----------Docker轻量级可视化工具Portainer/监控之 CAdvisor+InfluxDB+Granfana

1.是什么 Portainer 是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 2 官网 官网 https://www.portainer.io/ https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux 3.…...

景嘉微7201

220112-驱动与固件-景嘉微7201驱动与固件-三期超翔TF830JM7201显卡黑屏、花屏、竖线或待机唤醒黑屏JM72系列为了让驱动和系统内核解绑&#xff0c;驱动包含核内和核外两个驱动&#xff0c;两个驱动请都务必安装&#xff1b;最近JM7201 替代R7 340 发货了&#xff0c;导致对应通…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...