CodeIgniterCodeIgniter

2019-05-08

2019-10-25  本文已影响0人  wxy1

分享一个使用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
上一篇下一篇

猜你喜欢

热点阅读