Redisson lua脚本执行踩坑之神秘的引号
redisson
Redisson - Easy Redis Java client with features of In-Memory Data Grid. Sync/Async/RxJava/Reactive API. Over 50 Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring Cache, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache ...
项目地址:https://gitcode.com/gh_mirrors/re/redisson
免费下载资源
·
最近项目需求,在redis中需要执行批量删除指定key,并且要支持原子操作,那么当然只有自己写lua脚本了。
项目中使用的是redisson作为redis连接工具,首先先定义好lua脚本:
private static final String BATCH_DEL_SCRIPT = "for k,v in pairs(ARGV) do \n " +
"redis.call('del',v) \n" +
"end \n" +
"return #ARGV";
脚本很简单,根据参数传入的key,进行循环删除,然后返回参数的数量,当然这里也可以改为返回删除的数量总和。
redisson使用:
redissonClient.getScript().evalAsync(RScript.Mode.READ_WRITE, BATCH_DEL_SCRIPT, RScript.ReturnType.INTEGER, keys, keys.toArray());
然后开始执行以上代码,就是死活删除不了指定的key,比如redis中存在key:aaaa,执行命令后aaaa还在。各种调查和学习lua语法后还是不行。于是转换思路,不执行删除,而是将删除操作修改为赋值操作,只要将数据置为空也可以达到效果。于是脚本变为:
private static final String BATCH_DEL_SCRIPT = "for k,v in pairs(ARGV) do \n " +
"redis.call('set',v,'') \n" +
"end \n" +
"return #ARGV";
通过以上脚本执行后,还是不行,aaaa还存在,而且刷新后多了key:“aaaa”。什么鬼!!
怎么多了个key值,而且是加了引号的。一脸闷逼中。
知道了设置的规则后,那么解决办法就简单了,只需要在设置或删除key之前去除多余的引号就好了,于是脚本改为:
private static final String BATCH_DEL_SCRIPT = "for k,v in pairs(ARGV) do \n " +
"redis.call('del',string.gsub(v,'\"',''),'') \n" +
"end \n" +
"return #ARGV";
这样完美解决。
至于为什么lua脚本执行后,字符串对象为什么会多了双引号,这个还在调查中,如果你知道,欢迎评论告知,不胜感激。
GitHub 加速计划 / re / redisson
23.06 K
5.31 K
下载
Redisson - Easy Redis Java client with features of In-Memory Data Grid. Sync/Async/RxJava/Reactive API. Over 50 Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring Cache, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache ...
最近提交(Master分支:2 个月前 )
15bd94ed - 3 个月前
d220f2a8 - 3 个月前
更多推荐
已为社区贡献4条内容
所有评论(0)