【问题标题】:Delete keys from redis server using redis-cli使用 redis-cli 从 redis 服务器中删除密钥
【发布时间】:2017-10-08 20:03:03
【问题描述】:

我正在尝试使用模式从 redis 服务器删除 KEYS,但它没有被删除。

示例键

1) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x03\t\xa0\x01"
2) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x03\t\x98\x02"
3) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x03\t\xb8\x02"
4) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x02\t!"
5) "flc_1310sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x02\t~"
6) "flc_1310sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x03\t\xc0\x02"
7) "flc_-41sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x03\t\xc5\x01"
8) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x03\t\x94\x03"
9) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x03\t\xd3\x01"
10) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x03\t\xee\x02"

命令

redis-cli 键 *sandeep-pant* | xargs redis-cli DEL

输出

xargs: WARNING: a NUL character occurred in the input.  It cannot be passed through in the argument list.  Did you mean to use the --null option?
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
(integer) 0

【问题讨论】:

  • * 是一个 bash 控制字符

标签: redis redis-cli


【解决方案1】:

如果您不想编写 bash 脚本,请使用此单行代码

redis-cli --scan --pattern "*sandeep-pant*" | sed -e 's/^/"/g' -e 's/$/"/g' | xargs -i redis-cli del {}

解释:

  1. 逐行获取匹配的键
  2. sed 在每个键的开头和结尾添加引号
  3. xargs 会一一删除记录。

{} 是脚本中应放置密钥的标记

【讨论】:

  • 谢谢,解决了我的问题。这在没有 sed 位的情况下可以正常工作,但在某些键上停止工作,即使它们似乎没有任何奇怪的引号/编码。
  • 谢谢!我一直在寻找解决我的xargs: unterminated quote 问题的方法,这解决了它。
【解决方案2】:

您不应该使用KEYS,因为它是一个阻塞操作,而是使用SCAN。 如果您使用 glob 模式,请用引号将其括起来:

redis-cli --scan --pattern '*sandeep-pant*' | xargs -L 100 redis-cli del

您可以使用-L 100 批量处理DEL 操作,每次有100 个键。

【讨论】:

  • 是的,这个比我的好多了。
【解决方案3】:

Bash 代码:

for k in $(redis-cli -a password1 keys "*"); do
  echo "delete key '$k'";
  redis-cli -a password1 DEL $k;
done

如果不需要密码,请删除-a password1

【讨论】:

    【解决方案4】:

    您可能想阅读documentation about DEL - 当您这样做时,您会注意到它不接受键名模式(即通配符),但需要准确的键名才能删除。

    【讨论】:

    • 我尝试使用模式删除键,它正在工作。 [root@dmc31 ~]# redis-cli SET key1 "Hello" OK [root@dmc31 ~]# redis-cli SET key2 "World" OK [root@dmc31 ~]# redis-cli KEYS *key* 1) "key2 " 2) "key1" [root@dmc31 ~]# redis-cli KEYS *key* | xargs redis-cli DEL (integer) 2
    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2020-05-30
    • 2016-12-05
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多