删除与模式 Laravel 5.7 匹配的 Redis 键

问题描述 投票:0回答:6

我一直在搜索并尝试多种解决方案,但可以获得任何帮助结果,我想清除/删除所有匹配模式的键

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
6个回答
24
投票

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

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

查看更多这里


4
投票

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

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

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

它获取与查询匹配的所有键并对它们运行

DEL
。 您可以从 Laravel 执行此命令。

在 Laravel 中,获取所有键并使用

对它们运行删除
Redis::del(Redis::keys('products:*'));

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

我希望这对某人有帮助


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('*'))
);

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
投票

Laravel 10x:
假设我们有一个 Redis 实例并通过 Predis 客户端建立连接:

$client = new Predis\Client();
$client->del(Redis::keys("products*")

我认为 Redis::keys() 方法获取带有前缀的键,因此 Redis::del() 第二次再次包含前缀。

© www.soinside.com 2019 - 2024. All rights reserved.