如何创建会话支持的 Laravel 缓存存储?
How can I create a session-backed Laravel Cache store?
出于性能原因,我想将一些数据存储在 PHP 会话中而不是我的 Redis 缓存中。
我希望使用 Laravel 缓存外观来执行此操作,但使用某种语法表明我希望在用户会话中保留一份副本 除了到正常的Redis缓存。
然后在检索时,我希望缓存存储首先在会话中查找,只有在找不到时才向 Redis 发出网络请求。
我不是在寻找完整的代码,但我将不胜感激。
None 与 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 代码生成了上面的代码片段,但没有机会对其进行测试 :) 如果您有任何问题,请告诉我我会非常高兴让它工作:)
出于性能原因,我想将一些数据存储在 PHP 会话中而不是我的 Redis 缓存中。
我希望使用 Laravel 缓存外观来执行此操作,但使用某种语法表明我希望在用户会话中保留一份副本 除了到正常的Redis缓存。
然后在检索时,我希望缓存存储首先在会话中查找,只有在找不到时才向 Redis 发出网络请求。
我不是在寻找完整的代码,但我将不胜感激。
None 与 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 代码生成了上面的代码片段,但没有机会对其进行测试 :) 如果您有任何问题,请告诉我我会非常高兴让它工作:)