How to delete multiple redis keys with the same pattern in PHP using phpredis?

25,670

Solution 1

No - Redis' DELlete 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);
Share:
25,670
RedGiant
Author by

RedGiant

Updated on July 12, 2022

Comments

  • RedGiant
    RedGiant almost 2 years

    By using phpredis, I have saved some data in pagination like this:

       review/itemA/1
       review/itemA/2 
    

    where 1 and 2 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.