分享一个使用redsi过程中遇到的问题
1问题
在ci框架('CI_VERSION', '2.2.0')中 使用redis缓存一个key-value格式的数据
然后每次get 同一个key获取的数据长度不一样 (value的长度比较长)
多次去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
网友评论