如何使用命令行清除laravel中的缓存?

14

我正在使用Redis在Laravel 5.2中缓存查询/路由。

我在同一台Web服务器上运行3个环境,即“生产”、“暂存”和“开发”。

对于每个环境,我设置了不同的缓存prefix值,以便将缓存链接到不同的环境。

config/cache.php文件中,我更改了以下行:

'prefix' => 'laravel',

'prefix' => ENV('CACHE_PREFIX', 'laravel'),

然后在我的.env文件中,我像这样为每个环境添加了前缀

对于开发环境

CACHE_PREFIX="LaravelDev"

用于暂存环境

CACHE_PREFIX="LaravelStaging"

生产环境

CACHE_PREFIX="LaravelProduction"

我知道我可以像这样从命令行清除缓存

php artisan cache:clear

但是上面的代码将清除所有环境的缓存。

我只想清除“LaravelDev”的缓存,而不影响“LaravelStaging”和“LaravelProduction”的缓存。

如何清除特定环境的缓存?

2个回答

1

不要使用CACHE_PREFIX,而是可以使用不同的redis数据库。例如:production => 1,staging => 2,development => 3。 如果您想更加熟悉它,请使用以下链接:

  1. 多个Redis数据库的意义是什么?
  2. 列出所有Redis数据库

因此,在每个环境(生产/阶段/开发)的.env文件中,您需要定义不同的REDIS_CACHE_DB env值。

使用此变量的行的链接 https://github.com/laravel/laravel/blob/2a2522d8824c0852e30a7e3e07d46a543eb4b33d/config/database.php#L142。 .env示例:

.env.production

REDIS_CACHE_DB=1

.env.stage

REDIS_CACHE_DB=2

.env.development

REDIS_CACHE_DB=3

在更改环境变量后,不要忘记清除配置缓存:https://laravel.com/docs/7.x/configuration#configuration-caching

希望这能帮到你!


0

cache:clear Artisan命令会调用当前连接器上的flush函数。由于缓存引擎的功能不同,我认为无法选择性地过期密钥,保持缓存API的通用性。像Redis这样的引擎提供了这样的功能,但memcached却没有。

如果您正在使用Redis,则可以修改默认连接器以使用“SCAN / DEL”命令来执行flush()方法。但是,这并不会非常有效。

如果您的应用程序正确使用缓存,则清除缓存不应该导致任何问题,因为缓存将重新构建自身。您永远不应该期望某些数据在缓存中,因为它可能会过期。


当我执行php artisan cache:clear时,它会清除Redis中的所有内容。我刚刚再次测试了一下。我看到的问题是使用应用程序的用户将因为会话也被清除而收到“令牌不匹配”错误。 - Jaylen
解决方案是在您的 Staging 和 Dev 环境中使用不同的存储类型来存储会话,这样清除缓存就不会影响到实时用户。 - Chris Cynarski
我不能创建一个命令行来执行以下代码吗?$redis = Cache::getRedis();$keys = $redis->keys(Cache::getPrefix() . "*");foreach($keys as $key) { Cache::forget($key); } - Jaylen
没问题,只要你的缓存中没有成千上万个键值对,这样就不会超出可用内存。直接与Redis通信,你可以使用SCAN / MATCH / COUNT命令组合。 - Chris Cynarski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接