Redis的各种“坑”,你知道多少?
Redis做為目前互聯網標配的技術中間件,在緩存數據庫(K-V)占有市場率一直雄霸榜首。不管是傳統項目重構,還是現在流行的分布式微服務架構,它都有廣泛應用。
物聯網系統????傳統項目網優系統重構????而且自從Redis 6.*版本正式發布,里面包含多項重大功能更新使其性能又進一步大幅度提升。更加鞏固了它在緩存數據庫的“一哥”地位。
它在架構中最基本的用法,是分擔數據壓力,提升并發量與用戶感知度。
比如:通過以下的架構,將部分非事務的操作、高頻展示信息、靜態信息等存放在Redis(用戶基本信息、權限信息、區域信息、庫存等)。
用戶請求數據時,會先從Redis獲取,如果Redis有,就直接返回,如果Redis沒有,再從數據庫里獲取,并緩存一份至Redis,下次用戶再請求時,就不用訪問數據庫,節省寶貴的數據庫資源,并提升用戶的感知度(什么操作和硬盤打交道多了,肯定快不起來)。
這時,大廠高頻面試題來了,數據是從數據庫復制到Redis中的,查詢的時候一切安好,如果此時數據發生了變化,如何保證兩者的數據一致性?請結合你的項目經驗進行闡述。
問題我詳細地描述一下:數據在Redis和MySQL都存儲了一份,那你在更新數據時,怎么保證兩邊的數據一致?先更新數據庫,再更新Redis?如下圖所示:
步驟1:線程1更新MySQL,庫存=100
步驟2:線程1更新Redis,庫存=100
步驟3:線程2更新MySQL,庫存=90
步驟4:線程2更新MySQL,庫存=90
有并發線程1和2,他們兩都需要更新庫存,如果此時命令執行順序按照預期行為走了,好像沒什么問題。
但是,如果在遠程調用過程中,網絡出了問題(抖動、超時、阻塞等)呢?如下圖所示:
步驟1:線程1更新MySQL,庫存=100
步驟2:線程2更新MySQL,庫存=90
步驟3:線程2更新Redis,庫存=90
步驟4:線程1更新MySQL,庫存=100
發現問題所在了吧,數據不符合基本邏輯了,這時候在Redis獲取的數據是錯的,和數據庫的信息不一致(數據庫中是90,而Redis中是100)。
當操作序列沒有嚴格按照請求的先后順序執行時,會引發并發安全問題。
沒錯,這就是在架構使用Redis必須考慮的數據一致性解決方案,你有思路么?以下方案你能回答出幾種?
懶加載;
延遲雙刪;
操作隊列,使用鎖;
設置超時時間;
引入其他中間件,Canal。
如果我告訴上面的方案,都行!我想繼續和你聊聊你的實際應用場景是什么?你還有思路么?
Redis作為現在互聯網企業的標配技術棧,在使用它給我們帶來便利的同時,它還會給我們帶來很多問題,數據一致性只是其中一個,除此之外,以下問題你又有考慮到么?
緩存擊穿、緩存穿透、緩存雪崩你如何解決?
數據傾斜,冷熱數據分離怎么考慮?
內存淘汰你如何考慮?
分布式鎖的高可用方案你如何考量?
Redis的性能優化你如何實現?
epoll底層實現細節
Redis 6.*新版本特性
等等,這里就不一一例舉了。
上面的問題聽過沒見過,一知半解,又或者不知道如何和實戰結合?沒關系。為了讓大家搞明白Redis在大廠的實戰場景以及它的底層實現細節(面試極愛問)。
我特邀請James(前阿里)& 大飛(前美團)來給大家分享一堂有關Redis的課程《千萬級Redis架構,底層原理剖析&企業級實戰》,本堂課程將結合實戰&高頻面試問題來帶大家一探Redis的體系知識。
添加助教老師微信“lzc1314592”或掃面下方二維碼領取課程預習資料
本號專屬福利來啦——前50名限時優惠~原價199元,限時優惠0.1元????
而且為了幫助大家搞定大廠面試,我特意申請了專屬的額外福利,當晚完成聽課后即可找助手領取:學習筆記&面試資料。
長按上圖添加助教老師微信“lzc1314592”
回復“5102”領取【2021 Java大廠面試解析+后端進階完整筆記】
總結
以上是生活随笔為你收集整理的Redis的各种“坑”,你知道多少?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新版appium 支持name定位的方法
- 下一篇: 再有人问你MySQL索引原理,就把这篇文