如何创建会话支持的Laravel Cache存储?

时间:2015-07-25 22:02:21

标签: laravel caching laravel-5 laravel-5.1

出于性能原因,我想在PHP会话中存储一些数据而不是我的Redis缓存。

我希望使用Laravel Cache外观来执行此操作,但使用某种语法来表明我希望将副本保留在用户的会话中另外到正常的Redis缓存。

然后在检索时,我希望Cache存储首先在Session中查找,然后只有在找不到Redis的网络请求时才会查找。

我不是在寻找完整的代码,但有些方向会受到赞赏。

1 个答案:

答案 0 :(得分:3)

与Laravel捆绑在一起的高速缓存驱动程序都不提供这种双层存储,因此您需要自己实现新的驱动程序。幸运的是, 它不会太复杂。

首先,创建新的驱动程序:

class SessionRedisStore extends RedisStore {
  public function get($key) {
    return Session::has($key) ? Session::get($key) : parent::get($key);
  }

  public function put($key, $value, $minutes, $storeInSession = false) {
    if ($storeInSession) Session::set($key, $value);
    return parent::put($key, $value, $minutes);
  }
}

接下来,在 AppServiceProvider 中注册新驱动程序:

public function register()
{
  $this->app['cache']->extend('session_redis', function(array $config)
  {
    $redis = $this->app['redis'];
    $connection = array_get($config, 'connection', 'default') ?: 'default';
    return Cache::repository(new RedisStore($redis, $this->getPrefix($config), $connection));
  });
}

config / cache.php 中提供配置:

'session_redis' => [
  'driver' => 'redis',
  'connection' => 'default',
],

并在 config / cache.php .env 文件中将缓存驱动程序设置为该驱动程序:

'default' => env('CACHE_DRIVER', 'session_redis'),

请注意,我只更新了 get() put()方法。您可能需要覆盖更多方法,但这样做应该与 get / put 一样简单。

要记住的另一件事是,我通过查看Laravel代码生成了以上片段,并且没有机会对其进行测试:)如果您有任何问题,请告诉我,我&# 39;我会非常乐意让它发挥作用:)