Redis环境需求:7.0+
今天在跟踪服务器状态时候,发现redis内存占用量居高不下,进去查看后得知是因为写入的keys高达数十万条记录,甚至还包含了几万条弃用keys,为了能够快速批量删除这些废弃数据,我通过百度查询,发现redis7.0以后允许通过lua函数在内部直接运行。
由于我的redis环境在docker里面,无法直接通过宿主机运行redis-cli,因此就选择使用lua函数以及redis的新特性FUNCTION LOAD注册一个批量删除键的函数
得益于csdn上面@高佬林的文章启发,改进了其中代码,实现调用函数名称快速批量删除keys的操作
进入redis当中,运行以下命令以注册一个libray名称batchlib 函数名称为rmfunc的函数
FUNCTION LOAD "#!lua name=batchlib \n redis.register_function('rmfunc', function(keys, args) \n redis.call('echo', args[1]) \n local hashKeys = redis.call('keys', args[1]) \n for i, v in ipairs(hashKeys) do \n redis.call('del', v) \n redis.call('echo', v) \n end \n end)"
函数注册成功后,将在命令行输出libray的名称
如果已经存在相同的library,那么会得到如下错误
查看已经注册的library及函数列表则运行
FUNCTION LIST
运行结果如下
调用方法开始执行批量删除
FCALL rmfunc 0 "keyprefix*"
keyprefix 为你需要批量删除的key前缀,中间可以使用多个通配符匹配。
可以看到,删除结束后并没有删除key的过程输出,直接返回了(nil) ,不要怀疑,相关的key已经被删除,你可以进行实时验证匹配。
如果想要移除这个library ,那么只需要简单运行以下命令即可
FUNCTION DELETE batchlib