一次Redis的使用Bug記錄(exec)


博主在一次項目中,使用了工具類中的Redis類,因為該Redis沒有封裝管道pipeline和exec命令,所以就大筆一揮來了一段__call;

代碼如下(其中$this->_connect()返回的為一個Redis實例)。

之后的事情感覺中文已經無法表述,上代碼就是類似這樣的

$redis->pipeline();

$redis->lpop($key);

$redis->lpop($key);

$redis->exec();

自己寫了簡單例子測試之后,正常情況下應該會返回$key隊列中的兩個棧頂元素,即array('item1','item2');但是該次最終的返回結果竟然是NULL,博主這時候

就超級疑惑,難道是call_user_fun_array()這個申請的函數是木有返回值,尼瑪,那這樣不是坑死老爹嗎。而這僅僅是個人猜測,php寶冊在手不虛,發現並無此

說明,但是有一個簡單的例子為,看下面的例子加親自測試是有返回值,那就是說此次猜想不成功。

好吧,只能繼續debug了,許久之后依然木有發現問題,請教公司一同事,他來了之后發現你說那就既然是$this->_connect()是一個redis對象,

那上面不是還有一個$this->_redis的句柄嗎,直接替換,之后在神奇的事情發生了,尼瑪有返回值了。

好吧,那問題就可以猜想一二了,這個肯定說明了$this->_connect()和$this->_redis肯定有哪些地方不太一樣,如上面的代碼,我們直接把兩個變量dump了出來。

之后發現是這樣的,如下圖看官們應該明白這根本是不同的兩個資源。

感覺知道問題所在了,返回了看_connect()函數,發現里面是沒有Redis單例的,每次都是new了一個Redis對象。

所以還不知道問題所在的看官可以繼續跟着哥往下走。

這個問題呢,我們技術人啥也不說了,上代碼,在一批redis的操作命令中,動用了三個不同的redis對象,第三次是直接exec,連pipeline都木有,那肯定是NULL.

這你敢相信,反正我是信了,我也是醉了,當然也是我自己坑了自己。問題到此真相大白。有一次自坑的打怪之路。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM