Redis 緩存擊穿、緩存穿透、緩存雪崩的處理方法

常用的分布式緩存Redis單機并發量能達到萬級,常用的關系型數據庫MySQL一般并發量是千級,他們支持的并發量可能差十倍,所以要盡可能把流量攔截在緩存層。

緩存擊穿

一個并發訪問量比較大的key在某個時間過期,導致所有的請求直接打在DB上。這就叫緩存擊穿,這會增大數據庫的負載。
在這里插入圖片描述

如何解決緩存擊穿?

1、加鎖更新:查詢緩存,發現緩存中不存在,加鎖,讓其他線程等待,只讓一個線程去更新緩存

2、異步更新:把緩存設置成永不過期,后臺設置一個守護線程定時更新緩存,但這種定時比較難以把控。此機制更適合用于緩存預熱

緩存穿透

緩存穿透指的是查詢緩存和數據庫中都不存在的數據,這樣每次請求就會直接打到數據庫上,相當于緩存不存在了,緩存失去了保護后端存儲的意義。緩存穿透可能會使得后端存儲負載加大,如果發現大量存儲層空命中,可能就是出現了緩存穿透問題。
在這里插入圖片描述

緩存穿透可能有兩種原因:

1、自身業務代碼問題

2、惡意攻擊,爬蟲造成空命中

如何解決緩存穿透?

1、緩存空值/默認值

在數據庫不命中之后,把一個空對象或者默認值保存到緩存,之后再訪問這個數據,就會從緩存中獲取,這樣就保護了數據庫

在這里插入圖片描述

緩存空值會有兩個問題:

1、空值做緩存,意味著緩存層存了更多的key,需要更多的內存空間。比較有效的方法時針對這類數據設置一個較短的過期時間,讓其自動剔除

2、緩存層和存儲層的數據都會有一段時間窗口不一致,可能會對業務有一定影響,如果過期時間設置為5分鐘,如果此時存儲層添加了這個數據,那么此段時間就會出現緩存曾和存儲層數據不一致。

此時可以利用消息隊列或者其他異步方式清理緩存中的空對象

2、布隆過濾器

可以再存儲和緩存之前加一個布隆過濾器,做一層過濾。

在這里插入圖片描述

布隆過濾器優點類似于哈希表,它是一個連續的數據結構,每個存儲位都是一個bit,用0或1來標識數據是否存在。存儲數據的時候,使用K個不同的哈希函數將這個變量映射到bit列表的K個點,把它們置1。

我們判斷緩存key是否存在的時候,同樣使用K個對應的哈希函數,映射到bit列表上的K個點,判斷是不是1。

如果不是全1,那么說明key不存在。如果都是1,說明key可能存在(因為哈希函數是存在碰撞的)。

總結以下緩存穿透解決方案:

ey不存在。如果都是1,說明key可能存在(因為哈希函數是存在碰撞的)。

總結以下緩存穿透解決方案:

解決緩存傳統適用場景維護成本
緩存空對象數據命中不高;數據頻繁實時性高代碼維護簡單;需要較多的緩存空間;數據不一致
布隆過濾器數據命中不高;數據相對固定,實時性低代碼維護復雜;緩存空間占用少

緩存雪崩

指的是在某一時刻發生大規模的緩存失效的情況,例如緩存服務器宕機、大量key在同一時間過期,這樣的后果就是大量的請求進來直接打在數據庫上,可能導致整個系統崩潰,稱為雪崩。
在這里插入圖片描述

緩存雪崩式問題該如何預防和處理?
1、提高緩存可用性

  • 集群部署:通過集群提升緩存的可用性,利用redis本身的redis cluster或者第三方集群方案
  • 多級緩存:設置多級緩存,第一季緩存失效的基礎上,訪問二級緩存,每一級緩存的失效時間都不一樣

2、合理設置過期時間

  • 均勻過期:為了避免大量的緩存在同一時間過期,可以把不同的key過期時間隨機生成,避免時間太過集中
  • 熱點數據永不過期

3、熔斷降級

  • 服務熔斷:當緩存服務器宕機或者超時響應時,為了防止整個系統出現雪崩,暫時停止業務服務訪問緩存系統
  • 服務降級:當出現大量緩存失效,而且處在高并發高負荷的情況下,在業務系統內部暫時舍棄對一些非核心的接口和數據的請求,而是直接返回一個提前準備好的fallback錯誤處理信息

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376868.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java-- 異常與記錄日志

可以使用java.util.logging工具將輸出記錄在日志中。記錄日志的的功能還是很簡單的,下面直接鋪出代碼: 1 package com.exceptions;2 3 import java.io.*;4 import java.util.logging.Logger;5 6 class LoggingException extends Exception{7 private…

圖像處理基礎

圖像處理基礎 在計算機中,按照顏色和灰度的多少可以將圖像分為二值圖像、灰度圖像、索引圖像和真彩色RGB圖像四種基本類型。目前,大多數圖像處理軟件都支持這四種類型的圖像。 (1) 二值圖像:一幅二值圖像的二維矩陣僅由0、1兩個值構成&#x…

緩存一致性解決方法

對于緩存 數據庫讀寫,有個經典的Cache Aside Pattern: 讀取:先讀取緩存,緩存里沒有,讀取數據庫,然后返回響應,順便保存緩存: 更新:先更新數據庫,然后刪除緩…

使用SpringMVC的表單驗證

上一篇搭建了基本項目,這一篇在此基礎上加入表單驗證功能。 第一步,添加command類 Java代碼 package test.bean; import javax.validation.constraints.Size; public class User { Size(min3,max30) private String username; …

hdu1247(Hat’s Words)

我以為像a、aa這樣的輸入應該是沒有輸出的,結果還是要輸出aa。 建樹的時候就是常規建樹,不過查找的時候要做一些變形:對于一個單詞,從第一位檢查有沒有單詞是它的前綴,如果有的話,再去檢查它的后半部分是不…

單體、分布式、微服務、Serverless軟件架構一覽

目錄軟件架構單體架構分布式應用微服務架構Serverless架構總結Reference軟件架構 軟件架構就是軟件的基本結構,合適的架構是軟件成功的最重要因素之一。這里列舉了目前流行的4種軟件架構。 單體架構 典型的三級架構:前端(web/手機端&#…

MyBatis3 association error - The content of element type resultMap must match (constructor?,id*,r...

MyBatis3 association error - The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)" 1.后臺錯誤信息-問題現象: ERROR [geby:Context initialization failed] 2013-0…

Midjourney V6刷屏,但它最可怕的地方居然不是那些神圖?

Midjourney在沉寂九個月后推出了Midjourney V6,這個文生圖產品體現出的更細膩的細節處理,更強大的語言理解能力和更加“不像AI”的圖片效果在過去幾天引發一片驚呼。 作為一個閉源的模型產品,Midjourney的魔法配方并不為人所知,但…

HTTP 錯誤500.19 -Internal Server Error

HTTP 錯誤500.19 -Internal Server Error 原文:HTTP 錯誤500.19 -Internal Server Error HTTP 錯誤500.19 -Internal Server Error 錯誤代碼 0x80070021 asp.net 2009-11-05 16:54:33 閱讀484 評論1 字號:大中小 錯誤摘要 HTTP 錯誤500.19 -Internal Server Error …

連續內存分區式內存管理

目錄前言分區式內存管理動態分區內存管理總結本筆記參考黃工的https://mp.weixin.qq.com/s/k0W_LqI1zBAYC1GU1U2HQA 前言 內存管理模塊主要負責內存的初始化、分配以及釋放。 從分配內存是否連續可以分為兩大類: 1、連續內存管理 為進程分配的內存空間是連續的&a…

用DEVC++作圖

小海豚學NOIP,老師說要用DEV C。 小海豚喜歡畫圖,記得以前用C#編些程序給她看。可前一陣打開看,我的免費Visual Studio過期了。可惡的Microsoft ,不想用盜版難道就要每個月就下載一次? 于是就用DEV C的Windows調用吧。…

Python服務器開發三:Socket

Python服務器開發三:Socket socket是操作系統中I/O的延續,它可以使進程和機器之間的通信成為可能。socket可以看成一個標準的文件描述符。不同的是文件需要用open()函數打開,而socket用socket() 函數建立.recv()、send()函數和read()、write(…

Syntax error: Bad for loop variable解決辦法

在Ubuntu下寫的shell文件t.sh執行時出現錯誤: 1 t.sh: 6: Syntax error: Bad for loop variable 從ubuntu 6.10開始,ubuntu就將之前默認的bash shell更換成了dash shell,其表現為/bin/sh鏈接倒了/bin/dash,而不是傳統的/bin/bash&…

Linux命令常見

摘自: 常考的 21 條 Linux 命令 目錄)cd,切換路徑ls,查看文件與目錄的命令cp,用于復制文件mv,用于移動文件、目錄cat,查看文件內容find,文件搜索文件權限命令, 設置權限,-取消權限文本處理命令打包和壓縮文件命令進程相…

記一次調試

這是我最近幾個月來遇到的最棘手的一個問題:* 昨天花了4個小時找出第一層次的原因這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是一個gradle的plugin,用來resolve公司內部的dependency的,…

OSGi.NET 學習筆記 [模塊化和插件化][小結]

【目錄】-【模塊化和插件化】-【小結】 現在我們來對OSGi.NET的“模塊化和插件化”做一個小結,再次把官方的說明拿出來  1) 物理隔離:基于UIOSP開發的模塊是一個物理隔離的可單獨部署的模塊,每一個模塊擁有獨立的文件夾、類型空…

miniob :相關環境配置

How to build 參考視頻:https://www.bilibili.com/video/BV1gv411A7oA?spm_id_from333.999.0.0將代碼下載并且安裝編譯。 git clone失敗的話參考:https://blog.csdn.net/sxg0205/article/details/81412921 install cmakebuild libevent git submodul…

Fedora 20 配置

前幾天裝了fedora 20, 斷斷續續的進行了以下配置: 1. 安裝oracle java及jdk版本切換 安裝的過程很簡單,從oracle官網上下載jdk及jre的rpm包,使用rpm -ivh 安裝。但是遇到一個問題,因為fedora系統自帶了openJDK,如果安裝oracle的jd…

raft算法學習(一):角色概念以及選舉過程

Raft算法是強領導模型,集群中只能有一個領導。 下面是raft的視頻講解: raft raft的三種角色及其概念 服務器節點狀態一共有三種:領導者(Leader)、跟隨著(Follower)、候選人(Candid…

解決 FLex 4.0 Module里面Alert.show();出錯問題

TypeError: Error #1009: 無法訪問空對象引用的屬性或方法。 at mx.managers::PopUpManagerImpl/http://www.adobe.com/2006/flex/mx/internal::createModalWindow()[E:\dev\hero_private\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:701] at mx.manag…