【问题标题】:Redis delete all keys except keys that start withRedis 删除除以
【发布时间】:2016-02-07 06:59:29
【问题描述】:

我的 redis 集合包含许多键

我希望能够将它们全部刷新,除了以以下开头的所有键:

“配置::”

这可能吗?

【问题讨论】:

    标签: redis


    【解决方案1】:

    你可以这样做

    redis-cli KEYS "*" | grep -v "configurations::" | xargs redis-cli DEL
    

    列出所有键到redis,从列表中删除包含“configurations::”的键并从redis中删除它们

    编辑 正如@Sergio Tulentsev 注意到的那样,它的密钥不适用于生产。我使用这个 python 脚本来删除生产 redis 上的键。在调用脚本之前,我停止了从 master 到 slave 的复制。

    #!/usr/bin/env python
    import redis
    import time
    
    pattern = "yourpattern*"
    
    poolSlave = redis.ConnectionPool(host='yourslavehost', port=6379, db=0)
    redisSlave = redis.Redis(connection_pool=poolSlave)
    
    poolMaster = redis.ConnectionPool(host='yourmasterhost', port=6379, db=0)
    redisMaster = redis.Redis(connection_pool=poolMaster)
    
    
    cursor = '0'
    while cursor != 0:
            cursor, data = redisSlave.scan(cursor, pattern, 1000)
            print "cursor: "+str(cursor)
            for key in data:
                    redisMaster.delete(key)
                    print "delete key: "+key
            # reduce call per second on production server
            time.sleep(1) 
    

    【讨论】:

    • 不鼓励使用 KEYS,但是是的,可以在紧要关头使用它。
    • 你是对的@SergioTulentsev,如果在生产中,你可以挂载另一个redis,并在生产中转储你的redis。您在转储上执行 Keys * 并在主服务器上执行删除。
    【解决方案2】:

    SCAN & DEL 方法(由@khanou 提出)是最好的临时解决方案。或者,您可以使用 Redis 集保留所有 configurations:: 键名称的索引(只要您创建新的 configurations:: 键,只需将 SADD 键的名称添加到它)。一旦你有了这个集合,你就可以SSCAN 它来更有效地获取所有相关的键名(尽管当你DEL 时不要忘记从它SREM)。

    【讨论】:

      【解决方案3】:

      是的,这是可能的。枚举所有键,评估每个键,如果符合删除条件则删除。

      如果这是您所要求的,则没有内置的 redis 命令。

      也许可以编写一个 Lua 脚本来执行此操作(它会在您的应用程序中查看它是一个命令),但它仍然是相同的方法。

      【讨论】:

        猜你喜欢
        • 2017-05-06
        • 2022-01-12
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 2018-03-10
        • 2017-04-02
        • 2018-07-29
        相关资源
        最近更新 更多