Redis中幾個簡單的概念:緩存穿透/擊穿/雪崩,別再被嚇唬了

来源:https://www.cnblogs.com/wy123/archive/2019/12/12/12027578.html
-Advertisement-
Play Games

Redis中幾個“看似”高大上的概念,經常有人提到,某些好事者喜歡死扣概念,實戰沒多少,嘴巴裡冒出來的全是高大上的名詞,個人一向鄙視概念黨,呵呵,尼瑪! 其實這幾個概念:緩存穿透/緩存擊穿/緩存雪崩,有一個共通的相似之處,就是高併發下,某些原因導致緩存層失去了保護,導致後端的持久化層(資料庫)承擔較 ...


 

Redis中幾個“看似”高大上的概念,經常有人提到,某些好事者喜歡死扣概念,實戰沒多少,嘴巴裡冒出來的全是高大上的名詞,個人一向鄙視概念黨,呵呵!

其實這幾個概念:緩存穿透/緩存擊穿/緩存雪崩,有一個共通的相似之處,就是高併發下,某些原因導致緩存層失去了保護,導致後端的持久化層(資料庫)承擔較大壓力的情形。
需要註意的是,這些問題發生的前提,需要有足夠大的併發性,如果本身併發性不高,那些即便出現了這些個問題,也不會造成非常大的影響。
甚至極端地講,只要代碼的健壯性足夠,即便是緩存層全部宕機,也不會導致整個應用程式的崩潰,只不過是所有的請求都指向後端的持久化資料庫層罷了。
試問,排出一些低級的問題包括方案,君見過多少請求壓垮資料庫的場景,或者數據緩存流行之前應用程式就應付不了高併發?
使用緩存,更多的進一步改善性能或者併發,而不是因為資料庫被壓垮了才使用緩存。

緩存穿透
緩存穿透本質上是查詢一個緩存和資料庫中都不存在的key值,Redis的緩存層無法命中,導致請求再次指向執行資料庫層的情況。
由於是查詢到值不存在(當然也不存在與Redis緩存中),導致請求總是“穿透”Redis發往資料庫層,因此緩存層失去了“保護”關係資料庫層的意義。
解決方案:
布隆過濾器是一個比較好的選擇,參考:https://www.cnblogs.com/wy123/p/11571215.html

緩存擊穿
緩存穿透本質上是高併發地請求一個緩存中不存在,但是資料庫中可能存在的key值,因此請求指向資料庫,導致資料庫端承擔大量的請求壓力的情況,本質上跟緩存穿透一樣。
主要側重的是併發&&“熱點”Key不存在與緩存中,導致請求指向資料庫層。
解決方案:
這種場景可以從代碼邏輯層面優化,從緩存中查詢不到數據,再次將請求轉向資料庫中的時候,鎖定該key,獲取到該key之後,將該key寫入緩存

value = get_value_from_redis(key1)
if not value:
    if exclusiveness_lock(key1):#成功排他性鎖定目標,請求指向資料庫
        value = get_value_from_mysql(key1)
      if value:
          write_key_to_redis(key1,value)
    else:#無法獲取排他性鎖,間隔0.1s之後再次查詢緩存
        time.sleep(0.1)
        # 再次從緩存中查詢
        get_value_from_redis(key1)       

緩存雪崩
某些原因,比如:
1,Redis實例(主從,集群,哨兵等等)故障。
2,Redis中的key由於過期時間已到,自動過期。
3,由於Redis記憶體策略導致(maxmemory,maxmemory-policy配置)某些key失效(過期,被清理出緩存等)。
如果此時出現高併發的請求出現,這些請求會全部指向資料庫層,緩存層失去了對資料庫層的保護,導致資料庫承擔絕大壓力的情況。
解決方案:
1,Redis層的高可用,保證緩存層可以有效地保護資料庫層
2,從Redis配置(記憶體管理策略maxmemory,maxmemory-policy)以及結合業務,避免某些潛在的熱點key值過期
3,應用程式端限流,或者通過隊列的方式等削峰的方式來保護後端資料庫

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文介紹瞭如何安裝sqoop,以及如何使用sqoop導入數據到hadoop、hive中去 ...
  • 第一個Mybatis程式 一、環境: 1、JDK1.8 2、MYSQL5.7 3、IDEA 4、MAVEN 3.63 二、Mybatis認識: 1、查看官方文檔 https://mybatis.org/mybatis-3/zh/index.html 2、查看百度百科 https://baike.so ...
  • 1.vim /etc/my.cnf 2.在[mysqld]下添加一行skip-grant-tables,然後保存並退出。 3.重啟mysql服務:service mysqld restart。 4.不用密碼直接登錄 mysql -u root 5.通過SQL修改root密碼 MySQL> UPDAT ...
  • 當打開sql server2008企業管理器的時候,出現報錯“評估期已過。有關如何升級的測試版軟體的信息.....” 修改註冊表:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/100/ConfigurationState里的 C ...
  • 問題描述:spool讓我想起來了spooling假離線,但是這個spool是oracle下的命令,將select查詢出來的數據列印出來 1.linuxi下 spool +路徑+文件名,這裡的文件如果不存在,是可以自動生成的 spool /home/oracle/b.txt select查詢語句 sp ...
  • 一、redis簡介 一般學習,最好先去官網,之所以建議看官網,是因為這是一手的學習資料,其他資料都最多只能算二手,一手資料意味著最權威,準確性最高。https://redis.io/topics/introduction。如果像我一樣,英語不好的童鞋,不要緊,咋們用Chrome瀏覽器,翻譯成中文。E ...
  • 錯誤的意思是listener 不知道連接解析器中的請求服務,這裡要說靜態監聽和動態監聽了動態註冊是在instance啟動的時候PMON進程根據init.ora中的instance_name,service_names兩個參數將實例和服務動態註冊到listener中。靜態註冊就是實例啟動時讀取list ...
  • oracle資料庫實例啟動過程分三個步驟,分別是啟動實例,載入資料庫,打開數據。 1.NOMOUNT模式:這種模式只會創建實例,不會打開任何的數據文件,用戶要以sysdba的身份登錄,才具有關閉和啟動資料庫實例的許可權,根據參數文件啟動實例 2.MOUNT模式:啟動實例,裝載資料庫但是保持資料庫關閉的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...