怎么使用命令批量删除匹配的 key 值?

299 天前
 JimmyChan1506

使用下面的命令可以查到一堆 key

redis-cli -a myPassword -h redis-host -p 6379 --scan --pattern '*myKey*' 

但使用下面的命令,却无法删除成功

redis-cli -a myPassword -h redis-host -p 6379 --scan --pattern '*myKey*' | xargs redis-cli -a myPassword -h redis-host -p 6379 unlink 
(integer) 0

当然了, 把 unlink 改成 del 也是一样的效果, 不知道大家有没有解决过一样的问题?

1455 次点击
所在节点    Redis
20 条回复
Azone
299 天前
xargs 是不是少个 -n 1 的参数
JimmyChan1506
299 天前
@Azone 加了试了一下还是没有能成功删除
Red998
299 天前
用 lua 脚本删除呗 、数据不多 就直接 del
Red998
299 天前
unlink 可不一样 虽然是卸载了查询不到 但是 redis 还没有真正释放内存、有定时任务会清理。del 就是直接释放内存空间。但是如果大 key 删除就会阻塞其他命令
aaronkk
299 天前
据量大的话要避免阻塞,用 unlink 异步删除比 del 更安全
8355
299 天前
用 lua 脚本
local keys = redis.call('KEYS', 'aaa*')
for i, key in ipairs(keys) do
redis.call('UNLINK', key)
end
8355
299 天前
@Red998 #4 说的对,类似大 hash 和 list 的话这种还是建议 unlink 删
JimmyChan1506
299 天前
@Red998 主要是想知道这种命令应该怎么写, 删 key 倒不是目的了
aaronkk
299 天前
集群,带上-c 参数试试
JimmyChan1506
299 天前
@aaronkk 加了, 没用
JimmyChan1506
299 天前
@Azone 加了-t 和-n 1 参数后, 发现是把 key 按空格键对一个 key 进行多行分割了, 不明白为何加了 -n 1 之后还是会出现这种情况 .....
JimmyChan1506
299 天前
key 是类似于 "aaa::bb{cc='a', id=null } theReqeust[id=null;no=aa;]" 这样的形式
rrfeng
299 天前
先看看 scan 。的输出啊,不一定是只有 key
xargs 直接干也是够大胆…
yangxx
299 天前
用这样的命令试下,redis-cli -h localhost --scan --pattern '*test*' |xargs -n 1 echo unlink |redis-cli -h localhost
pubby
299 天前
按行读取试试

SCAN | while read k; do DEL $k; done
dorothyREN
299 天前
redis-cli -a myPassword -h redis-host -p 6379 keys '*myKey*' | | xargs redis-cli -a myPassword -h redis-host -p 6379 DEL
worldOnlyYou
299 天前
redis-cli scan 返回的 key 前面还有序号的,你这样直接删肯定不行
JimmyChan1506
298 天前
@worldOnlyYou 那应该怎么搞呢?
JimmyChan1506
297 天前
@worldOnlyYou 我把 xargs 前面的部分执行, 取其中一个 key 来 del, 是没有问题的
JimmyChan1506
297 天前
@rrfeng 测试环境, 为开发方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/956790

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX