Laravel:仅在脚本持续时间内缓存 - 类似于 Session::flash

问题描述 投票:0回答:2

Laravel 是否有任何缓存机制可以在当前脚本/请求期间缓存某些内容?无论是使用 FileCache 或 DatabaseCache 等缓存驱动程序,还是仅使用内存缓存。

例如,我有一些非常违反并且经常更改的数据,并且我的脚本在多个地方获取它。所以我想在第一次获取它后缓存它,但在当前脚本执行完成后忘记它(所以在下一个请求时它会再次获取它)。

这相当于我有一些全局变量

$cache
或类似的变量,我可以在其中存储例如
$cache['options']
。 Laravel 中已经有类似的东西了吗?

谢谢你。

php laravel caching
2个回答
2
投票

一种方法是遵循执行重复功能的类的单例模式。

您还可以将类的实例绑定到服务容器,并在需要使用它的地方引入该依赖项。

https://laravel.com/docs/5.4/container

单例或实例绑定将允许您的应用程序在单次执行期间的任何位置共享类的相同实例。


0
投票

万一有人在 2024 年回到这里(就像我一样),你有几个选择:

  1. Laravel 有一个
    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));
}
  1. 下一个选项是使用 Devon Bessemer 的答案中提到的 应用程序服务容器。这里的一个问题是,您必须记住在尝试检索密钥之前检查您的密钥是否在服务容器中,否则您将收到异常。注意:该示例显示检索
    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)可以通过多个请求访问。有点违背了目的,因为你无法控制这个“缓存”将持续多久。

  1. 除非使用 Laravel Octane,方法 1 和方法 2 都不允许在多个请求之间共享数据,即使在微秒内收到相同数据的多个请求也是如此。我知道这是问题的重点,但是(如果它适合您的用例)请考虑在很短的时间内(例如 1 秒)缓存到共享缓存(例如 Redis)。如果您正在使用 Laravel Octane,这也可能是最好的选择:
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 访问数据,而不是查询数据库(速度要快得多)。如果您正在处理高流量情况或非常昂贵的查询,请认真考虑此选项。

© www.soinside.com 2019 - 2024. All rights reserved.