【问题标题】:Laravel: how to separate cache and session into different redis database?Laravel:如何将缓存和会话分离到不同的redis数据库中?
【发布时间】:2015-01-08 07:50:45
【问题描述】:

我想把会话和缓存数据放到redis中。这是我在 database.php 中的配置:

'redis' => array(

    'cluster' => false,

    'default' => array(
        'host'     => '192.168.56.101',
        'port'     => 6379,
        'database' => 0,
    ),

    'session' => array(
        'host'     => '192.168.56.101',
        'port'     => 6379,
        'database' => 1,
    ),
),

session.php:

return array(
    'driver' => 'redis',
    'connection' => 'session',
);

cache.php:

'driver' => 'redis',

但是,我在哪里编写这样的代码:

Cache::remember('aa',1,function(){
    return 'bb';
});

缓存驱动使用与会话驱动相同的redis数据库,导致:

127.0.0.1:6379[1]> keys *
1) "aa"
2) "e0606244bec40b0352fb2b7b65d98049e49f6189"

有人知道如何强制缓存使用特定的redis连接吗?还是我必须将它们混合在一起?

【问题讨论】:

    标签: php caching laravel


    【解决方案1】:

    Laravel 5.5:

    database.php 应该如下所示:

    'redis' => [
    
        'client' => 'predis',
    
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
    
        'session' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 1,
        ],
    
    ],
    

    在 session.php 中,您还必须将“连接”键更新为正确的键。在本例中为“会话”

    'connection' => 'session',
    

    【讨论】:

      【解决方案2】:

      简介

      这是我的笔记,对于遇到此问题的其他人,我认为这应该在文档中。

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

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

      注意:在 Laravel 5.1 测试

      1。设置 Session Redis 连接

      修改config/database.php,在redis选项中添加session键:

      '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
      

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

      【讨论】:

        【解决方案3】:

        Laravel 5 现在支持此功能。

        https://github.com/laravel/framework/commit/d10a840514d122fa638eb5baa24c8eae4818da3e

        修改config/cache.php可以选择redis连接

        'stores' => [
            'redis' => [
                'driver' => 'redis',
                'connection' => 'your-connection-name',
            ],
        ],
        

        Laravel 4 CacheManager 不支持选择 redis 连接。

        你需要做的是修改/扩展CacheManager并覆盖createRedisDriver()方法。

        修改这一行

        return $this->repository(new RedisStore($redis, $this->getPrefix()));
        

        return $this->repository(
            new RedisStore($redis, $this->getPrefix(), 
            $this->app['config']['cache.redis'])
        );
        

        现在您可以在 cache.php 中定义您的配置

        'redis' => 'your-connection-name'
        

        【讨论】:

        • 谢谢,但是不行。Session的redis驱动复用了CacheManager创建的redis连接,所以这个修改还是会导致session和缓存混在一起。
        • 您是否创建并引用了新的 redis 连接?
        猜你喜欢
        • 2016-01-29
        • 1970-01-01
        • 2015-06-18
        • 2018-02-10
        • 2019-10-29
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多