我一直在搜索并尝试多种解决方案,但可以获得任何帮助结果,我想清除/删除所有匹配模式的键
products:*
。
以下是我尝试过的事情。
Redis::del('products:*');
Redis::del('*products:*');
Redis::del('*products*');
但没有任何效果。
如果我提供确切的键名称,则正在删除键:
Redis::del('products:2:3:45');
密钥的生成方式如下:products:1:4:45
我已阅读文档,但可以找到有关我的查询的任何内容。
请帮忙。
我在某处读到,您无法根据通配符删除,您需要明确给出密钥。
仍然有一种方法可以获取所有键,然后对这些键运行删除。我使用这样的 cli 来完成它:
redis-cli KEYS "products:*" | xargs redis-cli DEL
它获取与查询匹配的所有键并对它们运行
DEL
。
您可以从 Laravel 执行此命令。
在 Laravel 中,获取所有键并使用
对它们运行删除Redis::del(Redis::keys('products:*'));
在 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 );
}
我希望这对某人有帮助
我们可以使用 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('*'))
);
在 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('');
}
Laravel 10x:
假设我们有一个 Redis 实例并通过 Predis 客户端建立连接:
$client = new Predis\Client();
$client->del(Redis::keys("products*")
我认为 Redis::keys() 方法获取带有前缀的键,因此 Redis::del() 第二次再次包含前缀。