如何在Redis中批量删除数十万个带有特殊字符的键

12
我们有一个由数十万个Redis键组成的列表,其中包含各种特殊字符,我们想要批量删除它们。有一些关于类似问题的非常好的答案在这个问题上:如何使用Redis原子地删除匹配模式的键 然而,我无法找到以下情况的答案:
  1. 我们有大量的键(数十万)
  2. 这些键具有各种特殊字符,例如双引号(“),反斜杠(\),各种奇怪的Unicode字符等。
  3. 我们正在使用Windows redis-cli客户端
  4. 额外奖励:理想情况下,我们将能够将此命令作为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分支不是很熟悉,但如果它的redis-cli支持--pipe开关,您可以准备一个包含所有“DEL <funnykeyname>”命令的文本文件,并直接将其输入。 - Itamar Haber
@RyanVincent 我们实际上有一个要删除的确切键列表 -- 它们在一个集合中。问题是当有大量键并且这些键恰好具有特殊字符时,如何将该集合(例如 SMEMBERS "myKeyName")中的所有键都删除。 - jakejgordon
你所说的“所有会导致Redis出现问题的特殊字符”指的是哪些Redis问题? - thepirat000
@thepirat000 这绝对是问题的一部分——我找不到关于哪些字符有问题的文档,因此我不确定如何转义它们。例如,如果我执行redis-cli SMEMBERS "myGiganticListOfKeys" | xargs --delim='\n' redis-cli DEL,它会出错,可能是因为某些键中有特殊字符,而redis-cli不知道该怎么处理它们。就好像我必须编写自己的逻辑来转义这些字符一样。 - jakejgordon
@thepirat000 我们正在使用.NET ServiceStack客户端,所以编写一个小的C#程序可能是我们最好的选择。在我们的特定情况下,我认为我们将改变整个实现方式,将键/值对存储在哈希中,而不是管理独立的键并跟踪它们而不是单独的集合。这最初是我们的错误实现,如果我们切换到这种模式,我们可以通过删除哈希来删除所有键。不幸的是,这个问题没有一个真正的答案,除了“使用不同的客户端”。如果你写下这个答案,我可以接受。 - jakejgordon
显示剩余3条评论
2个回答

3
这是我解决它的方法,可以在不过度使用Redis的情况下处理数以百万计的记录。
WARNING: PLEASE DO NOT TRY THIS AT HOME UNATTENDED AND MAKE SURE TO WEAR 
ALL SAFETY EQUIPMENT NECESSARY FOR THE TASK.

第一步。将您从Redis中需要的所有密钥转储到一个文件中,我们将这个文件称为YES_WE_CAN.sh

redis-cli KEYS "StartsWith*" > YES_WE_CAN.sh

步骤2:使用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

您应该尝试使用更强大的客户端创建应用程序。 请参见客户端列表。 Redis-cli是一个非常基本的命令行实用程序,仅用于破解/玩弄Redis。

我同意您的看法,最好重新设计您的键/值存储。

如果您需要使多个键无效,请考虑使用标记机制:在添加键时使用哈希将键按标记分组,然后通过删除哈希中的所有键来使整个标记无效。


这确实是我们必须要做的。谢谢。 - jakejgordon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接