如何在Redis中删除所有内容?

885

我想删除所有的键。我希望一切都被清空,让我得到一个空白的数据库。

Redis客户端中是否有这样的方法?


5
我想知道为什么 del * 不起作用。它会返回一个0。 - Chloe
3
@Chloe del *用于删除名为“*”的键。(只有一些命令接受通配符模式,因为检查数据库中具有许多键的模式对所有键非常慢。) - Viktor Söderqvist
26个回答

1435

使用redis-cli:

  • FLUSHDB - 删除连接当前数据库中的所有键。
  • FLUSHALL - 删除当前主机上所有数据库中的所有键。

例如,在您的shell中:

redis-cli flushall

1
当我尝试上述操作时,出现了以下错误:(error) LOADING Redis is loading the dataset in memory。您能说明原因吗? - Ram Patra
8
@Ramswaroop - 你重启了 Redis,现在它正在从持久化存储中加载数据。当这个过程(加载)正在进行时,你无法操纵数据库。要么等待它完成,要么在不使用持久化的情况下配置 Redis 并重新启动它(它将为空,所以一旦启动就不需要执行 FLUSHALL)。 - Itamar Haber
@ItamarHaber 感谢您的帮助,我也发现了同样的问题。 - Ram Patra
1
@Neo 如果你在C#中没有Redis客户端库,你可以简单地运行以下命令: (new Process { StartInfo = new ProcessStartInfo { FileName = "redis-cli", Arguments = "flushall", CreateNoWindow = true }}).start(); - Christian
2
使用“-h”标志来指定Redis服务器位置。 - Adam Fowler
显示剩余4条评论

226

请注意,FLUSHALL 可能过于激进。应使用 FLUSHDB 来清空一个数据库。FLUSHALL 将清除整个服务器上的所有数据库。鉴于这个问题是关于清空数据库的,我认为这个区别重要到足以单独回答。


4
+1 我认为这实际上是更好的答案。虽然 OP 的问题说“抹掉所有东西”,但之后是“给我一个空数据库”-无论他实际上的意思是什么,我认为你所做的区分非常有用,至少可以这样说。 - doug

31
到目前为止的答案都是完全正确的,它们会删除所有的键。
但是,如果您还想从Redis实例中删除所有Lua脚本,那么您应该执行以下操作: SCRIPT FLUSH OP提出了两个问题; 这完成了第二个问题(everything wiped)。

如果您正在自己运行服务器,则最快清除所有内容的方法是终止服务器并重新启动它(我偶然发现了这一点)。 - acutesoftware

25

FLUSHALL 移除所有数据库中的键。

FLUSHDB 移除当前数据库中的所有键。

SCRIPT FLUSH 从脚本缓存中移除所有脚本。


19

你可以在终端中使用flushall

redis-cli> flushall

17
如果您正在使用redis-rb gem,则可以简单地调用以下命令:
your_redis_client.flushdb

12

这种方法对我很有效 - 删除您的Jedis集群上当前连接的数据库的所有内容。

public static void resetRedis() {
    jedisCluster = RedisManager.getJedis(); // your JedisCluster instance

    for (JedisPool pool : jedisCluster.getClusterNodes().values()) {

        try (Jedis jedis = pool.getResource()) {
            jedis.flushAll();
        }
        catch (Exception ex){
            System.out.println(ex.getMessage());
        }
    }

}

8

我这边再提供一种选择:

在我们的生产环境和预生产环境数据库中有数千个键。我们需要定期按照某些规则删除一些键、修改某些键等。当然,手动从CLI执行此操作是不现实的,尤其是在进行分片时(每个物理数据库中有512个逻辑数据库)。

出于这个目的,我编写了一个Java客户端工具,可以完成所有这些工作。在删除键时,该工具可能非常简单,只需要一个类即可:

public class DataCleaner {

    public static void main(String args[]) {
        String keyPattern = args[0];
        String host = args[1];
        int port = Integer.valueOf(args[2]);
        int dbIndex = Integer.valueOf(args[3]);

        Jedis jedis = new Jedis(host, port);

        int deletedKeysNumber = 0;
        if(dbIndex >= 0){
            deletedKeysNumber += deleteDataFromDB(jedis, keyPattern, dbIndex);
        } else {
            int dbSize = Integer.valueOf(jedis.configGet("databases").get(1));
            for(int i = 0; i < dbSize; i++){
                deletedKeysNumber += deleteDataFromDB(jedis, keyPattern, i);
            }
        }

        if(deletedKeysNumber == 0) {
            System.out.println("There is no keys with key pattern: " + keyPattern + " was found in database with host: " + host);
        }
    }

    private static int deleteDataFromDB(Jedis jedis, String keyPattern, int dbIndex) {
        jedis.select(dbIndex);
        Set<String> keys = jedis.keys(keyPattern);
        for(String key : keys){
            jedis.del(key);
            System.out.println("The key: " + key + " has been deleted from database index: " + dbIndex);
        }

        return keys.size();
    }

}

我发现编写这种工具非常容易,只需要不到5-10分钟。


7
如果使用Redis 4.0.0或更高版本,请使用FLUSHALL ASYNC,否则请使用FLUSHALL。请注意,在执行FLUSHALL ASYNC之前的所有内容都将被清除,而在执行期间进行的更改将不受影响。
参考链接:https://redis.io/commands/flushall

7
打开redis-cli并输入以下内容:
FLUSHALL

1
虽然您的帖子可能回答了问题,但缺少一些文档。请编辑您的答案并提供这些文档。 - hellow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接