Laravel 多项目共用 Redis 引发前缀的问题

作者: hedeqiang

发布时间: 2021-06-18 22:31:59

假设我们有一个这样的场景,我们有两个项目,项目 A 和项目 B,都是使用 Laravel 框架,我们想两个项目共用一个 Redis,也就是说我们在 项目A 中往 Redis中存数据,然后项目 B 取 Redis 的数据。如果我们使用 如下的方式来进行操作,我们在 项目 B 中是取不到数据的。

项目 A 中 存数据

Redis::lpush('test',1);
Redis::lpush('test',2);
Redis::lpush('test',3);
Redis::lpush('test',4);

我们在 项目中 使用 Redis 的 门面系统,往 Redis 的 list 中放了四条信息,然后我们在 项目 B 中进行读取 这个 list。

dd(Redis::lrange('test',0,-1));  // 打印 []

可以看到,打印出的是空数组,也就是说我们没取到数据,至于为什么,我们回过头来看下 LaravelRedis 数据库的配置连接,默认在 config/database.php 文件中。关于 Redis 的链接大致如下:

'redis' => [

    'client' => env('REDIS_CLIENT', 'predis'),

    'options' => [
        'cluster' => env('REDIS_CLUSTER', 'predis'),
        'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_',
    ],

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],

    'cache' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 1),
    ],
],

可以看到,Laravel 给我们的 Redis 添加了一个 prefix 的前缀,因此导致 我们存的是带有一个项目 A 的前缀,取 是项目 B的前缀,导致获取不到数据,那么有没有什么方法可以共用呢?或者说是去掉前缀呢?

以下是我的写法,但是最终被同事吐槽了,两个人还噼里啪啦 ,口吐芬芳了一阵,然鹅最终我输了,小弟还是嫩啊。

项目 A 存数据


$redis = new \Redis();
$redis->connect(config('database.redis.default.host'),config('database.redis.default.port'));
$redis->lPush('test',1);
$redis->lPush('test',2);
$redis->lPush('test',3);
$redis->lPush('test',14);

项目 B 取数据

$redis = new \Redis();
$redis->connect(config('database.redis.default.host'),config('database.redis.default.port'));
dd($redis->lRange('test',0,-1));

以上方法完全可以拿到项目 A 的数据。

下面是被同事教育后的写法。

首先更改 config/database.phpRedis 的配置

'redis' => [

    'client' => env('REDIS_CLIENT', 'predis'),

    'options' => [
        'cluster' => env('REDIS_CLUSTER', 'predis'),
        'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_',
    ],

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],

    'cache' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 1),
    ],

    'test' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 2),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'predis'),
            'prefix' => '',
        ],

    ],

],

其实以上内容主要是新增了一个 test 连接,然后增加了 options 选项,设置 prefix 为空。

之后我们还是可以使用 Laravel 的 Redis 的 Facades.

项目 A 存数据

$redis = Redis::connection('test');
$redis->lPush('test',1);
$redis->lPush('test',2);
$redis->lPush('test',3);
$redis->lPush('test',14);

项目 B 取数据

$redis = Redis::connection('test');
dd($redis->lRange('test',0,-1));

最后我想说,杰哥牛逼,小弟服了。

关于极客返利

极客返利 是由我个人开发的一款网课返利、返现平台。包含 极客时间返现、拉勾教育返现、掘金小册返现、GitChat返现。目前仅包含这几个平台。后续如果有需要可以考虑其他平台。 简而言之就是:你买课,我返现。让你花更少的钱,就可以买到课程。

https://geek.laravelcode.cn

https://geek.idaka.ink

版权许可

本作品采用 知识共享署名 4.0 国际许可协议 进行许可。

转载无需与我联系,但须注明出处,注明文章来源 Laravel 多项目共用 Redis 引发前缀的问题