如何使用纯Redis以原子方式删除符合模式的数百万个键?
2020-4-22 13:31:49
收藏:0
阅读:124
评论:2
假设我有数百万个 前缀:<numeric_id> 键。
我想要原子性地清除它们。
如何使用Redis删除匹配模式的键 显示了许多选项。一些使用 redis-cli 或 Bash 脚本,但我需要使用我的客户端以编程方式执行它。
使用 Lua 脚本的方法很有前途,但使用 KEYS 命令的解决方法会失败并提示“要解包的元素太多”的错误。
如何实现这一点?
点赞
用户593425
Lua 是一个很好的选择,只要你不使用 Redis 集群或者你想要删除的所有键都在同一分片上。
如果你需要从多个分片中删除键,你仍然可以使用 Lua,但你必须手动向所有分片发送 Eval 命令。
另一种为你完成的选择是使用 RedisGears(一个 Redis 模块),它允许你编写基于某些条件的跨集群删除命令。
查看例子:https://oss.redislabs.com/redisgears/examples.html#delete-by-key-prefix
2020-04-22 22:07:43
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

以下 Lua 脚本使用
SCAN命令,在脚本内以块的方式进行删除-避免出现“too many elements to unpack”错误。local cursor = 0 local calls = 0 local dels = 0 repeat local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1]) calls = calls + 1 for _,key in ipairs(result[2]) do redis.call('DEL', key) dels = dels + 1 end cursor = tonumber(result[1]) until cursor == 0 return "Calls " .. calls .. " Dels " .. dels它返回调用
SCAN的次数以及已删除键的数量。用法如下:
EVAL "local cursor = 0 local calls = 0 local dels = 0 repeat local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1]) calls = calls + 1 for _,key in ipairs(result[2]) do redis.call('DEL', key) dels = dels + 1 end cursor = tonumber(result[1]) until cursor == 0 return 'Calls ' .. calls .. ' Dels ' .. dels" 0 prefix:1请注意,在运行时它将阻塞服务器,因此不建议用于生产。
对于生产,考虑将
DEL更改为UNLINK。您还可以返回游标(而不是在脚本内重复,直到它变为零),并在 SCAN 中添加 COUNT 参数以进行节流(请参见 Redis 中 SCAN / HSCAN 命令的推荐 COUNT 值?)。这样,您可以将其分块处理,而不是同时处理所有键,类似于 如何在 redis 中获取所有集合?或者,您可以使用本答案中提到的方法来做一些更复杂的事情:Redis `SCAN`: how to maintain a balance between newcomming keys that might match and ensure eventual result in a reasonable time?