Laravel Redis连接共享:为何select方法会影响其他连接?

Laravel Redis连接共享:为何select方法会影响其他连接?

laravel框架下redis连接共享及select方法的影响

在Laravel框架中使用redis时,开发者可能会遇到一个问题:通过配置文件获取的Redis连接,在使用select方法切换数据库后,会影响到之前获取的相同连接。本文将分析此问题并提供解决方案。

问题描述:假设代码通过Redis::connection(‘config1’)获取名为’config1’的Redis连接,其配置如下:

'config1' => [     'host' => 'xx',     'password' => 'xx',     'port' => 'xx',     'database' => 2 ]

分别获取两次’config1’连接,并在其中一个连接上执行select(3)切换到数据库3:

$a = Redis::connection('config1'); $b = Redis::connection('config1'); $b->select(3); $a->set('test1', 1); // 'test1'写入数据库3,而非预期数据库2

$a->set(‘test1’, 1)的结果令人意外,因为预期数据应写入数据库2。这是因为Laravel框架的Redis连接管理机制导致$a和$b实际上引用的是同一个Redis连接对象

Laravel框架的IlluminateSupportFacadesRedis facade 通过getFacadeAccessor方法返回redis,而redis是由IlluminateRedisRedisManager实现的。IlluminateRedisRedisManager的connection方法会在首次解析后缓存连接,后续调用会直接返回相同的Redis实例。

因此,要避免此问题,不能多次调用Redis::connection()来获取独立连接。解决方案是使用Laravel的resolve方法创建新的连接实例:

$a = app('redis')->connection('config1'); $b = app('redis')->connection('config1'); $b->select(3); $a->set('test1', 1); // 'test1'现在将写入数据库2

使用app(‘redis’)->connection(‘config1’)每次都会创建一个新的连接实例,从而避免共享同一个底层Redis连接的问题,确保每个连接拥有独立的数据库选择。 这解决了select方法影响其他连接的问题。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享