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

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

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

【问题讨论】:

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

标签: redis


【解决方案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】:
                  1. 停止 Redis 实例。
                  2. 删除 RDB 文件。
                  3. 启动 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作为客户端在不同的终端连接到服务器。

                    你可以使用任何一个

                    1. FLUSHDB - 删除当前选定数据库的所有键。这个命令永远不会失败。此操作的时间复杂度为 O(N),N 是数据库中键的数量。
                    2. 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】:

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

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

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

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

                                    2. 输入redis-cli 启动CLI

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

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

                                      var db = _cache.GetDatabase();

                                      db.Execute("flushdb");

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

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

                                    【讨论】:

                                      猜你喜欢
                                      • 2016-10-18
                                      • 2020-12-09
                                      • 2019-07-17
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多