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

Posted

技术标签:

【中文标题】如何删除 Redis 中的所有内容?【英文标题】:How do I delete everything in Redis? 【发布时间】:2011-10-14 16:19:04 【问题描述】:

我想删除所有键。我希望一切都消失,并给我一个空白数据库。

有没有办法在Redis 客户端中做到这一点?

【问题讨论】:

我想知道为什么del * 不起作用。它返回 0。 @Chloe del * 删除名为“*”的键。 (只有一些命令接受 glob 模式,因为针对具有许多键的数据库中的所有键检查模式非常慢。) 【参考方案1】:

使用 redis-cli:

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

例如,在你的 shell 中:

redis-cli flushall

【讨论】:

当我尝试上述操作时,我收到以下错误(error) LOADING Redis is loading the dataset in memory。你能具体说明原因吗? @Ramswaroop - 您重新启动了 Redis,它目前正在从持久存储中加载数据。虽然此过程(加载)处于活动状态,但您无法操作数据库。要么等待它完成,要么配置不带持久性的 Redis 并重新启动它(它将开始为空,因此一旦启动就不需要执行 FLUSHALL)。 @ItamarHaber 感谢您的帮助,我也想通了。 @Neo 如果您在 C# 中没有 redis 客户端库,您可以简单地运行该命令,如下所示:(new Process StartInfo = new ProcessStartInfo FileName = "redis-cli", Arguments = "flushall", CreateNoWindow = true ).start(); 使用-h标志指定redis服务器位置【参考方案2】:

请注意FLUSHALL 可能有点矫枉过正。 FLUSHDB 仅用于刷新数据库。 FLUSHALL 将清除整个服务器。就像服务器上的每个数据库一样。由于问题是关于刷新数据库,我认为这是一个足够重要的区别,值得单独回答。

【讨论】:

+1 来自我,我认为这实际上是更好的答案。诚然,OP 的问题说“清除所有内容”,但随后是“给我一个空白数据库”——不管他的实际意思是什么,我认为你所做的区分至少可以说是有用的。【参考方案3】:

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

your_redis_client.flushdb

【讨论】:

【参考方案4】:

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

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

SCRIPT FLUSH

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

【讨论】:

如果你自己运行服务器,最快的擦除所有内容的方法是杀死服务器并重新启动它(意外发现)【参考方案5】:

FLUSHALL 从所有数据库中删除所有键

FLUSHDB 从当前数据库中删除所有键

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

【讨论】:

【参考方案6】:

您可以使用 FLUSHALL 从您的每个数据库中删除所有键。 FLUSHDB 将从我们当前的数据库中删除所有键。

【讨论】:

【参考方案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 分钟。

【讨论】:

【参考方案8】:

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


【讨论】:

【参考方案9】:

FLUSHALL 删除所有现有数据库的所有键。 对于 Redis 版本 > 4.0 ,支持 FLUSHALL ASYNC,它在后台线程中运行而不会阻塞服务器 https://redis.io/commands/flushall

FLUSHDB - 删除选定数据库中的所有键。 https://redis.io/commands/flushdb

执行操作的时间复杂度将是 O(N),其中 N 是数据库中键的数量。

redis 的响应将是一个简单的字符串“OK”

【讨论】:

【参考方案10】:

如果使用(Redis 4.0.0 或更高版本)则使用FLUSHALL ASYNC,否则使用FLUSHALL

https://redis.io/commands/flushall

注意:执行FLUSHALL ASYNC 之前的所有内容都将被驱逐。在执行FLUSHALL ASYNC 期间所做的更改将不受影响。

【讨论】:

【参考方案11】:

我想有时会停止redis-server并删除rdb,aof文件。 确保没有数据可以重新加载。 然后启动 redis-server,现在它是新的和空的。

【讨论】:

【参考方案12】:
    停止 Redis 实例。 删除 RDB 文件。 启动 Redis 实例。

【讨论】:

根据我的经验,如果你有持久性,你确实应该遵循这个程序+删除任何.aof文件+发出redis-cli flushall,真正删除所有内容。【参考方案13】:

redis-cli -h &lt;host&gt; -p &lt;port&gt; flushall

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

【讨论】:

【参考方案14】:

使用service redis-server start --port 8000redis-server 启动Redis 服务器后。

使用redis-cli -p 8000作为客户端在不同的终端连接到服务器。

你可以使用任何一个

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

查看文档以了解两者的 ASYNC 选项。

如果您通过其 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')

【讨论】:

【参考方案15】:

打开 redis-cli 并输入:

FLUSHALL

【讨论】:

虽然您的帖子可能会回答这个问题,但它缺少一些文档。请编辑您的答案并提供这些答案。【参考方案16】:

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

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

如果你想刷新所有数据库中的键,那么你应该尝试flushall

【讨论】:

【参考方案17】:

如果您可以拥有 RDM(Redis 桌面管理器),那就更好了。 您可以通过在 RDM 中创建新连接来连接到您的 redis 服务器。

连接后,您可以查看实时数据,也可以使用任何 redis 命令。

在 RDM 中打开一个 cli。

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

回到你的问题 FLUSHALL 是命令,你可以简单地在 redis cli 中输入 FLUSHALL。

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

【讨论】:

【参考方案18】:

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

【讨论】:

【参考方案19】:

您可以使用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 服务器上运行此命令【参考方案20】:

如果您使用的是 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

【讨论】:

【参考方案21】:

您可以在 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

【讨论】:

【参考方案22】:

这对我有用:redis-cli KEYS \* | xargs --max-procs=16 -L 100 redis-cli DEL

它列出 redis 中的所有 Key,然后使用 xargs 传递给 redis-cli DEL,每个命令最多使用 100 个 Key,但一次运行 16 个命令,由于安全原因,在没有 FLUSHDB 或 FLUSHALL 时非常快速且有用,例如,在 Docker 或 Kubernetes 中使用来自 Bitnami 的 Redis。此外,它不需要任何额外的编程语言,只需一行代码。

【讨论】:

KEYS 在大型数据库中是一个危险的命令。首先,它可能非常缓慢。其次,密钥列表可能是要传输给客户端的大量数据。 @ViktorSöderqvist 慢:是的。一些 MB 转移给客户:是的。危险的?我不这么认为。这是Redis没有完全访问权限时的解决方案 好吧,KEYS 会影响您的应用程序的性能,但如果您要删除所有密钥,这不是问题。它被标记为@dangerous(参见COMMAND INFO KEYS)。【参考方案23】:

您可以在终端中使用 flushall

redis-cli> flushall

【讨论】:

【参考方案24】:

如果要清除windows中的redis: 在

中找到redis-cli

C:\Program Files\Redis 并运行 FLUSHALL 命令。

【讨论】:

【参考方案25】:

对于想知道如何在 C# 中执行此操作的任何人,对于同一问题,它与 answer provided for Python 相同。

我正在将 StackExchange.Redis v2.2.88 用于 dot net (core) 5 项目。我只需要清除我的密钥以进行集成测试,而我并没有在生产中这样做的目的。

我检查了 intellisense 中可用的内容,但我没有看到使用现有 API 执行此操作的常用方法。我想这是故意和设计的。幸运的是,API 确实公开了一个 Execute 方法。

我通过执行以下操作对此进行了测试:

    打开一个命令窗口。我用的是docker,所以我是通过docker来的。

    输入redis-cli 启动CLI

    输入KEYS *,它会显示我的所有密钥,以便我可以在执行以下代码之前和之后验证它们是否存在:

    //不要滥用这个,谨慎使用 var cache = ConnectionMultiplexer.Connect( 新的配置选项 端点 = “本地主机:6379” );

    var db = _cache.GetDatabase();

    db.Execute("flushdb");

    再次输入KEYS * 并查看它是空的。

希望这对寻找它的人有所帮助。

【讨论】:

以上是关于如何删除 Redis 中的所有内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何从redis-cli repl中删除Redis匹配模式中的所有键?

访问中的空白区域后如何删除所有内容

删除LRU上的Redis Hash Key字段

Redis Python - 如何在python中根据特定模式删除所有键,无需python迭代

如何删除redis中list的某个值

处理成功后如何删除redis流