如何在 Redis 中批量删除数十万个带有特殊字符的键
Posted
技术标签:
【中文标题】如何在 Redis 中批量删除数十万个带有特殊字符的键【英文标题】:How to bulk delete hundreds of thousands of keys with special characters in Redis 【发布时间】:2015-12-29 16:31:53 【问题描述】:我们有数十万个包含各种特殊字符的 Redis 键的列表,我们希望批量删除它们。对于这个问题的类似问题有一些很好的答案:How to atomically delete keys matching a pattern using Redis
但是,对于以下情况,我似乎找不到答案:
-
我们有大量的密钥(数十万个)
键有各种特殊字符,如双引号 (")、反斜杠 ()、各种奇怪的 Unicode 字符等。
我们使用的是 windows redis-cli 客户端
奖励:理想情况下,我们可以将此命令作为 MULTI/EXEC 事务的一部分发出,因此我们还可以连同键一起以原子方式删除 SET。
如果我们可以做类似下面的事情,我会很高兴,但让它处理带有所有给 Redis 问题的特殊字符的键:
redis-cli SMEMBERS "myGiganticListOfKeys" | xargs --delim='\n' redis-cli DEL
不幸的是,这只是给出了以下错误:
"C:/Program Files (x86)/Git/bin/xargs.exe": redis-cli: Bad file number
我认为如果我们在键中没有特殊字符,否则这将起作用。
非常感谢。
【问题讨论】:
我对 Windows fork 并不熟悉,但如果它的 redis-cli 支持 --pipe 开关,您可以准备一个包含所有DEL <funnykeyname>
命令的文本文件并直接通过管道输入。
@RyanVincent 我们实际上有我们想要删除的键的确切列表——它们在一个集合中。问题是使用该集合(例如 SMEMBERS “myKeyName”)并在有大量数字时将其全部删除,并且键恰好具有特殊字符。
感谢@ItamarHaber 的想法,但即使它确实有效——我猜它不会因为我怀疑它与仅从 SMEMBERS mykeyName 提供的密钥列表有什么不同——它因为我们正在尝试编写一个可重用的 PowerShell 脚本来删除指定集中的所有键,所以这并不是非常实用。在此过程中创建一个临时文件然后清理它并不理想。不过还是谢谢。
@RyanVincent 没问题,我将上面的示例更改为使用 SMEMBERS 而不是通配符示例,以阐明我们要解决的实际问题。
所有导致 Redis 问题的特殊字符是什么意思?
【参考方案1】:
这是我解决它的方法,这适用于数以万计的记录,而不会对 redis 造成压力。
WARNING: PLEASE DO NOT TRY THIS AT HOME UNATTENDED AND MAKE SURE TO WEAR
ALL SAFETY EQUIPMENT NECESSARY FOR THE TASK.
第 1 步。 将您需要的所有密钥从 redis 转储到一个文件中,让我们将此文件称为 YES_WE_CAN.sh
redis-cli KEYS "StartsWith*" > YES_WE_CAN.sh
第二步:用vi或vim打开文件YES_WE_CAN.sh,按:
字符,然后输入以下内容替换特殊字符'
:
:%s/'/'"'"'/g
这会将所有'
字符替换为'"'"'
转义序列。 (相信我,这行得通,继续!)
第 3 步: 在每个字符串前面加上 redis-cli DEL
(不要忘记末尾的空格):
:%s/^/redis-cli DEL /g
第 4 步:在每行末尾附加 '
字符:
:%s/$/'/g
第5步:保存文件并使用:wq
退出
第 6 步: 将文件 YES_WE_CAN.sh
更改为可执行模式:
chmod +x YES_WE_CAN.sh
第 7 步:运行文件:
./YES_WE_CAN.sh
在脚本删除您请求的数百万个密钥的同时享受您的咖啡。
【讨论】:
【参考方案2】:您应该尝试使用更强大的客户端创建应用程序。 请参阅client list。 redis-cli 是一个非常基本的命令行实用程序,仅用于破解/玩 Redis。
我同意你的看法,最好的办法是重新设计你的键/值存储。
如果您需要使多个键失效,请考虑使用标记机制:在添加键时使用散列按标签对键进行分组,然后删除散列中的所有键使整个标记失效。
【讨论】:
这确实是我们要做的。谢谢。以上是关于如何在 Redis 中批量删除数十万个带有特殊字符的键的主要内容,如果未能解决你的问题,请参考以下文章
在2005年,Unicode 的第十万个字符被采纳且认可成为标准之一(超过这65535范围的Unicode字符,则需要使用一些诡异的技巧来实现)