踩了Laravel Cache 的一個坑

blank

踩了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 的命令:

  1. 進入redis 控制台:$ redis-cli
  2. 選擇數據庫:127.0.0.1:6379[2]> select 2
  3. 查看全部key: 127.0.0.1:6379[2]> keys *
  4. 查看普通緩存key:127.0.0.1:6379[2]> get 鍵名
  5. 查看隊列任務列表:127.0.0.1:6379[2]> zrange queues:default:delayed 0 10

What do you think?

Written by marketer

blank

ICP經營許可證能不能挂靠

blank

【京智計劃】008:京東內容營銷全方位解析,商家運營必看!