Laravel 是否有任何缓存机制可以在当前脚本/请求期间缓存某些内容?无论是使用 FileCache 或 DatabaseCache 等缓存驱动程序,还是仅使用内存缓存。
例如,我有一些非常违反并且经常更改的数据,并且我的脚本在多个地方获取它。所以我想在第一次获取它后缓存它,但在当前脚本执行完成后忘记它(所以在下一个请求时它会再次获取它)。
这相当于我有一些全局变量
$cache
或类似的变量,我可以在其中存储例如$cache['options']
。 Laravel 中已经有类似的东西了吗?
谢谢你。
一种方法是遵循执行重复功能的类的单例模式。
您还可以将类的实例绑定到服务容器,并在需要使用它的地方引入该依赖项。
https://laravel.com/docs/5.4/container
单例或实例绑定将允许您的应用程序在单次执行期间的任何位置共享类的相同实例。
万一有人在 2024 年回到这里(就像我一样),你有几个选择:
array
缓存驱动程序。这只是一个内存中的数组,一直持续到进程结束。对于普通的 Laravel 应用程序,这意味着当应用程序被拆除时,它将在每个请求结束时死亡。你可以做这样的事情:public function getUserById($userId) {
// We're using rememberForever because "forever" is until the end of the request
return Cache::driver('array')
->rememberForever("user_id_" . $userId, fn () => User::find($userId));
}
user
模型的实例,但您可以通过这种方式存储任何任意数据(字符串、整数、数组等)。public function getUserById($userId) {
$userKey = "user_id_" . $userId;
if(app()->bound($userKey)) {
return app($userKey);
}
$user = User::find($userId));
app()->instance($userKey, $user);
return $user;
}
请注意:如果您使用 Laravel Octane,那么您的应用程序可能不会在每次请求后从头开始运行并销毁。因此,相同的数组缓存或服务容器(来自方法 1 和 2)可以通过多个请求访问。有点违背了目的,因为你无法控制这个“缓存”将持续多久。
public function getUserById($userId) {
// If 'redis' is your default driver, then you can use Cache::remember() directly
return Cache::driver('redis')
// The ttl param (1 in this case) is in seconds since Laravel 5.8.
// It was in minutes before that.
->remember("user_id_" . $userId, 1, fn () => User::find($userId));
}
现在,如果您收到同一用户 ID 的 100 个并发请求,则每个请求都将从 Redis 访问数据,而不是查询数据库(速度要快得多)。如果您正在处理高流量情况或非常昂贵的查询,请认真考虑此选项。