假设我们有一个这样的场景,我们有两个项目,项目 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)); // 打印 []
可以看到,打印出的是空数组,也就是说我们没取到数据,至于为什么,我们回过头来看下 Laravel
的 Redis
数据库的配置连接,默认在 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.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),
],
'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返现。目前仅包含这几个平台。后续如果有需要可以考虑其他平台。 简而言之就是:你买课,我返现。让你花更少的钱,就可以买到课程。
版权许可
本作品采用 知识共享署名 4.0 国际许可协议 进行许可。转载无需与我联系,但须注明出处,注明文章来源 Laravel 多项目共用 Redis 引发前缀的问题