2019-05-08

作者: wxy1 | 来源:发表于2019-10-25 18:05 被阅读0次

    分享一个使用redsi过程中遇到的问题

    1问题

    在ci框架('CI_VERSION', '2.2.0')中 使用redis缓存一个key-value格式的数据
    然后每次get 同一个key获取的数据长度不一样 (value的长度比较长)

    image.png image.png

    多次去get数据,都是这两种结果 string(2913)就是丢失数据了。

    更换不同的redis服务以后 同样会出现这个问题,基本可以排除是redis引起的问题。
    怀疑是框架本身的问题

    2排查问题

    通过跟踪代码找到最后出问题的地方

    class CI_Redis 
    {
    ......
     private function _bulk_reply()
        {
    
            // How long is the data we are reading? Support waiting for data to
            // fully return from redis and enter into socket.
            $value_length = (int) fgets($this->_connection);
    
            if ($value_length <= 0) return NULL;
    
            $response = '';
    
            // Handle reply if data is less than or equal to 8192 bytes, just read it
            if ($value_length <= 8192)
            {
                $response = fread($this->_connection, $value_length);
            }
            else
            {........
    
    image.png

    代码走到这里以后,即使$value_length传入3064,有的时候读出的数据长度也是2913

    3分析原因

    去其他框架里搜了一下 同样的位置是如何实现的功能的代码
    这里是搜索的yii2


    image.png

    这里的读取思路:是 按照给定的长度读取,读取之后再把实际读到的长度和需要的长度对比一下,如果不够,在循环读取剩下的长度
    ci框架里只读取了一次
    目前不清楚什么原因引起的一次读不全,但是基本锁定是由于

    fread($this->_connection, $value_length);
    

    一次没读全引起的('CI_VERSION', '2.2.0')

    4解决

    参考yii2-redis的思路来修改一下ci框架的代码
    代码修改前后


    image.png

    相关文章

      网友评论

        本文标题:2019-05-08

        本文链接:https://www.haomeiwen.com/subject/tsdmoqtx.html