一、Redis與數據庫的雙一致性問題
描述:
在某些特定環境下,無論是先更新Redis
還是更新數據庫,兩者的數據都有可能不一致。
解決方案:
在網上搜索,有人給出在數據更新前後均刪除緩存,同時在更新數據庫後線程休眠一段時間,還有其他的一些的方案均很大程度上的影響的性能。
對於一些強一致性問題的數據,就不要放在緩存中了。其他的比如商品的價格,只需要在結算的保證商品價格正確無誤即可,其他時候商品價格的正確率並不一定需要達到100%。
二、緩存穿透
描述:
當黑客不斷請求緩存和數據庫均不存在的數據的時候,這個時候會導致數據庫連接異常。
解決方案:
- 接口層增加校驗,如用戶鑑權校驗,或者對
id
做基礎校驗,id<=0
的直接攔截; - 從緩存取不到的數據,在數據庫中也沒有取到,這時也可以將
key-value
對寫爲key-null
,緩存有效時間可以設置短點,如30秒(設置太長會導致正常情況也沒法使用)。這樣可以防止攻擊用戶反覆用同一個id
暴力攻擊。
三、緩存擊穿
描述:
緩存擊穿是指訪問緩存中沒有但數據庫中有的數據(一般是緩存時間到期),多用戶的併發操作引起數據庫壓力增大
解決方案:
- 設置熱點數據永遠不過期。
- 加分佈式鎖,讓未獲取到分佈式鎖的線程自旋操作,緩解數據庫的壓力。分佈式鎖的實現方案參考:https://hucheng.blog.csdn.net/article/details/106020884
四、緩存雪崩
描述:
緩存雪崩是指緩存中數據同事大批量到過期時間,引起數據庫壓力增大
解決方案:
- 緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生
- 如果緩存數據庫是分佈式部署,將熱點數據均勻分佈在不同搞得緩存數據庫中
- 設置熱點數據永遠不過期
五、利用Redis防止表單重複提交
跳轉到表單頁面的時候,服務器生成一個唯一token
保存到redis
中,同時將token
返回給頁面,並存到<input type="hidden">
標籤中,當表單提交的時候,請求比對錶單提交的token
和redis
取到的token
數據是否一致。如果一致,刪除Redis
中的token
並執行正常操作;若不一致則刪除。