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


709

我要删除所有密钥。我希望一切都消灭,然后给我一个空白的数据库。

Redis客户端有办法做到这一点吗?


3
我想知道为什么del *不起作用。返回0
克洛伊

1
重启redis服务器将清理其中的所有数据,rit?@Timex
AATHITH RAJENDRAN

Answers:


1177

使用redis-cli:

  • FLUSHDB –从连接的当前数据库中删除所有密钥。
  • FLUSHALL –从所有数据库中删除所有键。

例如,在您的shell中:

redis-cli flushall

1
当我尝试上述操作时,出现以下错误(error) LOADING Redis is loading the dataset in memory。您可以指定原因吗?
拉姆·帕特拉

4
@Ramswaroop-重新启动Redis,它当前正在从持久性存储中加载数据。在此过程(加载)处于活动状态时,您无法操作数据库。等待它完成,或者配置不带持久性的Redis并重新启动它(它将开始为空,因此一旦启动,您将不需要执行FLUSHALL)。
Itamar Haber 2014年

@ItamarHaber感谢您的帮助,我也想通了。
拉姆·帕特拉

1
@Neo如果您在C#中没有Redis客户端库,则可以简单地运行该命令,如下所示: (new Process { StartInfo = new ProcessStartInfo { FileName = "redis-cli", Arguments = "flushall", CreateNoWindow = true }}).start();
Christian

2
使用该-h标志指定redis服务器位置
Adam F

194

抬起头来FLUSHALL可能太过猛烈了。FLUSHDB是仅刷新数据库的一个。FLUSHALL将清除整个服务器。就像服务器上的每个数据库一样。由于问题是关于刷新数据库的,所以我认为这是一个足够重要的区别,值得单独回答。


4
向我+1,我认为这实际上是更好的答案。诚然,OP的问题说“清除所有内容”,但随后是“给我一个空白数据库”-不管他实际上是什么意思,至少可以这样说,我认为您所做的区分是有用的。
doug

28

到目前为止,答案是绝对正确的。他们删除所有密钥。

但是,如果您还想从Redis实例中删除所有Lua脚本,则应遵循以下步骤:

脚本冲洗

OP提出两个问题;这就完成了第二个问题(所有内容均已删除)。


4
不,他问了一个问题,从那以后的两年中,Redis的范围扩大了。OP的问题专门关于删除密钥。您正在回答的问题与此问题不同。
真实法案

15
@TheRealBill您必须考虑什么对当前和将来的SO读者有用。这些问题的答案在这里没有涉及到OP的I want everything wiped out and give me a blank database.问题。因此,恕我直言,我的加入是一项很好的工作,对一些人有所帮助。随意不同意课程,这也是SO的意义所在。
Tw Bert 2014年

2
上下文就是一切,第一句话确定了上下文:“我想删除所有键”。改写问题以给出不同的答案并不是我所知道的。这是关于询问给定的问题-因此,指示正在审查的答案的适度标志正在回答另一个问题。但是,意见不同。
真实法案

如果您自己运行服务器,则擦除所有内容的最快方法是杀死服务器并重新启动它(偶然发现)
急性软件2014年


15

如果您使用的是redis-rb gem,则可以简单地调用:

your_redis_client.flushdb

11

此方法对我有用-删除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());
        }
    }

}

7

我这边还有一个选择:

在我们的生产和生产前数据库中,有成千上万的密钥。我们有时需要删除一些键(通过某些掩码),通过某些条件进行修改等。当然,无法从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分钟。



4

您可以使用FLUSHALL从所有数据库中删除所有键。如FLUSHDB将从当前数据库中删除所有密钥。



3
  1. 停止Redis实例。
  2. 删除RDB文件。
  3. 启动Redis实例。

3

打开redis-cli并输入:

FLUSHALL

1
尽管您的帖子可能会回答该问题,但缺少一些文档。请编辑您的答案并提供。
hellow

2

我认为有时会停止redis服务器并删除rdb,aof文件。确保没有数据可以重新加载。然后启动redis服务器,现在它是新的并且是空的。


2

redis-cli -h <host> -p <port> flushall

它将从连接的客户端(带有主机和端口)中删除所有数据


2

在使用以下方式启动Redis服务器之后:service redis-server start --port 8000redis-server

用于redis-cli -p 8000在另一个终端中作为客户端连接到服务器。

您可以使用

  1. FLUSHDB-删除当前所选数据库的所有键。此命令永远不会失败。此操作的时间复杂度为O(N),N为数据库中键的数量。
  2. FLUSHALL-删除所有现有数据库的所有键,而不仅仅是当前选择的键。此命令永远不会失败。此操作的时间复杂度为O(N),N为所有现有数据库中键的数量。

查阅两个文档的ASYNC选项。

如果您通过Redis的python界面使用Redis,请将以下两个功能用于相同的功能:

def flushall(self):
    "Delete all keys in all databases on the current host"
    return self.execute_command('FLUSHALL')

def flushdb(self):
    "Delete all keys in the current database"
    return self.execute_command('FLUSHDB')

1

您的问题似乎与删除数据库中的整个密钥有关。在这种情况下,您应该尝试:

  1. 连接到redis。您可以使用命令redis-cli(如果在端口6379上运行),否则还必须指定端口号。
  2. 选择数据库(命令select {Index}
  3. 执行命令 flushdb

如果要刷新所有数据库中的键,则应尝试flushall



1

您可以使用 FLUSHDB

例如

列出数据库:

127.0.0.1:6379> info keyspace
# Keyspace

清单键

127.0.0.1:6379> keys *
(empty list or set)

向键添加一个值

127.0.0.1:6379> lpush key1 1
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=1,expires=0,avg_ttl=0

用两个值创建另一个键

127.0.0.1:6379> lpush key2 1
(integer) 1
127.0.0.1:6379> lpush key2 2
(integer) 2
127.0.0.1:6379> keys *
1) "key1"
2) "key2"
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=2,expires=0,avg_ttl=0

列出key2中的所有值

127.0.0.1:6379> lrange key2 0 -1
1) "2"
2) "1"

FLUSHDB

127.0.0.1:6379> flushdb
OK

列出密钥和数据库

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> info keyspace
# Keyspace

keys *命令是昂贵的命令。不要在生产
Redis

1

您可以在python中使用以下方法

def redis_clear_cache(self):

    try:
        redis_keys = self.redis_client.keys('*')
    except Exception as e:
        # print('redis_client.keys() raised exception => ' + str(e))
        return 1

    try:
        if len(redis_keys) != 0:
            self.redis_client.delete(*redis_keys)
    except Exception as e:
        # print('redis_client.delete() raised exception => ' + str(e))
        return 1

    # print("cleared cache")
    return 0

0

如果可以拥有RDM(Redis Desktop Manager),效果会更好。您可以通过在RDM中创建新连接来连接到Redis服务器。

连接后,您可以检查实时数据,也可以使用任何redis命令进行操作。

在RDM中打开CLI。

1)右键单击连接,您将看到一个控制台选项,只需单击它,一个新的控制台窗口将在RDM的底部打开。

回到您的问题FLUSHALL是命令,您只需在redis cli中键入FLUSHALL。

此外,如果您想了解任何redis命令及其正确用法,请转到下面的链接。 https://redis.io/commands


0

有不同的方法。如果要从远程执行此操作,请通过命令行工具redis-cli或任何工具(例如telnet,一种编程语言SDK)向该实例发出flushall。或者只是登录该服务器,终止该进程,删除其dump.rdb文件和appendonly.aof(在删除之前备份它们)。


0

如果您使用的是Java,则可以从文档中根据用例使用其中任何一种。

/**
 * Remove all keys from all databases.
 *
 * @return String simple-string-reply
 */
String flushall();

/**
 * Remove all keys asynchronously from all databases.
 *
 * @return String simple-string-reply
 */
String flushallAsync();

/**
 * Remove all keys from the current database.
 *
 * @return String simple-string-reply
 */
String flushdb();

/**
 * Remove all keys asynchronously from the current database.
 *
 * @return String simple-string-reply
 */
String flushdbAsync();

码:

RedisAdvancedClusterCommands syncCommands = // get sync() or async() commands 
syncCommands.flushdb();

阅读更多:https : //github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.