laravel框架下redis连接共享及select方法的影响
在laravel框架中使用redis时,开发者可能会遇到一个问题:通过配置文件获取的redis连接,在使用select方法切换数据库后,会影响到之前获取的相同连接。本文将分析此问题并提供解决方案。
问题描述:假设代码通过redis::connection('config1')获取名为'config1'的redis连接,其配置如下:
分别获取两次'config1'连接,并在其中一个连接上执行select(3)切换到数据库3:
$a->set('test1', 1)的结果令人意外,因为预期数据应写入数据库2。这是因为laravel框架的redis连接管理机制导致$a和$b实际上引用的是同一个redis连接对象。
laravel框架的\illuminate\support\facades\redis facade 通过getfacadeaccessor方法返回redis,而redis是由\illuminate\redis\redismanager实现的。\illuminate\redis\redismanager的connection方法会在首次解析后缓存连接,后续调用会直接返回相同的redis实例。
因此,要避免此问题,不能多次调用redis::connection()来获取独立连接。解决方案是使用laravel的resolve方法创建新的连接实例:
使用app('redis')->connection('config1')每次都会创建一个新的连接实例,从而避免共享同一个底层redis连接的问题,确保每个连接拥有独立的数据库选择。 这解决了select方法影响其他连接的问题。
以上就是laravel redis连接共享:为何select方法会影响其他连接?的详细内容,更多请关注代码网其它相关文章!
发表评论