什么緩存擊穿、雪崩、穿透

      網友投稿 645 2022-05-28

      隨著互聯網的越來越普及,用戶越來越多,系統性能瓶頸成了越來越熱門的話題。要解決性能問題的技術手段有很多,比如:緩存、CDN加速、頁面靜態化、集群、分布式、異步等。

      緩存通常被作為首先技術方案,簡單而且提升效果明顯,它能夠將速度提升100倍。那么問題來了,緩存為啥會怎么快呢?

      因為傳統的數據庫操作是基于磁盤的,而緩存是基于內存的,內存操作和磁盤操作的速度根本不是一個數量級的。目前市面上主流的緩存有:redis 和 memcache,這兩個都是基于內存的緩存技術,二者的區別我在這里暫時不講。使用緩存的偽代碼一般如下:

      String?order?=?redisClient.get(key);

      if(order != null) {

      return order;

      }

      order?=?db.get(key);

      redisClient.put(key,order);

      redisClient.expire(key,3000);

      return order;

      根據key獲取數據,先從緩存中查一下有沒有,如果有則直接返回。如果沒有,再從數據庫中查到數據,然后將數據放入緩存中,并且給當前key設置一個失效時間,下次再用同樣的key來請求數據時,就能夠直接從緩存中查詢到并返回,減少請求數據庫的頻次,提升性能,因為數據庫連接是稀有資源。

      那么問題又來了,為啥要設置失效時間,不設置不行嗎?

      著名的2/8原則告訴我們,經常訪問的數據集中在20%,而另外的80%屬于不常用數據。我們都知道內存相當于磁盤來說價格是比較昂貴的,不信你買個500G的硬盤 和 一個 500G的內存試試。既然這么貴,我們應該節約使用,所以才會有設置失效時間這種策略,一旦檢測到某個key超過了失效時間,就會將該key從緩存中刪除,可以節約內存。

      還有個問題:如果在某個key失效的時候,有大量的請求一起過來會怎么樣?

      這就是我今天要給大家講的:擊穿。

      大量的請求訪問同一個key,剛好那個key失效了,那么同一時間所有的請求,都會穿過緩存,直接請求數據庫,此時的數據庫有可能因為無法扛著這么大的并發,直接掛了。

      再問一下:如果大量的請求訪問多個key,剛好key同時失效了會怎么樣?

      這就是我今天要給大家講的:雪崩。

      雪崩比上面的擊穿更嚴重,擊穿只是一個key失效了,大量請求直接訪問數據庫都有可能把數據庫搞掛,更何況大量的key同時失效的場景,數據庫面臨的壓力更大,更有可能掛掉。

      接下來的問題:如果大量的用戶請求緩存中不存在的key又會怎么樣?

      這就是我今天要給大家講的:穿透。

      有大量的請求訪問時,只有少部分的key在緩存中存在,而有大量的key不存在,這樣請求也會直接訪問到數據庫,也會導致數據庫扛不住壓力而掛掉。這種情況往往是黑客偽造請求,發起的惡意攻擊。

      那么,這些問題有沒有解決辦法呢?

      首先,擊穿的解決辦法-加鎖。

      偽代碼如下:

      String order = redisClient.get(key);

      if(order != null) {

      return order;

      }

      lock() {

      String order = redisClient.get(key);

      if(order?!=?null)?{

      return order;

      }

      order = db.get(key);

      redisClient.put(key,order);

      redisClient.expire(key,3000);

      }

      return order;

      如果根據key從緩存中查詢不到數據,需要從數據庫中查詢數據的時候,加一把鎖,保證同一時間只有一個線程可以查詢數據庫,然后把查詢出來的結果放回到緩存中。這樣其他的線程再用相同的key查詢時,就可以直接從緩存中查到數據。這樣就能夠極大的減少數據庫的訪問頻次。

      其次,雪崩的解決辦法-?加鎖 + key設置不同的失效時間。

      加鎖的偽代碼跟上面是一樣的我就不寫了。

      雪崩還有一個必要條件就是在同一時間,有大量的key同時失效。我們只要保證不會出現同一時間有大量的key同時失效就可以了,每個key設置不同的失效時間就能解決問題。

      最后,穿透的解決辦法- 業務規則過濾 + 布隆過濾器

      業務規則過濾 可以校驗 key的長度或者比如前綴SD開頭的等,過濾一批非法數據。

      接下來看看布隆過濾器:

      什么是緩存擊穿、雪崩、穿透

      布隆過濾器中會初始化數據庫中key的標識。如果有大量請求訪問不存在的key時,先通過布隆過濾器檢查一下key在數據庫中是否存在,如果存在才允許訪問數據庫。如果不存在,則直接返回,這樣就可以過濾掉大量的非法請求。

      數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:初學C語言推薦軟件:codeblock安裝與使用教程
      下一篇:自動駕駛仿CARLA使用記錄
      相關文章
      亚洲性日韩精品一区二区三区| 亚洲国产精品无码久久久| 亚洲AV无码久久久久网站蜜桃| 亚洲综合一区二区精品导航| 亚洲成Av人片乱码色午夜| 国产成人综合亚洲亚洲国产第一页| 国产产在线精品亚洲AAVV| 色偷偷尼玛图亚洲综合| 久久亚洲色WWW成人欧美| 亚洲成av人在线观看网站| 亚洲国产精华液2020| 亚洲第一成年网站视频| 亚洲国产AV一区二区三区四区| 亚洲第一第二第三第四第五第六| 亚洲avav天堂av在线网毛片| 亚洲AV无码专区在线观看成人| 色偷偷噜噜噜亚洲男人| 国产精品亚洲一区二区三区久久| 人人狠狠综合久久亚洲高清| 亚洲精品成人在线| 久久夜色精品国产亚洲av| 伊人久久大香线蕉亚洲五月天| 国产午夜亚洲精品理论片不卡| 亚洲日韩欧洲乱码AV夜夜摸| 亚洲精品乱码久久久久久按摩| 精品亚洲永久免费精品| 亚洲国产精品久久久久婷婷软件| 老色鬼久久亚洲AV综合| 亚洲欧洲国产经精品香蕉网| 亚洲AV无码精品蜜桃| 亚洲色偷精品一区二区三区| 久久精品国产亚洲av瑜伽| 亚洲成a人无码av波多野按摩| 4338×亚洲全国最大色成网站| 亚洲日韩v无码中文字幕| 亚洲AV日韩AV永久无码免下载| 亚洲视频中文字幕在线| 国产精品亚洲专区在线观看| 亚洲国产欧洲综合997久久| 亚洲国产综合人成综合网站| 亚洲精品无码MV在线观看|