redis 批量删除 key
使用 lua 脚本简单实现一个使用 keys 指令和 del 指令批量删除 key 的功能。
local keyList = redis.call('keys', ARGV[1])
for key, val in pairs(keyList) do
redis.call('del', val)
end
return keyList
在 redis 命令行中调用
eval "local keyList = redis.call('keys', ARGV[1]) for key, val in pairs(keyList) do redis.call('del', val) end return keyList" 0 keypattern
- keypattern: 符合 redis 规范的 key 正则表达式
在 redisson 中调用
// 在代码中不需要知道具体删除了哪些 key, 所以不需要 return keyList
private static final String BATCH_REMOVE = "local keyList = redis.call('keys', ARGV[1]) for key, val in pairs(keyList) do redis.call('del', val) end";
redissonClient.getScript(StringCodec.INSTANCE)
.eval(RScript.Mode.READ_WRITE,
BATCH_REMOVE,
RScript.ReturnType.STATUS,
Collections.emptyList(), // 表示没有键参数
keyPrefix); // 脚本执行的参数, 即 keypattern
使用 lua 脚本删除比直接调用 redisson 提供的 getKeys().getKeysByPattern(keypattern)和 getBucket(key).delete()删除要快得多。
使用 scan 指令实现
考虑到 keys 的性能影响,在很多的生产项目中不允许使用 keys 指令, 可以考虑使用 scan 指令实现相同的功能
local next_val = 0
local res = 0
repeat
local key_list = redis.call('scan', next_val, 'MATCH', ARGV[1], 'COUNT', 100)
next_val = key_list[1]
for k, v in pairs(key_list[2]) do
res = res + 1
redis.call('del', v)
end
until (next_val == 0 or next_val == '0')
return res
如果不需要返回值可以不需要 res 统计, 也不需要 return。
本文介绍了如何在Redis中使用Lua脚本和Scan命令进行批量删除Key操作。首先展示了通过Lua脚本来实现批量删除,然后讨论了在Redisson客户端中执行该脚本的方法。尽管keys命令在高并发环境下不推荐使用,但提供了使用Scan命令的替代方案,以更安全的方式遍历并删除匹配的Key。这种方法在性能上优于直接的删除操作。

8354

被折叠的 条评论
为什么被折叠?



