分享一個(gè)使用redis過(guò)程中遇到的問(wèn)題
1問(wèn)題
在ci框架('CI_VERSION', '2.2.0')中 使用redis緩存一個(gè)key-value格式的數(shù)據(jù)
然后每次get 同一個(gè)key獲取的數(shù)據(jù)長(zhǎng)度不一樣 (value的長(zhǎng)度比較長(zhǎng))
多次去get數(shù)據(jù)吴裤,都是這兩種結(jié)果 string(2913)就是丟失數(shù)據(jù)了。
更換不同的redis服務(wù)以后 同樣會(huì)出現(xiàn)這個(gè)問(wèn)題淌友,基本可以排除是redis引起的問(wèn)題窑睁。
懷疑是框架本身的問(wèn)題
2排查問(wèn)題
通過(guò)跟蹤代碼找到最后出問(wèn)題的地方
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
{........
代碼走到這里以后,即使$value_length傳入3064,有的時(shí)候讀出的數(shù)據(jù)長(zhǎng)度也是2913
3分析原因
去其他框架里搜了一下 同樣的位置是如何實(shí)現(xiàn)的功能的代碼
這里是搜索的yii2
這里的讀取思路:是 按照給定的長(zhǎng)度讀取托慨,讀取之后再把實(shí)際讀到的長(zhǎng)度和需要的長(zhǎng)度對(duì)比一下鼻由,如果不夠,在循環(huán)讀取剩下的長(zhǎng)度
ci框架里只讀取了一次
目前不清楚什么原因引起的一次讀不全,但是基本鎖定是由于
fread($this->_connection, $value_length);
一次沒(méi)讀全引起的('CI_VERSION', '2.2.0')
4解決
參考yii2-redis的思路來(lái)修改一下ci框架的代碼
代碼修改前后