Laravel-擦除所有包含特定字符串的缓存/ redis密钥



是否可以使用 Laravel 擦除 redis 中与特定字符串匹配的所有键?例如,如果我想忘记带有产品一词的键,它会忘记以下键:

拉维尔:896235872385237588327582370375ACACA235325:产品列表拉拉维尔:896235872385237588327582370375aca235325:产品分类

我会在 redis 服务器上运行它,但我想知道是否有更好的东西可以直接通过 Laravel 运行:

redis-cli keys "*" | grep "products" | xargs redis-cli DEL

为什么不:

public function forget($key_name)
{
    $redis = Cache::getRedis();
    $keys = $redis->keys("*$key_name*");
    $count = 0;
    foreach ($keys as $key) {
        $redis->del($key);
        $count++;
    }      
    return $count;  
}

对于生产环境,应使用扫描光标 [匹配模式] [计数] 而不是"键"

http://redis.io/commands/scan

因为您不想在 redis 中有数万个密钥的情况下耗尽内存,并且您不希望使用"密钥"阻止整个 redis 实例。

这是使用扫描而不是键的替代方法。如果需要,可以随意将其转换为递归函数。

public function forgetWildcard(string $pattern, int $maxCountValue = 1000)
{
        $redis = Cache::getRedis();
        $currentCursor = '0';
        do {
            $response = $redis->scan($currentCursor, 'MATCH', $pattern, 'COUNT', $maxCountValue);
            $currentCursor = $response[0];
            $keys = $response[1];
            if (count($keys) > 0) {
                // remove all found keys
                $redis->del($keys);
            }
        } while ($currentCursor !== '0'); // finish if current Cursor is reaching '0'
}

提示:为了使它适用于带有前缀的Laravel,我不得不将模式替换为以下内容:$this->getPrefix().'*:'.$pattern

所以我找到了一种方法来做到这一点 - 不是你想经常做的事情,因为它使用了 redis keys 命令:

public function forget($key_name)
    {
        $redis = Cache::getRedis();
        $keys = $redis->keys("*");
        $count = 0;
        foreach ($keys as $key) {
            if (strpos($key, $key_name)) {
                $redis->del($key);
                $count++;
            }
        }      
        return $count;  
    }

最新更新