Laravel Redis连接:同一个配置,多个实例是否真的共享?

laravel redis连接:同一个配置,多个实例是否共享?

本文探讨laravel框架下redis连接的共享与独立性问题。在使用Laravel和redis时,开发者可能会发现,即使通过配置文件获取相同的连接配置,多个实例之间仍然存在关联,一个实例的操作会影响其他实例。

Laravel Redis连接:同一个配置,多个实例是否真的共享?

问题描述:

在Laravel 5.4.17环境(使用Predis 1.1.7驱动,php 5.6.13,Redis server 2.6.10),通过Redis::connection(‘config1’)获取名为’config1’的Redis连接。代码如下:

'config1' => [     'host' => 'xx',     'password' => 'xx',     'port' => 'xx',     'database' => 2 ],  $a = Redis::connection('config1'); $b = Redis::connection('config1'); $b->select(3); $a->set('test1', 1); // 'test1' 存储在数据库3,而非预期的数据库2

预期$b->select(3)仅影响$b,但实际上$a也被切换到数据库3。

问题分析:

Laravel框架的IlluminateSupportFacadesRedis通过getFacadeAccessor方法返回Redis字符串,最终由IlluminateRedisRedisManager类管理连接。RedisManager类的connection方法会在第一次解析后缓存相同名称的连接。后续请求相同名称的连接时,直接返回缓存实例,而非创建新的实例。因此,$a和$b指向同一个Redis连接实例,$b->select(3)改变了数据库选择,自然影响$a。

解决方案:

为了避免共享连接实例,应避免使用缓存的实例。 Laravel的resolve方法可以创建新的连接,确保连接的独立性。直接克隆对象(clone)不可靠,因为Redis连接对象可能阻止克隆或导致其他问题。因此,使用resolve创建新连接是最可靠的方案。

通过resolve方法创建独立的Redis连接实例,可以有效避免多个实例之间数据干扰的问题,从而确保应用程序的正确性和稳定性。

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