laravel 使用redis驱动session或queue,会随同缓存被清理的解决方案

情况说明

标题中的清除缓存指的是使用cache:clear

php artisan cache:clear

对于filedatabase驱动,由于laravel会区分文件和表,清缓存都不会影响到其分数据。但如果你使用memcachedredis,就可能遇到清缓存时把其他数据也清除了的问题。

我当前的项目使用redis同时驱动缓存、session以及队列

CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_DRIVER=redis

默认配置下 cache / session / queue 会使用了同一数据库(0),而cache:clear则会清理整个数据库,所以连同session和队列queue都清理了


解决方案

设置 cache/session/job 分别使用不同的 redis 数据库,具体配置如下:

  1. 在 config/database.php 中找到stores/redis的配置,修改为:

     'redis' => [
         'client' => 'predis',
         // 这是redis的默认连接,保留即可
         'default' => [
             'host' => env('REDIS_HOST', '127.0.0.1'),
             'password' => env('REDIS_PASSWORD', null),
             'port' => env('REDIS_PORT', 6379),
             'database' => 0,
         ],
         // 新建名为cache的连接,用于保存缓存
         'cache' => [
             'host' => env('REDIS_HOST', '127.0.0.1'),
             'password' => env('REDIS_PASSWORD', null),
             'port' => env('REDIS_PORT', 6379),
             'database' => 1,
         ],
         // 新建名为session的连接,用于保存session
         'session' => [
             'host' => env('REDIS_HOST', '127.0.0.1'),
             'password' => env('REDIS_PASSWORD', null),
             'port' => env('REDIS_PORT', 6379),
             'database' => 2,
         ],
         // 新建名为queue的连接,用于保存队列
         'queue' => [
             'host' => env('REDIS_HOST', '127.0.0.1'),
             'password' => env('REDIS_PASSWORD', null),
             'port' => env('REDIS_PORT', 6379),
             'database' => 3,
         ],
     ],
    
  2. 在 config/cache.php 中找到redis的配置,修改为:

     'redis' => [
         'driver' => 'redis',
         'connection' => 'cache',
     ],
    

    以上connection的值就是对应database.php中的同名连接配置

  3. 在 config/session.php 中找到connection的配置,修改为:

     'connection' => 'session',
    

    以上connection的值就是对应database.php中的同名连接配置

  4. 在 config/queue.php 中找到connections/redis配置,修改为:

     'redis' => [
         'driver' => 'redis',
         'connection' => 'queue',
         'queue' => 'default',
         'retry_after' => 90,
         'block_for' => null,
     ],
    

    以上connection的值就是对应database.php中的同名连接配置

举一反三,若其他地方需要用到redis,也可以单独给其配置一个连接入口

至此,重启项目和队列,使配置生效即可。


参考

https://stackoverflow.com/questions/35111416/how-to-clear-redis-cache-while-keeping-session-data-laravel-5

若您觉得我的博文对您有帮助,欢迎点击下方按钮对我打赏
打赏