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

     2023-03-25     288

关键词:

【中文标题】如何在 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。

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

如果您需要使多个键失效,请考虑使用标记机制:在添加键时使用散列按标签对键进行分组,然后删除散列中的所有键使整个标记失效。

【讨论】:

这确实是我们要做的。谢谢。

提高过滤可能包含数十万个元素的数组的效率

】提高过滤可能包含数十万个元素的数组的效率【英文标题】:Improvingontheefficiencyofmyfilteringofarrayswithpotentiallyhundredsofthousandsofelements【发布时间】:2021-12-2522:42:46【问题描述】:我有一个数字数组。我想在array1中找到不在array2中... 查看详情

在 BASH 中使用特殊字符从文件名中批量删除子字符串

】在BASH中使用特殊字符从文件名中批量删除子字符串【英文标题】:BatchremovesubstringfromfilenamewithspecialcharactersinBASH【发布时间】:2015-09-2400:21:00【问题描述】:我的目录中有一个文件列表:opencv_calib3d.so2410.soopencv_contrib.so2410.soope... 查看详情

如何在批处理文件中获取带有特殊字符的子字符串?

】如何在批处理文件中获取带有特殊字符的子字符串?【英文标题】:Howtogetasubstringwithspecialcharactersinbatchfile?【发布时间】:2020-07-2614:52:42【问题描述】:我正在尝试删除包含特殊字符的字符串的一部分。字符串看起来像:&l... 查看详情

如何批量删除redis中keys

在linux中批量操作redis中的keys的方法:1.统计个数:redis中名称含有OMP_OFFLINE的key的个数;src/redis-clikeys"*OMP_OFFLINE*"|wc-l2.批量删除批量删除0号数据库中名称含有OMP_OFFLINE的key:src/redis-cli-n0keys"*OMP_OFFLINE*"|xargssrc/redis-cl... 查看详情

如何在 iOS 中发送带有特殊字符的 JSON 字符串?

】如何在iOS中发送带有特殊字符的JSON字符串?【英文标题】:HowtoSendJSONStringwithSpecialCharatersiniOS?【发布时间】:2015-06-2518:23:31【问题描述】:我是iOS新手,我正在使用以下代码进行API调用。-(NSData*)sendDataToServer:(NSString*)url:(NSStrin... 查看详情

如何在 bash 中使用带有特殊字符的变量? [复制]

】如何在bash中使用带有特殊字符的变量?[复制]【英文标题】:HowdoIuseavariablewithspecialcharactersinbash?[duplicate]【发布时间】:2021-05-2508:17:14【问题描述】:我的bash脚本中有这个变量:var="\\\'?"\\"\'\\"但是当我输入echo$var时,我什么... 查看详情

如何在R中提取带有特殊字符的模式之间的字符串[重复]

】如何在R中提取带有特殊字符的模式之间的字符串[重复]【英文标题】:HowtoextractstringbetweentopatternswithspecialcharactersinR[duplicate]【发布时间】:2020-12-0608:24:33【问题描述】:从字符串a我想提取|Request|和下一次出现的|之间的所有内... 查看详情

如何在Objective C中使用XML解析发布带有特殊字符和泰语的字符串?

】如何在ObjectiveC中使用XML解析发布带有特殊字符和泰语的字符串?【英文标题】:HowtopoststringwithspecialcharacterandThaiLanguageusingXMLparsinginObjectiveC?【发布时间】:2017-09-1806:07:54【问题描述】:我是iOS新手,在发布包含特殊字符的字... 查看详情

如何在 vi 编辑器中搜索带有空格和特殊字符的字符串

】如何在vi编辑器中搜索带有空格和特殊字符的字符串【英文标题】:Howtosearchastringwithspacesandspecialcharactersinvieditor【发布时间】:2016-03-0607:55:40【问题描述】:我在vi编辑器中编辑。我想在文本中搜索特定短语,例如"Dec115:13:... 查看详情

如何在 PHP“回声”中插入带有撇号和其他特殊字符的文本? [复制]

】如何在PHP“回声”中插入带有撇号和其他特殊字符的文本?[复制]【英文标题】:HowtoinserttextwithapostropheandotherspecialcharactersinPHP"echo"?[duplicate]【发布时间】:2021-11-2620:48:55【问题描述】:我只能在echo\'\';撇号之间按原样... 查看详情

如何使用带有编解码器值的 python .replace 来删除特殊字符?

】如何使用带有编解码器值的python.replace来删除特殊字符?【英文标题】:Howtousepython.replacewithacodecvaluetoremovespecialcharacters?【发布时间】:2021-10-3107:03:22【问题描述】:我有一个从excel导入的数据框,该数据框在一列中的一个字... 查看详情

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

】大量联系人的重复数据删除算法【英文标题】:DataDeduplicationalgorithmforlargenumberofcontacts【发布时间】:2013-10-1109:53:53【问题描述】:我正在开发一个应用程序,它必须能够在存储在sqlserver数据库中的数十万个联系信息中查找和... 查看详情

如何在python中读取带有特殊字符的文本文件(代码片段)

我正在尝试使用特殊字符读取文本文件,例如:الحمدللهربالعالمين我正在使用:importfileinputfileToSearch="test_encoding.txt"withopen(fileToSearch,'r',encoding='utf-8')asfile:counter=0;forlineinfile:print(line)但Python崩溃了这条消息:Tracebac 查看详情

使用 spark 从 csv 文件中删除所有特殊字符

...vfileusingspark【发布时间】:2019-01-0708:44:26【问题描述】:如何使用javaspark从spark数据帧中删除csv文件中的所有特殊字符例如:下面是带有空格和特殊字符的csv文件内容"UNITEDSTATESCELLULARCORP.-OKLAHOMA",WIRELESS, 查看详情

如何从字符串中删除特殊字符?

】如何从字符串中删除特殊字符?【英文标题】:howtoremovespecialcharacterfromstring?【发布时间】:2021-07-1208:41:59【问题描述】:我目前的情况是,我有一个像“XYZName”这样的字符串,但它应该只需要前3个字符,并且在这3个字符中... 查看详情

如何使用纯 Redis 原子地删除数百万个匹配模式的键?

】如何使用纯Redis原子地删除数百万个匹配模式的键?【英文标题】:HowtoatomicallydeletemillionsofkeysmatchingapatternusingpureRedis?【发布时间】:2020-08-0513:12:25【问题描述】:假设我有数百万个prefix:<numeric_id>键。我想以原子方... 查看详情

如何在一组字符串中删除 r 中的这些特殊字符:’s,…

】如何在一组字符串中删除r中的这些特殊字符:’s,…【英文标题】:Howtoremovethesespecialcharactersinrinasetofstring:’s,…【发布时间】:2022-01-1409:09:19【问题描述】:我有这个包含特殊字符的字符串,我无法从主数据框... 查看详情

十万个为什么

...外滩不到200米 衣:3月份轻薄羽绒服、毛衣  十万个为什么十万个草泥马十万个怎么办 我是谁,从哪儿来,到哪里去。。。  查看详情