我使用redis作为会话驱动程序,我想在保留会话数据的同时清除缓存,因此基本上用户可以保持登录状态。有关重组或处理当前情况的任何建议吗?
注意:我不想为会话和其他缓存数据使用单独的redis实例。
答案 0 :(得分:22)
默认情况下,redis为您提供了16个独立的数据库,但是开箱即用的laravel将尝试将数据库0用于会话和缓存。
我们的解决方案是让Redis使用数据库0进行缓存,使用数据库1进行Session缓存,通过运行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
如果登录状态仍然存在,请瞧!
答案 1 :(得分:3)
我不了解Laravel,但总的来说最好的两个选择是:
更改缓存键的格式。您应该使用版本化的缓存键,以便将来可以使用,即" cache.1。"所以你可以增加,然后它会立即使你的所有密钥无关紧要。
将缓存移动到同一redis实例中的其他db编号。这样,您也可以稍后对该db编号执行FLUSHDB
以清除缓存。
在这两个选项中,首次执行此操作后,如果缓存键未达到时间,则应创建一个使用SCAN
删除旧密钥的脚本。见http://redis.io/commands/scan
作为旁注,将缓存和其他内容保存在同一个redis实例中通常是一个坏主意,就像您通常使用基于LRU的驱逐的缓存一样,并且您不想混合使用具有较少的易失性键。
答案 2 :(得分:2)
https://laravel.com/docs/5.2/redis#configuration
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
redis连接选项中有'database',只需为会话和缓存选择不同的数据库。我只希望redis缓存驱动程序使用flushdb而不是flushall进行刷新:)。
答案 3 :(得分:0)
Laravel Cache :: clear()发送Redis flushall命令,该命令将转储所有内容,这对我的经验来说并不是很有用。您将需要扩展缓存类并创建自定义集,以索引您希望能够清除的缓存数据。然后构建另一个函数来读取集合并为集合中的每个键发出Redis del()命令。发布一些工作代码,并在必要时进一步详细说明
Notagolfers建议将缓存和会话分离到不同的redis数据库中是不是已经调用但你仍然需要扩展缓存类来实现Redis数据库配置开关