V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JimmyChan1506
V2EX  ›  Redis

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

  •  
  •   JimmyChan1506 · 2023-07-14 16:17:18 +08:00 · 1699 次点击
    这是一个创建于 500 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用下面的命令可以查到一堆 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 也是一样的效果, 不知道大家有没有解决过一样的问题?

    20 条回复    2023-07-17 08:39:39 +08:00
    Azone
        1
    Azone  
       2023-07-14 16:37:08 +08:00
    xargs 是不是少个 -n 1 的参数
    JimmyChan1506
        2
    JimmyChan1506  
    OP
       2023-07-14 16:45:06 +08:00
    @Azone 加了试了一下还是没有能成功删除
    Red998
        3
    Red998  
       2023-07-14 16:55:23 +08:00
    用 lua 脚本删除呗 、数据不多 就直接 del
    Red998
        4
    Red998  
       2023-07-14 16:59:10 +08:00
    unlink 可不一样 虽然是卸载了查询不到 但是 redis 还没有真正释放内存、有定时任务会清理。del 就是直接释放内存空间。但是如果大 key 删除就会阻塞其他命令
    aaronkk
        5
    aaronkk  
       2023-07-14 17:10:46 +08:00
    据量大的话要避免阻塞,用 unlink 异步删除比 del 更安全
    8355
        6
    8355  
       2023-07-14 17:13:05 +08:00
    用 lua 脚本
    local keys = redis.call('KEYS', 'aaa*')
    for i, key in ipairs(keys) do
    redis.call('UNLINK', key)
    end
    8355
        7
    8355  
       2023-07-14 17:13:57 +08:00
    @Red998 #4 说的对,类似大 hash 和 list 的话这种还是建议 unlink 删
    JimmyChan1506
        8
    JimmyChan1506  
    OP
       2023-07-14 17:15:49 +08:00
    @Red998 主要是想知道这种命令应该怎么写, 删 key 倒不是目的了
    aaronkk
        9
    aaronkk  
       2023-07-14 17:26:35 +08:00
    集群,带上-c 参数试试
    JimmyChan1506
        10
    JimmyChan1506  
    OP
       2023-07-14 17:43:17 +08:00
    @aaronkk 加了, 没用
    JimmyChan1506
        11
    JimmyChan1506  
    OP
       2023-07-14 17:44:38 +08:00
    @Azone 加了-t 和-n 1 参数后, 发现是把 key 按空格键对一个 key 进行多行分割了, 不明白为何加了 -n 1 之后还是会出现这种情况 .....
    JimmyChan1506
        12
    JimmyChan1506  
    OP
       2023-07-14 17:54:15 +08:00
    key 是类似于 "aaa::bb{cc='a', id=null } theReqeust[id=null;no=aa;]" 这样的形式
    rrfeng
        13
    rrfeng  
       2023-07-14 18:07:39 +08:00 via Android
    先看看 scan 。的输出啊,不一定是只有 key
    xargs 直接干也是够大胆…
    yangxx
        14
    yangxx  
       2023-07-14 18:26:18 +08:00
    用这样的命令试下,redis-cli -h localhost --scan --pattern '*test*' |xargs -n 1 echo unlink |redis-cli -h localhost
    pubby
        15
    pubby  
       2023-07-14 20:50:59 +08:00 via iPhone
    按行读取试试

    SCAN | while read k; do DEL $k; done
    dorothyREN
        16
    dorothyREN  
       2023-07-14 21:46:51 +08:00
    redis-cli -a myPassword -h redis-host -p 6379 keys '*myKey*' | | xargs redis-cli -a myPassword -h redis-host -p 6379 DEL
    worldOnlyYou
        17
    worldOnlyYou  
       2023-07-15 10:54:34 +08:00
    redis-cli scan 返回的 key 前面还有序号的,你这样直接删肯定不行
    JimmyChan1506
        18
    JimmyChan1506  
    OP
       2023-07-15 20:06:49 +08:00
    @worldOnlyYou 那应该怎么搞呢?
    JimmyChan1506
        19
    JimmyChan1506  
    OP
       2023-07-17 08:39:15 +08:00
    @worldOnlyYou 我把 xargs 前面的部分执行, 取其中一个 key 来 del, 是没有问题的
    JimmyChan1506
        20
    JimmyChan1506  
    OP
       2023-07-17 08:39:39 +08:00
    @rrfeng 测试环境, 为开发方便
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5663 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:12 · PVG 11:12 · LAX 19:12 · JFK 22:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.