Laravel:如何将缓存和会话分成不同的redis数据库?

Nem*_*Jia 22 php caching laravel

我想将会话和缓存数据放入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,
    ),
),
Run Code Online (Sandbox Code Playgroud)

session.php文件:

return array(
    'driver' => 'redis',
    'connection' => 'session',
);
Run Code Online (Sandbox Code Playgroud)

cache.php:

'driver' => 'redis',
Run Code Online (Sandbox Code Playgroud)

但是,我写这样的代码:

Cache::remember('aa',1,function(){
    return 'bb';
});
Run Code Online (Sandbox Code Playgroud)

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

127.0.0.1:6379[1]> keys *
1) "aa"
2) "e0606244bec40b0352fb2b7b65d98049e49f6189"
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何强制缓存使用特定的redis连接?或者我必须将它们混合在一起?

Cha*_*ade 9

介绍

这是我的注释,对于其他一些遇到这个问题的人,我认为这应该是在文档中.

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

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

注意:在Laravel 5.1上测试过

1.设置Session Redis连接

修改config/database.php,添加选项的sessionredis:

'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,
   ],
],
Run Code Online (Sandbox Code Playgroud)

2.利用session连接

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

'connection' => null,
Run Code Online (Sandbox Code Playgroud)

至:

'connection' => 'session',
Run Code Online (Sandbox Code Playgroud)

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

修改.env,更改SESSION_DRIVER:

SESSION_DRIVER=redis
Run Code Online (Sandbox Code Playgroud)

4.测试出来

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

php artisan cache:clear
Run Code Online (Sandbox Code Playgroud)

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


小智 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,
    ],

],
Run Code Online (Sandbox Code Playgroud)

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

'connection' => 'session',
Run Code Online (Sandbox Code Playgroud)


Ale*_*der 3

Laravel 5现在支持这一点。

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

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

'stores' => [
    'redis' => [
        'driver' => 'redis',
        'connection' => 'your-connection-name',
    ],
],
Run Code Online (Sandbox Code Playgroud)

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

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

修改这一行

return $this->repository(new RedisStore($redis, $this->getPrefix()));
Run Code Online (Sandbox Code Playgroud)

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

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

'redis' => 'your-connection-name'
Run Code Online (Sandbox Code Playgroud)