如何在 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字符,则需要使用一些诡异的技巧来实现)

Apache Ignite 吞吐量、值大小和最大缓存计数?

redis 批量删除键

如何将地理批量插入新的 sql server 2008 表

大量联系人的重复数据删除算法