【问题标题】:Delete Redis Keys matching a pattern Laravel 5.7删除与模式 Laravel 5.7 匹配的 Redis 键
【发布时间】:2020-02-18 17:00:27
【问题描述】:

我一直在搜索并尝试了多种解决方案,但可以得到任何有用的结果,我想清除/删除与模式 products:* 匹配的所有键。

以下是我尝试过的事情。

Redis::del('products:*');
Redis::del('*products:*');
Redis::del('*products*');

但没有任何效果。

如果我提供确切的密钥名称,例如:Redis::del('products:2:3:45');

正在生成这样的密钥:products:1:4:45

我已阅读文档,但可以找到有关我的查询的任何内容。

请帮忙。

【问题讨论】:

标签: php laravel caching redis laravel-5.7


【解决方案1】:

您不能按模式删除。但是你可以通过这种模式获取所有的键,然后删除它们:

Redis::del(Redis::keys('products:*'));

查看更多here

【讨论】:

    【解决方案2】:

    我在某处读到了无法根据通配符删除的内容,您需要明确给出密钥。

    还有一种方法可以获取所有键,然后对这些键运行删除。我是这样使用 cli 的:

    redis-cli KEYS "products:*" | xargs redis-cli DEL
    

    它获取与查询匹配的所有键并在它们上运行DEL。 你可以从 Laravel 执行这个命令。

    在 Laravel 中,获取所有键并使用删除它们

    Redis::del(Redis::keys('products:*'));
    

    【讨论】:

    • 当然,相应地更新您的前缀以支持前缀。 @MarufAlom
    【解决方案3】:

    在 Laravel 8 中它没有被删除,因为键有前缀 所以我所做的是在将前缀传递给 del() 之前删除前缀

    $keys = Redis::keys( 'products:*' );
    
    if ( !empty( $keys ) ){
        $keys = array_map(function ($k){
            return str_replace('_prefix_database', '', $k);
        }, $keys);
    
        Redis::del( $keys );
    }
    

    我希望这对某人有帮助

    【讨论】:

      【解决方案4】:

      我们可以使用array_map函数来遍历redis中的所有键并进行删除。

      $redis = new Redis;
      $prefix = $redis->getOption(Redis::OPT_PREFIX);
      $redis->delete(array_map(
          function ($key) use ($prefix) {
              return str_replace($prefix, '', $key);
          }, $redis->keys('*'))
      );
      

      【讨论】:

      • 从其他来源复制粘贴时请分享来源
      • 请在您的答案中添加一些解释,以便其他人可以从中学习
      【解决方案5】:

      我使用 Laravel8:

          public function handle()
          {
              $this->call('queue:flush');
      
              $arrayFailed        = Redis::connection('horizon')->keys('failed:*');
              $arrayFailedJobs    = Redis::connection('horizon')->keys('failed_jobs');
              $arrayToRemove      = array_merge($arrayFailed, $arrayFailedJobs);
      
              $arrayMap = array_map(function ($k) {
                  return str_replace(config('horizon.prefix'), '', $k);
              }, $arrayToRemove);
              Redis::connection('horizon')->del($arrayMap);
      
              $this->line('');
          }
      

      【讨论】:

        猜你喜欢
        • 2019-05-28
        • 1970-01-01
        • 2019-05-11
        • 2023-03-21
        • 2015-09-10
        • 2011-04-29
        • 1970-01-01
        • 2018-08-09
        • 1970-01-01
        相关资源
        最近更新 更多