Laravel: comment séparer le cache et la session dans différentes bases de données redis?

je veux mettre les données de session et de cache dans redis. C'est ma configuration dans la base de données.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',

Cependant, lorsque j'écris un code comme ceci:

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

le pilote de cache utilise la même base de données redis que le pilote de session, ce qui donne:

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

Quelqu'un sait comment forcer le cache à utiliser une connexion redis spécifique? Ou je dois mélanger ensemble?

19
demandé sur Cœur 2015-01-08 10:50:45

3 réponses

Introduction

voici ma note, pour un autre gars qui court à ce problème, je pense que cela devrait être dans les docs.

par défaut, redis vous donne 16 bases de données séparées, mais laravel out of the box va essayer d'utiliser la base de données 0 pour les deux sessions et le cache.

notre solution est de laisser rediscaching utiliser la base de données 0, et la base de données 1 pour la Session, là pour résoudre la session clair en exécutant php artisan cache:clear problème.

Note: testé à Laravel 5.1

1. Mise en place de la session connexion Redis

Modifier config/database.php, ajouter session pour le redis option:

'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. Faire usage de l' session connexion

Modifier config/session.php, modifiez le code suivant:

'connection' => null,

à:

'connection' => 'session',

3. Utilisation de Redis comme pilote de session

Modifier .env, modifiez SESSION_DRIVER:

SESSION_DRIVER=redis

4. Test

exécutez la commande artisan suivante, puis vérifiez votre état de connexion:

php artisan cache:clear

Si l'état de connexion persiste, voilà!

6
répondu CharlieJade 2016-07-30 10:59:46

Laravel 5 supporte maintenant cela.

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

vous pouvez sélectionner la connexion redis en modifiant config/cache.php

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

Laravel 4 CacheManager ne supporte pas la sélection de la connexion redis.

ce que vous devez faire est de modifier/étendre CacheManager et remplacer createRedisDriver() méthode.

Modifier cette ligne

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

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

maintenant vous pouvez définir votre configuration dans le cache.php

'redis' => 'your-connection-name'
2
répondu Alexander 2015-12-15 07:18:49

Laravel 5.5:

base de données.php devrait ressembler à ceci:

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

],

Et dans la session.vous devez également mettre à jour la clé "connexion" à la bonne clé. Dans ce cas, 'session'

'connection' => 'session',
2
répondu Marcel Harper 2018-02-15 17:01:05