成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

沒遇到過這三個問題都不好意思說用過Redis

數據庫 Redis
緩存的作用主要有兩個:一來提升訪問速度;二來保護數據庫。在業務量不大的時候,通常沒什么大問題。但當業務量起來以后,如果緩存使用不合理,三兄弟一定會如約而至,讓你體驗一下現實的殘酷。

緩存是互聯網應用中不可或缺的一部分。而提到緩存,就不得不提它的三個經典問題——緩存穿透、緩存擊穿和緩存雪崩,我稱它們為緩存問題三兄弟。

緩存的作用主要有兩個:一來提升訪問速度;二來保護數據庫。在業務量不大的時候,通常沒什么大問題。但當業務量起來以后,如果緩存使用不合理,三兄弟一定會如約而至,讓你體驗一下現實的殘酷。

三兄弟不來則已,一來輕則影響系統性能,重則直接拖垮數據庫,導致系統癱瘓。因此,我們不可掉以輕心,要防患于未然。

緩存穿透

一個請求到達服務器時,正常情況下是按照如下流程進行的。

沒遇到過這三個問題都不好意思說用過Redis

即按照如下步驟:

  1. 查詢緩存,如果命中則返回。
  2. 緩存未命中,則查詢數據庫。
  3. 將從數據庫中查詢到的數據寫入緩存并返回。

如果每次都是這樣按部就班的處理,倒也相安無事。但是,凡事就怕但是。但是總會有例外,假如請求方對一個(數據庫中)根本不存在的數據進行訪問,那么按照上面的流程,緩存就形同虛設了。因為不存在,所以不會被寫入緩存,這樣請求每次都會打到數據庫,這個現象就是所謂的「緩存穿透」了。

如果只是因為個別請求去查詢不存在的數據,那其實也沒什么大事。但緩存穿透通常是伴隨一些「惡意請求」而來,通常是在短時間內涌入大量請求。如果放任不管,就等著數據庫宕機吧。

如何解決

了解了導致緩存穿透的原因,那么解決方案也就明了了。可以從兩個方面下手:

  • 緩存不存在的記錄。
  • 過濾不存在的請求。

啥?不存在的記錄咋緩存?其實很簡單,如果數據庫中也查不到,那就將緩存的 value 設置成 null 即可(注意要根據業務特性設置合理的過期時間)。

過濾不存在的請求,當一個請求到達服務器,比如:

GET /api/user/1

過濾器會先判斷該資源是否存在,如果存在則放行,不存在則直接返回,從而起到保護系統的作用。

這種方式也有比較成熟的方案。比如布隆過濾器和布谷鳥過濾器(升級版布隆布隆過濾器)。

雙重加固

不管請求不存在的資源是有意還是無意,都不是我們想要的。所以,我們可以設定一個訪問頻率,一定時間內頻繁(超出正常用戶的極限)訪問,可以對請求方加以限制(如 IP 限制)。另外,一些接口可以加入認證,必須登錄才能訪問。

緩存擊穿

通常情況,我們會為緩存設置一個過期時間。而如果在一個資源的緩存過期以后(或者還未來得及緩存),瞬間涌入大量查詢該資源的請求,那么這些請求就都會一股腦的奔向數據庫,這時,我們的數據庫可就慘了,可能秒秒鐘掛掉。這種情況我們稱之為緩存擊穿。

如何解決

要解決緩存擊穿也有兩種思路:

  • 永不過期。
  • 加鎖。

先看第一種,短時間內被大量訪問的通常是熱點資源,針對這類資源我們可以不設置過期時間(永不過期),當資源有變化時通過程序去更新緩存。

再來看第二種,我們可以使用加鎖的方式(一般 JVM 級別的鎖即可)來避免擊穿。當緩存過期之后,進來的請求,先要獲得一把鎖(也就是去數據庫查詢的資格),然后再去查詢數據庫,最后將數據添加到緩存。這樣就可以保證同一時刻(一個服務實例)只會有一個請求去查庫了,其他線程等緩存有值以后,再去緩存取。

加鎖偽代碼示例:

public String getData() throws InterruptedException {
// 從緩存取值
String result = getFromCache();
// 取到直接返回
if (Objects.nonNull(result)) {
return result;
}
// 嘗試獲取鎖
if (!lock.tryLock()) {
// 加鎖失敗則休息一會
Thread.sleep(10);
return getData();
}
// 加鎖成功則去數據庫取值
result = getFromDB();
// 取回后放入緩存
setFromCache();
return result;
}

緩存雪崩

緩存雪崩指的是,緩存中大量的 key 在同一時刻集體過期,導致大量請求涌入到數據庫。

有人把緩存服務由于一些原因不可用稱為緩存雪崩,我覺得這么叫不太合適。

你想象一下什么是雪崩,大量的雪花集體從山上往下跳就是雪崩。那么對應到緩存的場景,我們可以把 Redis 看做是山,而 Redis 里的 key 就是雪花。Redis 中大量的 key 同時失效,就好比是山上大量的雪花同時往下掉是一樣的。所以雪崩用來比喻大量 key 集中失效的情況明顯更貼切。而緩存服務掛掉應該屬于緩存服務故障,可以采取緩存集群的方式來提高可用性。

如何解決

要解決緩存雪崩的問題,有兩種思路:

  • 分散過期時間。
  • 永不過期。

分散過期時間很容易想到,既然雪崩是因為 key 集體過期導致的,那么把它們過期的時間分散開就可以避免這種問題了。

另一種思路,跟解決緩存擊穿一樣,將緩存設置為永不過期。

永不過期的方案有一定的局限性,要看具體的業務,不能粗暴的將所有緩存都設置成不過期。

總結

每種技術方案都有其適用的業務場景,也都有其局限性。沒有一個方案能夠應對所有問題,合適即是好。但從上面的方案中還是能看到一些通用的思想的,比如:盡早返回。咋理解呢?就是讓調用鏈盡量的短,能攔在應用服務之前的絕不放行(布隆過濾);能從緩存取到的絕不再去查庫。

責任編輯:姜華 來源: 今日頭條
相關推薦

2024-09-13 09:32:30

2024-06-27 11:05:19

2015-07-13 09:48:21

iOS

2020-05-19 13:34:20

ZookeeperZAB協議

2015-12-31 10:23:06

2015公有云中國云市場

2021-05-17 10:53:49

5G手機4G

2018-07-11 08:19:26

高并發架構網絡

2020-09-16 09:08:49

訂單微服務架構

2017-04-26 10:49:25

搜狗輸入法

2017-04-26 10:42:27

搜狗輸入法

2020-12-17 08:56:51

單例模式JVM

2019-11-08 11:08:29

測試工程師AI人工智能

2018-12-20 13:53:59

OLEDLCD屏幕

2020-08-26 14:40:38

explainMySQL數據庫

2016-11-01 11:54:26

BI大數據

2016-09-29 17:00:40

存儲

2019-01-23 10:58:52

接入層架構負載均衡

2020-04-26 14:40:19

戴爾

2021-04-12 20:42:50

K8S端口內存

2024-03-18 08:14:07

SpringDAOAppConfig
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲图片一区二区三区 | 亚洲国产精品va在线看黑人 | 亚欧精品一区 | 国产一区二区三区四区五区3d | 国产精品亚洲一区二区三区在线 | 欧美久久久久久 | 欧美日韩不卡合集视频 | 亚洲成人999 | 国产一区二区三区四区五区3d | 中文字幕av网站 | 中文字幕久久精品 | 久久激情网 | 一区二区免费在线观看 | 亚洲精品国产精品国自产在线 | 欧美一区二区网站 | 欧美日一区二区 | 香蕉一区二区 | 老司机免费视频 | 亚洲精品乱码8久久久久久日本 | 精品久久久久久亚洲综合网 | 一区精品国产欧美在线 | 久久久精品一区 | 一级中国毛片 | 欧美精产国品一二三区 | 国产亚洲一区二区三区在线观看 | 精品一区国产 | 视频二区| 成人免费网站 | 国产丝袜一区二区三区免费视频 | 日韩精品久久一区二区三区 | 欧美影院| 国产一区二区三区 | 成年人网站免费 | 亚洲精品一区二区 | 久久区二区 | 女同久久另类99精品国产 | 91资源在线 | 亚洲一区二区av在线 | 精品成人佐山爱一区二区 | 九九久久99 | 日韩精品一区二区在线观看 |