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

22

我想将会话和缓存数据放入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',
);

缓存.php:

'driver' => 'redis',

然而,当我编写以下代码时:

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

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

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

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

3个回答

9

介绍

这是我的笔记,为了帮助遇到这个问题的其他人,我想这应该在文档中提及。

默认情况下,Redis 提供了16个独立的数据库,但 Laravel 默认会尝试使用数据库0来保存 sessions 和 cache。

我们的解决方案是让 Redis 缓存使用数据库0,而将数据库1用于 Session,从而解决由运行php artisan cache:clear引起的Session清除问题。

注:经测试适用于 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,

to:

'connection' => 'session',

3. 使用Redis作为会话驱动器

修改.env,更改SESSION_DRIVER

SESSION_DRIVER=redis

4. 测试

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

php artisan cache:clear

如果登录状态持续,那就太好了!

5

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”。

'connection' => 'session',

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()));

To

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

现在你可以在cache.php文件中定义你的配置。

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

谢谢,但它不起作用。Session 的 Redis 驱动程序重用了 CacheManager 创建的 Redis 连接。因此,这种修改仍会导致会话和缓存混在一起。 - Nemo Jia
你创建并引用了一个新的 Redis 连接吗? - brianlmerritt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接