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。