redis 批量删除 key

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。

你可能感兴趣的:(java,redis,lua,数据库,java)