踩了Laravel Cache 的一個坑
我的一個項目,最近出現了一個神奇的bug:一個24 小時delay job 到期沒有執行,開發環境測試把24 小時改為幾分鐘都正常,但是線上就經常無故未執行。
各種排查無果,在線上開著飛機換翅膀的高難度調試法也試了,在tinker 中延遲3,5 分鐘還是1小時自動關閉,都好用,一旦改成24 小時就不好用,我就納悶了,代碼肯定是沒問題的,redis 隊列的任務寫入也正常,畢竟只是延遲時間不同。
實在沒有辦法,我懷疑是在隊列執行前有動作清理了隊列,立即想到唯一可能的就是我每天的部署動作了,我使用deployer 來做項目的部署,於是檢查了部署清單,看到其中deployer 默認有一個後置動作:artisan:cache:clear,於是坑就被我找到了:laravel 的cache:clear 命令會清空整個redis 庫!所以,還沒到24 小時執行隊列任務,它就已經被清理了...
怎麼辦呢?去掉這個任務麼?那並不合適,畢竟每次部署我們都需要一個乾淨的環境,不然出事兒也不曉得是哪一次部署帶來的問題。
所以,比較合理的解決方案是把隊列任務單獨放一個redis 庫,在我們config/database.php 中redis 部分新建一個connection,比如叫queue:
然後修改config/queue.php,將連接指定為我們上面新建的queue 即可:
這樣就把緩存數據放到數據庫1 ,隊列放到數據庫2 裡了,這樣分開就沒有這個問題存在了。
另外,附上查看redis 的命令:
- 進入redis 控制台:$ redis-cli
- 選擇數據庫:127.0.0.1:6379[2]> select 2
- 查看全部key: 127.0.0.1:6379[2]> keys *
- 查看普通緩存key:127.0.0.1:6379[2]> get 鍵名
- 查看隊列任務列表:127.0.0.1:6379[2]> zrange queues:default:delayed 0 10