Redis使用错误合集

原创
2019/06/24 01:15
阅读数 116

Redis使用错误合集

Redis在web项目中问题Pconnect和connect

  • 开发问题

20180112
今日在APP 的生产环境, 出现一个问题.
用户资产中没有包括到,最近上的几个币.
程序的时这样的:
    伪代码:
        1.获取该用户所有资产信息,其中包含资产,和所有分区币种的汇率
        2.遍历分区1的所有币种,判断该币种是否已存在汇率,存在即格式化为前端要的格式.
        3.遍历分区2的所有币种,判断该币种是否已存在汇率,存在即格式化为前端要的格式.
        结果,这里从第一步开始就没有了, 最新上的几个币.
        
经过排查, 发现用户资产中心查询的币种汇率即rate 和rate_usc为1号库的老数据.
但是实际上,现在我们是保存在3号库的,这里有这些新币的汇率.


怎么查都是没问题, 本地怎么测试都没问题.线上各种各行日志,都是有问题.心态几乎要崩
后台逐渐锁定到,redis读取结果, 发现读出来的时候数据就已经不对了.

后来,经过老司机的指点:
此处的PHP通过pconnect连接redis会导致,此处的select失效.仍然读的是原来的1号库的老数据.
现已改成connect.起原因在下面. 
    public static function instance($pConfig = 'default', $new = false)
    {
        if (!isset(self::$obj[$pConfig]) || $new) {
            $config = Config::db('redis', $pConfig);
            self::$obj[$pConfig] = new Redis();
            if (self::$obj[$pConfig]->pconnect($config['host'], isset($config['port']) ? $config['port'] : 6379)) {
                self::$obj[$pConfig]->select($config['db']);
            }
        }

        return self::$obj[$pConfig];
    }


  • Redis的Pconnect连接基本原理
CSDN网友(ball球)的测试结果

如果代码中使用pconnect, close的作用仅是使当前php不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直至fpm进程生命周期结束。
结论

1. 当使用pconnect时,连接会被重用,连接的生命周期是fpm进程的生命周期,而非一次php的执行。
2.如果代码中使用pconnect, close的作用仅是使当前php不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直至fpm进程生命周期结束。

你的项目要在多个DB间切换,用pconnect需要注意的是,每次取数据前一定要显示的selectDB。不然连接重用时,可能所用的DB,不是你想要的那个


如果cgi执行方式是类似于php-fpm(进程长驻内存,而不是每次请求完成后,进程也退出)这种方式,一般用pconnect,性能要高不少,因为至少它省去了连接建立的代价
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部