日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

面试前必须要知道的Redis面试题

發布時間:2025/3/21 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试前必须要知道的Redis面试题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

回顧前面:

  • 從零單排學Redis【青銅】

  • 從零單排學Redis【白銀】

  • 從零單排學Redis【黃金】

  • 從零單排學Redis【鉑金一】

  • 從零單排學Redis【鉑金二】

Redis

今天來分享一下Redis幾道常見的面試題:

  • 如何解決緩存雪崩?

  • 如何解決緩存穿透?

  • 如何保證緩存與數據庫雙寫時一致的問題?

一、緩存雪崩

1.1 什么是緩存雪崩?

回顧一下我們為什么要用緩存(Redis):

為什么要緩存

現在有個問題,如果我們的緩存掛掉了,這意味著我們的全部請求都跑去數據庫了

如果緩存掛掉了,全部請求跑去數據庫了

在前面學習我們都知道Redis不可能把所有的數據都緩存起來(內存昂貴且有限),所以Redis需要對數據設置過期時間,并采用的是惰性刪除+定期刪除兩種策略對過期鍵刪除。Redis對過期鍵的策略+持久化

如果緩存數據設置的過期時間是相同的,并且Redis恰好將這部分數據全部刪光了。這就會導致在這段時間內,這些緩存同時失效,全部請求到數據庫中。

這就是緩存雪崩

  • Redis掛掉了,請求全部走數據庫。

  • 對緩存數據設置相同的過期時間,導致某段時間內緩存失效,請求全部走數據庫。

緩存雪崩如果發生了,很可能就把我們的數據庫搞垮,導致整個服務癱瘓!

1.2 如何解決緩存雪崩?

對于“對緩存數據設置相同的過期時間,導致某段時間內緩存失效,請求全部走數據庫?!边@種情況,非常好解決:

  • 解決方法:在緩存的時候給過期時間加上一個隨機值,這樣就會大幅度的減少緩存在同一時間過期

對于“Redis掛掉了,請求全部走數據庫”這種情況,我們可以有以下的思路:

  • 事發前:實現Redis的高可用(主從架構+Sentinel 或者Redis Cluster),盡量避免Redis掛掉這種情況發生。

  • 事發中:萬一Redis真的掛了,我們可以設置本地緩存(ehcache)+限流(hystrix),盡量避免我們的數據庫被干掉(起碼能保證我們的服務還是能正常工作的)

  • 事發后:redis持久化,重啟后自動從磁盤上加載數據,快速恢復緩存數據

二、緩存穿透

2.1 什么是緩存穿透

比如,我們有一張數據庫表,ID都是從1開始的(正數):

隨便找了一張數據庫表

但是可能有黑客想把我的數據庫搞垮,每次請求的ID都是負數。這會導致我的緩存就沒用了,請求全部都找數據庫去了,但數據庫也沒有這個值啊,所以每次都返回空出去。

緩存穿透是指查詢一個一定不存在的數據。由于緩存不命中,并且出于容錯考慮,如果從數據庫查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到數據庫去查詢,失去了緩存的意義。

緩存穿透

這就是緩存穿透

  • 請求的數據在緩存大量不命中,導致請求走數據庫。

緩存穿透如果發生了,也可能把我們的數據庫搞垮,導致整個服務癱瘓!

2.1 如何解決緩存穿透?

解決緩存穿透也有兩種方案:

  • 由于請求的參數是不合法的(每次都請求不存在的參數),于是我們可以使用布隆過濾器(BloomFilter)或者壓縮filter提前攔截,不合法就不讓這個請求到數據庫層!

  • 當我們從數據庫找不到的時候,我們也將這個空對象設置到緩存里邊去。下次再請求的時候,就可以從緩存里邊獲取了。

    • 這種情況我們一般會將空對象設置一個較短的過期時間。

參考資料:

  • 緩存系列文章--5.緩存穿透問題

    • https://carlosfu.iteye.com/blog/2248185

三、緩存與數據庫雙寫一致

3.1 對于讀操作,流程是這樣的

上面講緩存穿透的時候也提到了:如果從數據庫查不到數據則不寫入緩存。

一般我們對讀操作的時候有這么一個固定的套路

  • 如果我們的數據在緩存里邊有,那么就直接取緩存的。

  • 如果緩存里沒有我們想要的數據,我們會先去查詢數據庫,然后將數據庫查出來的數據寫到緩存中。

  • 最后將數據返回給請求

3.2 什么是緩存與數據庫雙寫一致問題?

如果僅僅查詢的話,緩存的數據和數據庫的數據是沒問題的。但是,當我們要更新時候呢?各種情況很可能就造成數據庫和緩存的數據不一致了。

  • 這里不一致指的是:數據庫的數據跟緩存的數據不一致

數據庫和緩存的數據不一致

從理論上說,只要我們設置了鍵的過期時間,我們就能保證緩存和數據庫的數據最終是一致的。因為只要緩存數據過期了,就會被刪除。隨后讀的時候,因為緩存里沒有,就可以查數據庫的數據,然后將數據庫查出來的數據寫入到緩存中。

除了設置過期時間,我們還需要做更多的措施來盡量避免數據庫與緩存處于不一致的情況發生。

3.3 對于更新操作

一般來說,執行更新操作時,我們會有兩種選擇:

  • 先操作數據庫,再操作緩存

  • 先操作緩存,再操作數據庫

首先,要明確的是,無論我們選擇哪個,我們都希望這兩個操作要么同時成功,要么同時失敗。所以,這會演變成一個分布式事務的問題。

所以,如果原子性被破壞了,可能會有以下的情況:

  • 操作數據庫成功了,操作緩存失敗了。

  • 操作緩存成功了,操作數據庫失敗了。

如果第一步已經失敗了,我們直接返回Exception出去就好了,第二步根本不會執行。

下面我們具體來分析一下吧。

3.3.1 操作緩存

操作緩存也有兩種方案:

  • 更新緩存

  • 刪除緩存

一般我們都是采取刪除緩存緩存策略的,原因如下:

  • 高并發環境下,無論是先操作數據庫還是后操作數據庫而言,如果加上更新緩存,那就更加容易導致數據庫與緩存數據不一致問題。(刪除緩存直接和簡單很多)

  • 如果每次更新了數據庫,都要更新緩存【這里指的是頻繁更新的場景,這會耗費一定的性能】,倒不如直接刪除掉。等再次讀取時,緩存里沒有,那我到數據庫找,在數據庫找到再寫到緩存里邊(體現懶加載)

  • 基于這兩點,對于緩存在更新時而言,都是建議執行刪除操作!

    3.3.2 先更新數據庫,再刪除緩存

    正常的情況是這樣的:

    • 先操作數據庫,成功;

    • 再刪除緩存,也成功;

    如果原子性被破壞了:

    • 第一步成功(操作數據庫),第二步失敗(刪除緩存),會導致數據庫里是新數據,而緩存里是舊數據。

    • 如果第一步(操作數據庫)就失敗了,我們可以直接返回錯誤(Exception),不會出現數據不一致。

    如果在高并發的場景下,出現數據庫與緩存數據不一致的概率特別低,也不是沒有:

    • 緩存剛好失效

    • 線程A查詢數據庫,得一個舊值

    • 線程B將新值寫入數據庫

    • 線程B刪除緩存

    • 線程A將查到的舊值寫入緩存

    要達成上述情況,還是說一句概率特別低

    因為這個條件需要發生在讀緩存時緩存失效,而且并發著有一個寫操作。而實際上數據庫的寫操作會比讀操作慢得多,而且還要鎖表,而讀操作必需在寫操作前進入數據庫操作,而又要晚于寫操作更新緩存,所有的這些條件都具備的概率基本并不大。

    對于這種策略,其實是一種設計模式:Cache Aside Pattern

    先修改數據庫,再刪除緩存

    刪除緩存失敗的解決思路

    • 將需要刪除的key發送到消息隊列中

    • 自己消費消息,獲得需要刪除的key

    • 不斷重試刪除操作,直到成功

    3.3.3 先刪除緩存,再更新數據庫

    正常情況是這樣的:

    • 先刪除緩存,成功;

    • 再更新數據庫,也成功;

    如果原子性被破壞了:

    • 第一步成功(刪除緩存),第二步失敗(更新數據庫),數據庫和緩存的數據還是一致的。

    • 如果第一步(刪除緩存)就失敗了,我們可以直接返回錯誤(Exception),數據庫和緩存的數據還是一致的。

    看起來是很美好,但是我們在并發場景下分析一下,就知道還是有問題的了:

    • 線程A刪除了緩存

    • 線程B查詢,發現緩存已不存在

    • 線程B去數據庫查詢得到舊值

    • 線程B將舊值寫入緩存

    • 線程A將新值寫入數據庫

    所以也會導致數據庫和緩存不一致的問題。

    并發下解決數據庫與緩存不一致的思路

    • 將刪除緩存、修改數據庫、讀取緩存等的操作積壓到隊列里邊,實現串行化。

    將操作積壓到隊列中

    3.4 對比兩種策略

    我們可以發現,兩種策略各自有優缺點:

    • 先刪除緩存,再更新數據庫

      • 在高并發下表現不如意,在原子性被破壞時表現優異

    • 先更新數據庫,再刪除緩存(Cache Aside Pattern設計模式)

      • 在高并發下表現優異,在原子性被破壞時表現不如意

    3.5 其他保障數據一致的方案與資料

    可以用databus或者阿里的canal監聽binlog進行更新。

    參考資料:

    • 緩存更新的套路

      • https://coolshell.cn/articles/17416.html

    • 如何保證緩存與數據庫雙寫時的數據一致性?

      • https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-consistence.md

    • 分布式之數據庫和緩存雙寫一致性方案解析

      • https://zhuanlan.zhihu.com/p/48334686

    • Cache Aside Pattern

      • https://blog.csdn.net/z50l2o08e2u4aftor9a/article/details/81008933

    最后

    這是幾道Redis常見的面試題,希望大家看完有所幫助,順利拿到offer!

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的面试前必须要知道的Redis面试题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 超碰最新上传 | 美女视频网址 | 久久av网| 波多野结衣高清电影 | 女仆乖h调教跪趴1v1 | 天天插天天干天天操 | 久久狠狠婷婷 | 孕期1ⅴ1高h | 久久99精品国产.久久久久 | 日韩免费在线播放 | 51ⅴ精品国产91久久久久久 | 深夜的私人秘书 | 自拍偷拍视频在线 | 日韩精品成人一区二区在线 | 一本久| 秋霞影院午夜伦 | 在线日韩成人 | 中国白嫩丰满人妻videos | 日韩精品免费在线观看 | 伊人动漫| 精品久久久久久久久久久久久久久久久久 | 天天看夜夜操 | 美女自拍偷拍 | 久久av在线 | 日本污污网站 | 国内自拍视频在线播放 | 在线观看欧美一区 | 欧美五月| 亚洲av无码专区国产乱码不卡 | 日本一区欧美 | 欧美熟妇精品一区二区 | 成人国产精品久久久网站 | 一级肉体全黄裸片中国 | 骚虎av | 粉嫩av一区二区三区 | 久久久久中文字幕 | 亚洲免费中文 | 色偷偷免费费视频在线 | 久久成人av| 欧美特一级片 | 帮我拍拍漫画全集免费观看 | 黄色片小视频 | 玖玖爱精品 | 俺也来俺也去俺也射 | 激情网五月 | japanese在线观看 | 中文写幕一区二区三区免费观成熟 | 97视频免费在线观看 | 河北彩花av在线播放 | 五月深爱婷婷 | 91精品国产成人 | 狠狠爱五月婷婷 | 1024精品一区二区三区日韩 | 影音先锋人妻啪啪av资源网站 | 丝袜制服影音先锋 | 国产成人av网 | 97国产精东麻豆人妻电影 | 免费av一级 | 亚洲综合色成人 | 精品欧美一区二区久久久 | 漂亮人妻被黑人久久精品 | 永久免费不卡在线观看黄网站 | 久久久久国产精品无码免费看 | 亚欧毛片 | 亚洲av乱码久久精品蜜桃 | 一区二区福利视频 | 综合在线观看 | 非洲黑人毛片 | 日本簧片在线观看 | 成人午夜视频在线免费观看 | 欧美成人视屏 | 伊人久久一区二区三区 | 在线亚洲人成电影网站色www | 亚洲精品久久久 | 日本a在线免费观看 | 日本一区二区三区免费观看 | 国产精品美乳在线观看 | 黄色免费视频 | 久久久久久久久久免费视频 | 最新毛片网 | 99精品免费 | 精品久久久久久无码中文野结衣 | 色偷偷免费费视频在线 | 亚洲乱论 | 国产精品第9页 | 欧美色哟哟 | 免费看的黄网站 | 成人久久久精品国产乱码一区二区 | 欧美日韩经典 | 欧美日日操 | 国产精品一区二区免费看 | 五月天激情开心网 | 久久亚洲AV成人无码国产人妖 | 欧美一级高潮片 | 黄色在线观看国产 | 美女免费福利视频 | 欧美在线一二三 | 麻豆精品久久久久久久99蜜桃 | 免费看片91 |