已解决
springboot整合redis+lua实现getdel操作保证原子性
来自网友在路上 198898提问 提问时间:2023-11-05 08:21:47阅读次数: 98
最佳答案 问答题库988位专家为你答疑解惑
- 原始代码
脚本逻辑先获取redis的值,判断是否等于期望值。 条件成立则删除,不成立则返回0
if redis.call('get', KEYS[1]) == ARGV[1] thenreturn redis.call('del', KEYS[1])
end
return 0
- 测试代码
根据上面的逻辑加了测试, 在判断成功后等待5秒后执行删除操作。同时开启另外一个线程去修改这个key的值, 发现修改的线程一直阻塞。直到等待的线程5秒结束后且完成删除操作后,修改的线程才会执行。
原因:
redis是单线程执行,
Redis会将整个Lua脚本作为一个原子操作执行,这意味着脚本中的多个命令要么全部执行成功,要么全部失败。这有助于维护数据的原子性和一致性。
Redis执行Lua脚本时,它会自动锁定相关的键,以防止其他客户端对这些键进行并发修改。这确保了在脚本执行期间对键的访问是互斥的。
注意: 如果脚本中涉及多个key的操作并redis部署的是cluster模式时, 需要额外确认多个key都在一个slot中。还好我这就1个key!!!略过.............
String str_script =// 1. 判断key的值是否等于期望值,等于则进行删除,不相等则直接结束"if (redis.call('get', KEYS[1]) == ARGV[1]) then\n" +" local start = redis.call('TIME')[1] * 1000 + redis.call('TIME')[2] / 1000\n" +" while (redis.call('TIME')[1] * 1000 + redis.call('TIME')[2] / 1000 - start) < 5000 do\n" +" print('等待5秒结束.....')"+" end\n"+// 2. 值判断成功,等待5秒执行删除操作" return redis.call('del', KEYS[1])\n" +"end\n" +"return 0";public String getAndDelete(String key, String expectedValue) {log.info("start..................");DefaultRedisScript script = new DefaultRedisScript(str_script, Long.class);Object res = redisTemplate.execute(script, Collections.singletonList(key), expectedValue);log.info("end..................");return res.toString();}
查看全文
99%的人还看了
相似问题
- shell 脚本的函数和数组
- shell脚本三
- 二百零六、Flume——Flume1.9.0单机版部署脚本(附截图)
- Linux 启动停止重启jar包shell脚本
- shell脚本用法参数
- ES索引数据清理脚本示例
- hadoop 编写开启关闭集群脚本, hadoop hdfs,yarn开启关闭脚本。傻瓜式hadoop脚本 hadoop(九)
- 暖阳脚本_ 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent
- Apache Airflow (九) :Airflow Operators及案例之BashOperator及调度Shell命令及脚本
- Redis学习笔记14:基于spring data redis及lua脚本ZSET有序集合实现环形结构案例及lua脚本如何发送到redis服务器
猜你感兴趣
版权申明
本文"springboot整合redis+lua实现getdel操作保证原子性":http://eshow365.cn/6-32546-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!