1. 程式人生 > 其它 >Redis鎖非同步執行緒中使用問題

Redis鎖非同步執行緒中使用問題

1.出現的問題:

訂單中心查詢時,出現重複資料,如下圖:

 

 

 

 

出現上圖結果的原因在於,該訂單記錄存在兩條評價記錄。

 

 

 

 

根據現有的業務需求,一個圖文諮詢訂單應該只會存在一條有效的評價記錄,但此處可以看到orderId為2021011400000082的訂單出現了兩條評價記錄。

 

2.定位問題出現的原因:

(1)新增評價記錄方法程式碼截圖

 

 

上圖中可以看到此處使用redis鎖,並且在鎖中有判斷是否已存在記錄,已存在這直接return,不會建立新的記錄。

 

1.醫生結束方法和系統自動結束方法都會呼叫新增待評價記錄方法;

2.在系統結束時會非同步丟擲系統結束事件,該事件內判斷當無待處理處方時,會自動呼叫醫生結束方法(模擬醫生結束)。

下圖1-3為系統結束、系統結束事件及醫生結束程式碼截圖:


 

 


(圖1)系統自動結束方法

 

 


(圖2)系統自動結束事件實現


 

 


(圖3)醫生結束方法

 

 




評價表設計如圖4,其中orderId為評價物件的唯一主鍵。

 

 


(圖4)使用者評價物件

 



下圖5為新增評價記錄方法,使用Redis鎖,鎖了一個自定義鍵值,然後使用sql查詢進行判斷評價記錄是否存在,存在則return。在同一個事務中,該邏輯沒有問題,能夠有效避免對一個orderId重複建立評價記錄的情況,但是當兩個不同的事務的同時觸發了該方法對一個同一個orderId建立評價記錄時,未能命中快取索引,此時的鎖就沒有起到作用了。