Laravel:如何将缓存和会话分离到不同的 redis 数据库中


Laravel: how to separate cache and session into different redis database?

我想把会话和缓存数据放到 redis 中。这是我在数据库中的配置.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,
    ),
),

会话.php:

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

缓存.php:

'driver' => 'redis',

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

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

缓存驱动程序使用与会话驱动程序相同的 Redis 数据库,这会导致:

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

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

简介

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

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

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

注意:在Laravel5.1测试

1. 设置会话 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. 测试

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

php artisan cache:clear

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

Laravel 5.5:

数据库.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,
    ],
],

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

'connection' => 'session',

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'])
);

现在,您可以在缓存中定义配置.php

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