如何在保留会话数据的同时清除redis缓存:Laravel 5

时间:2016-01-31 07:30:28

标签: php session laravel-5 redis

我使用redis作为会话驱动程序,我想在保留会话数据的同时清除缓存,因此基本上用户可以保持登录状态。有关重组或处理当前情况的任何建议吗?

注意:我不想为会话和其他缓存数据使用单独的redis实例。

4 个答案:

答案 0 :(得分:22)

简介

默认情况下,redis为您提供了16个独立的数据库,但是开箱即用的laravel将尝试将数据库0用于会话和缓存。

我们的解决方案是让Redis使用数据库0进行缓存,使用数据库1进行Session缓存,通过运行php artisan cache:clear问题解决会话问题。

1。设置Session Redis连接

修改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,
   ],
],

2。使用session连接

修改config/session.php,更改以下内容:

'connection' => null,

为:

'connection' => 'session',

3。使用Redis作为会话驱动程序

修改.env,更改SESSION_DRIVER

SESSION_DRIVER=redis

4。测试

执行以下artisan命令,然后检查您的登录状态:

php artisan cache:clear

如果登录状态仍然存在,请瞧!

答案 1 :(得分:3)

我不了解Laravel,但总的来说最好的两个选择是:

  1. 更改缓存键的格式。您应该使用版本化的缓存键,以便将来可以使用,即" cache.1。"所以你可以增加,然后它会立即使你的所有密钥无关紧要。

  2. 将缓存移动到同一redis实例中的其他db编号。这样,您也可以稍后对该db编号执行FLUSHDB以清除缓存。

  3. 在这两个选项中,首次执行此操作后,如果缓存键未达到时间,则应创建一个使用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数据库配置开关