異常日志
org.springframework.dao.InvalidDataAccessApiUsageException: ERR 'EVAL' command keys must in same slot. channel: [id: 0x10457fd7...
原因分析
測試環境為單機版,線上環境為集群版,導致同樣的lua腳本,在線上出錯。
lua腳本為保證事務,傳入的key必須是在同一個slot中。Redis集群引入了哈希槽的概念,一共有16348個slot,然后根據 CRC16(key) mod 16384 來計算放入哪個slot中。
解決方案
方案1(推薦)
在KEY上加{},這樣在hash key 的時候只會計算{}內的內容,使得Key落在同一個slot內。
假設有兩個Key,user:20200911,user:20200912,可以改寫成{user}:20200911,{user}:20200912,這樣redis做hash運算的時候只會取user ,這兩個key自然會落在同一個slot中。
方案2(不推薦)
線上環境切換redis至單機版,一般不建議這么做。
心得總結
1.盡量模擬一套與線上環境相似的UAT環境。保證兩者的運行環境相似。
2.對於不熟悉的技術方案,要慎用,考慮全面,引入lua腳本控制事務的時候,最好有現成的線上已運行的方案。
3.加深對底層的了解,而不僅僅只是停留在使用層面。