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

來源:互聯網
上載者:User

標籤:

博主在一次項目中,使用了工具類中的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.

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

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.