記錄一次ci redis問(wèn)題

分享一個(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))

image.png
image.png

多次去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
        {........
image.png

代碼走到這里以后,即使$value_length傳入3064,有的時(shí)候讀出的數(shù)據(jù)長(zhǎng)度也是2913

3分析原因

去其他框架里搜了一下 同樣的位置是如何實(shí)現(xiàn)的功能的代碼
這里是搜索的yii2


image.png

這里的讀取思路:是 按照給定的長(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框架的代碼
代碼修改前后


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容