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

时间:2016-01-28 23:53:15

标签: laravel caching redis

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

laravel:896235872385237588327582370375acaca235325:产品列表 laravel:896235872385237588327582370375acaca235325:产品类别

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

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

3 个答案:

答案 0 :(得分:6)

为什么不:

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;  
}

对于生产环境SCAN游标[MATCH模式] [COUNT count]应该用来代替“keys”

http://redis.io/commands/scan

因为如果你在redis中有数万个密钥,并且你不想使用“密钥”阻止你的整个redis实例,你不想耗尽内存。

答案 1 :(得分:2)

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

Stack<Animal>

提示:为了使它适用于带前缀的Laravel,我必须将模式替换为以下内容: 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' }

答案 2 :(得分:0)

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

Task.findAll({
  group: [sequelize.fn('date_trunc', 'day', sequelize.col('createdAt'))]
})