7

通过使用phpredis,我在分页中保存了一些数据,如下所示:

   review/itemA/1
   review/itemA/2 

其中12是页码。我在文档中读到您可以使用通配符来检索多个键。

$allKeys = $redis->keys('*');   // all keys will match this.
$keyWithUserPrefix = $redis->keys('user*');

但是,当有人发布新评论时,我是否也可以使用通配符删除所有旧键?我可以做类似的事情:

$redis->delete('review/itemA/*'); // or  $redis->delete('review/itemA*')

然而它没有用。

4

7 回答 7

4

否 - Redis 的DELlete 不接受通配符,您必须明确命名键。有关可能的方向,请参见此处:https ://stackoverflow.com/a/23399125/3160475

于 2015-08-30T11:26:39.197 回答
3

使用时phpredis,您可以获得前缀(phpredis 会自动在任何地方添加前缀)并以这种方式删除键模式:

<?php
...

$prefix = $redisClient->getOption(Redis::OPT_PREFIX);
$redisClient->delete(array_map(
    function ($key) use ($prefix) {
        return str_replace($prefix, '', $key);
    }, $redisClient->keys('*'))
);
于 2017-09-01T13:27:19.973 回答
1

Predis ( ->del) 也允许传递一个键数组。
它在这里工作并且比del内部更快foreach

$prefix = $this->client->getOptions($this->OPT_PREFIX);
$keys = $this->client->keys("$key*");
if ($keys) $this->client->del($keys);
于 2018-09-05T08:57:44.413 回答
1
$bash = 'redis-cli --scan --pattern "' . $path . '*" | xargs -L 1000 redis-cli DEL';

$res = @shell_exec($bash);
于 2016-12-16T09:02:29.443 回答
1

我只是用

$redis->delete($redis->keys('*'));

这对我来说很好。

于 2017-07-17T09:55:56.547 回答
0

使用Predis,我这样做:

    public function delete($key) {
        $keys = $this->client->keys($key);
        foreach ($keys as $key) {
            $this->client->del($key);
        }
    }
于 2018-03-22T13:05:30.470 回答
0

删除功能没有通配符。解决方法如下,

// returns total number of keys deleted
function delete($key) {
    if (empty($key)) {  // empty key can delete all
      return false;
    }
    $keys = $redis->keys("$key*");  // keys() function returns array of key strings. `*` wild card pattern can be changed as per need
    if(!$keys) {
        return 0;
    }
    $prefix = $redis->getOption(\Redis::OPT_PREFIX); // keys already have prefix, so we clear until delete finish.
    $redis->setOption(\Redis::OPT_PREFIX, '');
    $count = $redis->del($keys);  // del() function delete array of keys and returns number of keys deleted.
    $redis->setOption(\Redis::OPT_PREFIX, $prefix);

    return $count;
}

注意:正如@Akash Gangrade 评论的那样,由于性能原因,不建议使用 keys()。您可以考虑基于标签的缓存失效,例如https://symfony.com/doc/current/components/cache/cache_invalidation.html#tag-aware-adapters

于 2021-01-20T16:52:40.990 回答