当前位置: 首页 > 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

http://www.lryc.cn/news/24576.html

相关文章:

  • 【钓鱼实测】写bug给new bing和chatGPT查。问他们林黛玉倒拔垂杨柳
  • 基于OMAPL138+FPGA核心板多核软件开发组件MCSDK开发入门(上)
  • C#/.net程序调用python
  • 一文讲清楚如何进行主数据编码
  • SAP 详解ST02
  • Go程序当父进程被kill,子进程也自动退出的问题记录
  • window10 下使用docmer-compose使用mysql镜像部署mysql
  • 软件测试补充
  • 【算法】Tire字符串
  • 【C++】STL——list的模拟实现
  • SpringBoot小区物业管理系统
  • 外网跨网远程控制内网计算机3种方案
  • 记录偶发更新失败问题
  • AI环境搭建步骤(Windows环境)
  • Linux系统之history命令的基本使用
  • 花7000报了培训班,3个月后我成功“骗”进了阿里,月薪拿16K....
  • Java-枚举类的使用(详解)
  • Docker----------Docker轻量级可视化工具Portainer/监控之 CAdvisor+InfluxDB+Granfana
  • 景嘉微7201
  • 串口、终端应用程序 API termios
  • 【服务器搭建】教程七:如何为自己的网站添加运行时间?
  • 【消息中间件】Apache Kafka 教程
  • ARM基础
  • Python排序 -- 内附蓝桥题:错误票据,奖学金
  • 容器化部署是什么意思?有什么优势?
  • 1.设计模式简介
  • 【算法题解】实现一个包含“正负数和括号”的基本计算器
  • 网站服务器如何防护攻击?网站服务器被挂马如何检测
  • JavaSE16-面向对象-接口
  • 安卓设备蓝牙键盘快捷键