本文只拿這個游戲的bug來舉例Redis,如果有不妥的地方,聯系我進行刪除
描述:今天在高速上打火影(有隧道,有時候會卡),發現了個bug,我點了兩次-1000的忍玉(大概用了1千七百多忍玉),但是神器等級沒有增加,可是忍玉數量減少了,過了幾小時后,我再登錄,神器等級才看到增加。
原來神器等級58,123(沒截圖)
后面神器等級59,450
1.問題(查詢到假數據)
這里假設用的是MySQL和Redis
1.1 業務流程(將信息放入MQ,先操作數據庫,再操作Redis)
假設先對忍玉和神器等級的數據庫進行update操作,然后進行刪忍玉和神器等級緩存(為什么不是更新緩存呢,因為如果我們一直操作數據庫,就要一直更新緩存,如果用戶不進行查詢,那么這些更新緩存的操作就是多余的浪費資源,我們直接刪緩存,等用戶來查的時候我們再去查一次數據庫就好了)
如果一切正常的話,數據庫得到更新,緩存得到刪除,當用戶來查的時候,就拿到了新數據
但是由于我們卡(或其他問題),導致部分進程異常終止,導致沒有刪緩存的操作,這就導致了我們繼續查神器等級的時候,還是拿到了舊數據(Redis存有,直接返回)
2.解決方案
上面是先操作數據庫,再操作Redis
由于操作數據庫的時間遠遠大于操作Redis的時間,這就導致在操作數據庫的時候出現bug的幾率就會增大,所以,我們可以換一下順序,即 我們先操作Redis,再操作數據庫,因為操作Redis的時間很短,這個時間段內出現bug的幾率賊低,所以我們刪了緩存后,不管數據庫是否能正常執行,我們繼續查詢神奇等級的時候,肯定會比上面那種情況會好,可以拿到新數據。