Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库

教程 Summer ⋅ 于 2016-07-30 17:12:49 ⋅ 最后回复由 ifelse 2017-04-09 10:34:22 ⋅ 6986 阅读

为什么要这样做?

默认情况下,Redis 服务会提供 16 个数据库,Laravel 使用数据库 0 (请见 Redis 文档)作为缓存和 Session 的存储。

在使用的过程中觉得这个默认的设置挺不合理,因为当你在执行命令 php artisan cache:clear 的时候,会把 Session 也连带清除了,导致所有用户需要重新登录。

Session 存储的其他选择:

  • file - 存储在文件中,读取太频繁,磁盘存储比起内存存储速度没法比,为了方便,开发时可以随便玩一玩,生产环境不建议使用;
  • cookie - Session 里存放的是信息太多,Nginx 默认配置下配合 PHP-FPM,经常报 502,不建议使用;
  • database - 不建议存储在数据库中,因为读取太频繁,会拖累数据库服务器数据存储的业务,读取是内存缓存服务器的强项;
  • apc - 可用于小型程序缓存,不过不支持集群,所以也不建议使用;
  • array - 建议只用于单元测试中使用;
  • memcached - 专业内存缓存服务器,可惜只支持最大 30 天的缓存时间,请见 Laravel 会话使用 Memcached 踩到的坑,也就是说用户 30 天后就得重新登录,在我们的用例中,不适用;

上面的总结可以看来,Redis 在配置好多数据库的情况下,还是最好的 Session 存储方案。

开始配置

我们的目的是让缓存,也就是默认的 Redis 存储到 0 号数据库,Session 存储在 1 号数据库。

1. 配置 Session Redis 数据库

修改 config/database.php,在 redis 选项内增加 session 选项,并把 database 修改为 1:

'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. 开始使用

修改 .env 文件的 SESSION_DRIVER 选项为 redis,开始应用上。

SESSION_DRIVER=redis

4. 测试一下

执行以下命令后检查下是否退出登录:

php artisan cache:clear

如果不会就大功告成了。

:dancer::dancer::dancer::dancer: :dancers::dancers::dancers::dancers:

@Summer | Work at: 优帆远扬,我们正在招聘 全职伙伴Remote 工程师,欢迎加入 :bowtie:

本帖已被设为精华帖!
本帖由 Summer 于 8个月前 加精
回复数量: 13
  • binafor
    2016-07-30 23:53:51

    怒赞,还不知道memcached 有这个坑呢

  • zhuzhichao MOD Lalala Demacian !
    2016-07-31 00:08:00

    :+1:

  • goodspb 装P小王子
    2016-07-31 12:17:42

    :+1:

  • Gabriel
    2016-08-02 18:17:33

    FatalErrorException in Database.php line 62:
    Class 'Predis\Client' not found

    出现了一个问题。。查看了composer文件和app.config都没有问题。。

  • 萧晔离
    2016-08-02 21:11:54

    学习了,我的是几个laravel项目共享的session和cache ,清理cache的时候的确很不方便

  • orvice
    2016-08-08 01:07:23

    @Gabriel composer require predis/predis

  • Gabriel
    2016-08-08 18:37:23

    @orvice 已解决,谢谢。

  • Destiny 将来的你一定会感谢现在努力的自己!
    2016-08-10 09:22:04

    @Summer 帅得一.....

  • wujunze 网络技术爱好者
    2016-08-26 22:07:24

    :thumbsup:

  • ADKi 大鹏一日同风起,抟摇直上九万里。 假令风歇时下来,犹能簸却沧溟水。
    2016-10-26 22:23:47

    mark

  • moell 热爱我的热爱
    2016-12-19 21:01:43

    :+1: 学习了

  • chunlintang Learn and live.
    2017-03-16 09:59:20

    @512817655 我这可以啊。

    file

  • ifelse
    2017-04-09 10:34:22

    请问.env在哪

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter