Подтвердить что ты не робот

Laravel: как отделить кеш и сеанс в другой базе данных redis?

Я хочу поместить данные сеанса и кеша в 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? Или мне нужно смешать их вместе?

4b9b3361

Ответ 1

Введение

Вот моя заметка, для какого-то другого парня, который работает с этой проблемой, я думаю, что это должно быть в документах.

По умолчанию redis дает вам 16 отдельных баз данных, но laravel из коробки будет пытаться использовать базу данных 0 для сеансов и кеша.

Наше решение состоит в том, чтобы позволить кэшированию Redis с использованием базы данных 0 и базы данных 1 для сеанса, чтобы решить проблему сеанса, выполнив задачу php artisan cache:clear.

Примечание: проверено на Laravel 5.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. Тестирование

Выполните следующую команду artisan, затем проверьте свое состояние входа:

php artisan cache:clear

Если состояние входа сохраняется, voilà!

Ответ 2

Laravel 5 теперь поддерживает это.

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

Вы можете выбрать redis-соединение, изменив config/cache.php

'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'