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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...