redis 批量删除 key

本文介绍了如何在Redis中使用Lua脚本和Scan命令进行批量删除Key操作。首先展示了通过Lua脚本来实现批量删除,然后讨论了在Redisson客户端中执行该脚本的方法。尽管keys命令在高并发环境下不推荐使用,但提供了使用Scan命令的替代方案,以更安全的方式遍历并删除匹配的Key。这种方法在性能上优于直接的删除操作。
摘要由CSDN通过智能技术生成

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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值