删除匹配模式的Redis键 Laravel 5.7

9

我一直在搜索并尝试多种解决方案,但没有得到任何有帮助的结果,我想清除/删除所有符合模式products:*的键。

以下是我尝试过的事情。

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

但是什么都没用。

如果我提供准确的键名,例如:Redis::del('products:2:3:45');,它会删除密钥。

键是这样生成的:products:1:4:45

我已经阅读了文档,但没有找到关于我的问题的任何信息。

请帮忙解决。


请参考 https://dev59.com/-o7ea4cB1Zd3GeqPDZp3。这可能会解决你的问题。 - Ali Khalili
6个回答

24

您无法通过模式进行删除。但是您可以通过该模式获取所有键,然后将它们删除:

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

更多信息请点击这里查看。


3
Laravel Framework 9.3.0 中运行得非常顺畅。 - Lounis
1
无法与Laravel 10.x兼容。 - undefined

4

我在某处读到,你无法使用通配符删除内容,你需要明确指定键。

仍然有一种方法可以获取所有的键,然后对这些键运行删除。我使用命令行进行操作,具体如下:

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

它会提取所有与查询匹配的键,并对其运行DEL。您可以在Laravel中执行此命令。

在Laravel中,使用以下方法获取所有键并将其删除:

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

当然,更新您的前缀以支持前缀。@MarufAlom - Danyal Sandeelo

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 );
}

希望此内容对某人有所帮助


这在 Laravel 7 中也很有效。谢谢! - Christine Treacy

0

使用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('');
    }

0
我们可以使用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('*'))
);

3
请在从其他来源复制粘贴内容时分享出处。 - Danyal Sandeelo
请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase

0
Laravel 10x: 假设我们有一个通过Predis客户端建立的Redis实例和连接:
$client = new Predis\Client();
$client->del(Redis::keys("products*")

我认为Redis::keys()方法获取带有前缀的键,所以Redis::del()方法第二次删除时也会包含前缀。

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