【发布时间】:2016-01-31 07:30:28
【问题描述】:
我使用redis作为会话驱动程序,我想在保留会话数据的同时清除缓存,所以基本上用户可以保持登录状态。关于重组或处理当前情况有什么建议吗?
注意:我不想为会话和其他缓存数据使用单独的 redis 实例。
【问题讨论】:
标签: php session laravel-5 redis
我使用redis作为会话驱动程序,我想在保留会话数据的同时清除缓存,所以基本上用户可以保持登录状态。关于重组或处理当前情况有什么建议吗?
注意:我不想为会话和其他缓存数据使用单独的 redis 实例。
【问题讨论】:
标签: php session laravel-5 redis
默认情况下,redis 为您提供 16 个独立的数据库,但开箱即用的 laravel 会尝试将数据库 0 用于会话和缓存。
我们的解决方案是让 Redis 使用数据库 0 进行缓存,并使用数据库 1 进行会话,在那里通过运行php artisan cache:clear 问题来解决会话清除问题。
修改config/database.php,将session键添加到redis选项:
'redis' => [
'cluster' => false,
'default' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
'session' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 1,
],
],
session 连接修改config/session.php,更改如下:
'connection' => null,
到:
'connection' => 'session',
修改.env,更改SESSION_DRIVER:
SESSION_DRIVER=redis
执行以下 artisan 命令,然后检查您的登录状态:
php artisan cache:clear
如果登录状态仍然存在,瞧!
【讨论】:
我不知道 Laravel,但总的来说最好的两个选择是:
更改缓存键的格式。您应该使用版本化缓存键,以便将来可以使用,即“cache.1”。这样您就可以递增,然后它会立即使您的所有密钥变得无关紧要。
将缓存移动到同一个 redis 实例中的不同数据库号。这样您以后也可以在该数据库编号上执行FLUSHDB 以清除缓存。
在这两个选项中,在您第一次执行此操作后,如果缓存键没有过期,您应该创建一个使用SCAN 删除旧键的脚本。见http://redis.io/commands/scan
附带说明一下,将缓存和其他内容保存在同一个 redis 实例中通常是个坏主意,因为在缓存中您通常使用基于 LRU 的驱逐,并且您不想将其与易失性较小的键混合。
【讨论】:
https://laravel.com/docs/5.2/redis#configuration
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
redis 连接选项中有“数据库”,只需选择不同的数据库进行会话和缓存即可。我只是希望redis缓存驱动使用flushdb而不是flushall来刷新:)。
【讨论】:
Laravel Cache::clear() 发送 Redis flushall 命令,该命令将转储所有内容,因此在我的经验中不是很有用。您将需要扩展缓存类并创建一个自定义集来索引您希望能够清除的缓存数据。然后构建另一个函数来读取集合并为集合中的每个键发出 Redis del() 命令。发布一些工作代码,如有必要将进一步详细说明
Notagolfers 建议将缓存和会话分离到不同的 Redis 数据库中并不是必须的,但您仍然需要扩展缓存类以实现 Redis 数据库配置开关
【讨论】: