傳送郵件出現問題

王滔發表於2015-06-14

情況:收不到郵件。

 

郵件傳送系統並沒有問題。






排查思路:

1、傳送一次,先去資料庫看看是否驗證碼是不是重新生成一次了

select * from uc_verify_code where uid=21306555

目的是確保已經生成到資料庫,因為只有這樣子才會加入到資料庫去的。

2、去看看redis佇列任務的長度

加入到資料庫後,才會加入到redis佇列中去。

使用如下命令檢視:

LLEN task_send_email

看看是不是為0。

 

目前發現是0。說明任務佇列完全沒有加入到redis中過去。去一下redis的空間。最後發現是redis爆滿了,加不進去,其實加入的程式碼也有問題。沒有進行判斷。

 

要判斷失敗還是成功。這樣會好點。


3、手動執行一下傳送郵件的任務佇列指令碼:

這個任務帶有鎖的,同時刻只能一個指令碼在執行,其他指令碼是不能執行了

快取鎖是在redis裡面儲存了一個key,執行指令碼的時候就儲存進去。

 



key的值為:send_email_queue_lock

如果提示:is starting,就表示已經有其他程式在執行了。

要刪除掉這個key:send_email_queue_lock



列出key的大小:

http://segmentfault.com/q/1010000000625993






以後要做一些工具。可以操作redis的工具,這樣可以自己列出來看看。

其實搭建一個redis介面工具就能解決這個問題。

 

後續排查:redis的空間爆滿,佔據了20多g。怎麼那麼快。把那個佔據記憶體最多的key:update_reside_ctiy,這是一個list資料結構。竟然有上億條記錄在裡面了。

刪除掉後,過了一天還是一樣記憶體暴漲。最後去排查update_reside_ctiy這個key到底是什麼原因漲得這麼快。

 

被刷資料了




type key的值:

返回值:
    none (key不存在)
    string (字串)
    list (列表)
    set (集合)
    zset (有序集)
    hash (雜湊表)




列出key的大小:

http://segmentfault.com/q/1010000000625993


思考:當redis記憶體空間爆滿的時候,並不會造成資料踢下去嗎?還是加不進去呢?這樣的程式碼邏輯要改一改才行了。
不會丟擲異常的。平時要監控好才行。

相關文章