How to delete multiple redis keys with the same pattern in PHP using phpredis?
Solution 1
No - Redis' DEL
lete does not accept wildcards, you have to name the keys explicitly. See here for possible directions: https://stackoverflow.com/a/23399125/3160475
Solution 2
When using phpredis
, you can get the prefix (which phpredis automatically prepends everywhere) and delete a pattern of keys that way :
<?php
...
$prefix = $redisClient->getOption(Redis::OPT_PREFIX);
$redisClient->delete(array_map(
function ($key) use ($prefix) {
return str_replace($prefix, '', $key);
}, $redisClient->keys('*'))
);
Solution 3
$bash = 'redis-cli --scan --pattern "' . $path . '*" | xargs -L 1000 redis-cli DEL';
$res = @shell_exec($bash);
Solution 4
I just use
$redis->delete($redis->keys('*'));
It's works fine for me.
Solution 5
Predis (->del
) allows to pass a keys array too.
It works here and is faster than the del
inside the foreach
.
$prefix = $this->client->getOptions($this->OPT_PREFIX);
$keys = $this->client->keys("$key*");
if ($keys) $this->client->del($keys);
RedGiant
Updated on July 12, 2022Comments
-
RedGiant almost 2 years
By using phpredis, I have saved some data in pagination like this:
review/itemA/1 review/itemA/2
where
1
and2
are page numbers. I read in the document that you can use wildcards to retrieve multiple keys.$allKeys = $redis->keys('*'); // all keys will match this. $keyWithUserPrefix = $redis->keys('user*');
But can I delete all the old keys using wildcards as well when someone has posted a new review? Can I do something like:
$redis->delete('review/itemA/*'); // or $redis->delete('review/itemA*')
It didn't work however.