【问题标题】:How to clear redis cache while keeping session data : Laravel 5如何在保留会话数据的同时清除 redis 缓存:Laravel 5
【发布时间】:2016-01-31 07:30:28
【问题描述】:

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

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

【问题讨论】:

    标签: php session laravel-5 redis


    【解决方案1】:

    简介

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

    我们的解决方案是让 Redis 使用数据库 0 进行缓存,并使用数据库 1 进行会话,在那里通过运行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
    

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

    【讨论】:

    • 如果你有集群,这不起作用(不支持多个数据库)
    【解决方案2】:

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

    1. 更改缓存键的格式。您应该使用版本化缓存键,以便将来可以使用,即“cache.1”。这样您就可以递增,然后它会立即使您的所有密钥变得无关紧要。

    2. 将缓存移动到同一个 redis 实例中的不同数据库号。这样您以后也可以在该数据库编号上执行FLUSHDB 以清除缓存。

    在这两个选项中,在您第一次执行此操作后,如果缓存键没有过期,您应该创建一个使用SCAN 删除旧键的脚本。见http://redis.io/commands/scan

    附带说明一下,将缓存和其他内容保存在同一个 redis 实例中通常是个坏主意,因为在缓存中您通常使用基于 LRU 的驱逐,并且您不想将其与易失性较小的键混合。

    【讨论】:

      【解决方案3】:

      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来刷新:)。

      【讨论】:

      • 注意:我不想为会话和其他缓存数据使用单独的 redis 实例。
      • 你不需要创建不同的redis实例。一个 redis 实例提供多个“数据库”,您只需要指出要使用哪一个即可。 (rediscookbook.org/multiple_databases.html)
      【解决方案4】:

      Laravel Cache::clear() 发送 Redis flushall 命令,该命令将转储所有内容,因此在我的经验中不是很有用。您将需要扩展缓存类并创建一个自定义集来索引您希望能够清除的缓存数据。然后构建另一个函数来读取集合并为集合中的每个键发出 Redis del() 命令。发布一些工作代码,如有必要将进一步详细说明

      Notagolfers 建议将缓存和会话分离到不同的 Redis 数据库中并不是必须的,但您仍然需要扩展缓存类以实现 Redis 数据库配置开关

      【讨论】:

      • \vendor\laravel\framework\src\Illuminate\Cache\RedisStore.php 的 flush 方法调用 $this->connection->flushdb() 最终调用 Redis 的 FLUSHDB 命令。 FLUSHDB 删除给定连接/数据库的所有键 - 从配置中可以看到默认值为 0。 FLUSHALL 将删除所有数据库的所有键,例如,如果您在不同的 Redis 数据库中将缓存键与会话键隔离开来,这将是相当不受欢迎的行为。
      猜你喜欢
      • 2013-05-10
      • 2015-06-18
      • 2015-11-23
      • 1970-01-01
      • 2016-01-29
      • 2015-05-23
      • 2015-04-16
      • 2012-12-16
      • 1970-01-01
      相关资源
      最近更新 更多