Redis::connection () 之后再 config::set () 配置 Redis 就没有作用了?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

理解这个问题之前需楼主去补一波ServiceProvider的知识点了 :)

问题的关键在于Illuminate\Redis\RedisServiceProvider

Laravel在启动RedisServiceProvider时,会将redis作为一个单例注册在应用容器中,而生成单例的那一刻,redis的所有配置已经作为一份拷贝定格在RedisManager之中了,所以你后面动态填加的redis2配置是没有效果的。(追踪源码一切就真相大白了^_^)

那么你可能还会问,为什么我的redis1也是动态填加却效果呢?这是因为RedisServiceProvider这个服务是一个延迟加载的服务(仔细观察他的$defer属性是true),延迟加载的意义就在于第一次使用时才去加载服务。在你的代码里redis1配置是在第一次调用服务(26行)之前配置的,此时redis单例还未生成,所以这个配置是有效的。

希望能帮到你。

6年前 评论

理解这个问题之前需楼主去补一波ServiceProvider的知识点了 :)

问题的关键在于Illuminate\Redis\RedisServiceProvider

Laravel在启动RedisServiceProvider时,会将redis作为一个单例注册在应用容器中,而生成单例的那一刻,redis的所有配置已经作为一份拷贝定格在RedisManager之中了,所以你后面动态填加的redis2配置是没有效果的。(追踪源码一切就真相大白了^_^)

那么你可能还会问,为什么我的redis1也是动态填加却效果呢?这是因为RedisServiceProvider这个服务是一个延迟加载的服务(仔细观察他的$defer属性是true),延迟加载的意义就在于第一次使用时才去加载服务。在你的代码里redis1配置是在第一次调用服务(26行)之前配置的,此时redis单例还未生成,所以这个配置是有效的。

希望能帮到你。

6年前 评论

ServiceProvider 这个确实不了解, 看文档吗,还是有其他推荐的方法吗?

那有什么办法让redis单例生成之后销毁尼, unset 没有作用?@coodeer

6年前 评论

@coodeer 因为是想从本地的redis 读取其他 机器的redis 配置 ,再去connection 连接

所以有什么办法可以销毁尼?

6年前 评论

提供一条参考思路:修改配置后,重新绑定一次redis单例,然后清除Facade实例即可。

use Illuminate\Redis\RedisManager;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Facade;

app()->singleton('redis', function ($app) {
    $config = $app->make('config')->get('database.redis');

    return new RedisManager(Arr::pull($config, 'client', 'predis'), $config);
});

Facade::clearResolvedInstance('redis');

(或许还有更好的方法)

6年前 评论

@coodeer

"Class 'Illuminate\Redis\RedisManager' not found"


这是跟laravel 的版本有关吗?

6年前 评论

@英雄没有斗篷
5.3及以前的版本换成Illuminate\Redis\Database应该就好了:

use Illuminate\Redis\Database;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Facade;

app()->singleton('redis', function ($app) {
    return new Database($app['config']['database.redis']);
});

Facade::clearResolvedInstance('redis');
6年前 评论

@coodeer 可以了 , 非常感谢啊 ! 我自己完全不知道怎么弄

6年前 评论
leung0826

配置过 redis 哨兵模式吗?

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!