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

Redis緩存擊穿、緩存穿透、緩存雪崩

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù) Redis
本篇文章主要談?wù)凴edis中很容易出現(xiàn)的三大問題現(xiàn)象:緩存擊穿、緩存穿透以及緩存雪崩。不過在介紹這三個(gè)問題現(xiàn)象之前,我們首先需要先來了解下Redis中key的過期淘汰機(jī)制。

Redis緩存擊穿、緩存穿透、緩存雪崩

本篇文章主要談?wù)凴edis中很容易出現(xiàn)的三大問題現(xiàn)象:緩存擊穿、緩存穿透以及緩存雪崩。不過在介紹這三個(gè)問題現(xiàn)象之前,我們首先需要先來了解下Redis中key的過期淘汰機(jī)制。眾所周知,Redis可以對(duì)存儲(chǔ)在Redis中的緩存數(shù)據(jù)設(shè)置過期時(shí)間,比如我們獲取的短信驗(yàn)證碼一般十分鐘過期,我們這時(shí)候就需要在驗(yàn)證碼存進(jìn)Redis時(shí)添加一個(gè)key的過期時(shí)間,但是這里有一個(gè)需要格外注意的問題就是:并非key過期時(shí)間到了就一定會(huì)被Redis給刪除。那么Redis是如何做到對(duì)過期key進(jìn)行刪除呢?Redis中對(duì)于過期key的刪除分為兩種策略:定期刪除和惰性刪除。

  • 定期刪除:Redis 默認(rèn)是每隔 100ms 就隨機(jī)抽取一些設(shè)置了過期時(shí)間的 Key,檢查其是否過期,如果過期就刪除。為什么是隨機(jī)抽取而不是檢查所有key?因?yàn)槟闳绻O(shè)置的key成千上萬(wàn),每100毫秒都將所有存在的key檢查一遍,會(huì)給CPU帶來比較大的壓力。
  • 惰性刪除 :定期刪除由于是隨機(jī)抽取可能會(huì)導(dǎo)致很多過期 Key 到了過期時(shí)間并沒有被刪除。所以用戶在從緩存獲取數(shù)據(jù)的時(shí)候,redis會(huì)檢查這個(gè)key是否過期了,如果過期就刪除這個(gè)key。這時(shí)候就會(huì)在查詢的時(shí)候?qū)⑦^期key從緩存中清除。

但是如果僅僅使用定期刪除 + 惰性刪除機(jī)制還是會(huì)留下一個(gè)嚴(yán)重的隱患:如果定期刪除留下了很多已經(jīng)過期的key,而且用戶長(zhǎng)時(shí)間都沒有使用過這些過期key,導(dǎo)致過期key無法被惰性刪除,從而導(dǎo)致過期key一直堆積在內(nèi)存里,最終造成Redis內(nèi)存塊被消耗殆盡。那這個(gè)問題如何解決呢?這個(gè)時(shí)候Redis內(nèi)存淘汰機(jī)制應(yīng)運(yùn)而生了。Redis內(nèi)存淘汰機(jī)制提供了6種數(shù)據(jù)淘汰策略:

  • volatile-lru:從已設(shè)置過期時(shí)間的數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰。
  • volatile-ttl:從已設(shè)置過期時(shí)間的數(shù)據(jù)集中挑選將要過期的數(shù)據(jù)淘汰。
  • volatile-random:從已設(shè)置過期時(shí)間的數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰。
  • allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí)移除最近最少使用的key。
  • allkeys-random:從數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰。
  • no-enviction:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),新寫入操作會(huì)報(bào)錯(cuò)。

一般情況下,推薦使用volatile-lru策略,對(duì)于配置信息等重要數(shù)據(jù),不應(yīng)該設(shè)置過期時(shí)間,這樣Redis就永遠(yuǎn)不會(huì)淘汰這些重要數(shù)據(jù)。對(duì)于一般數(shù)據(jù)可以添加一個(gè)緩存時(shí)間,當(dāng)數(shù)據(jù)失效則請(qǐng)求會(huì)從DB中獲取并重新存入Redis中。

 

 

緩存擊穿

講完了Redis的key的過期淘汰機(jī)制,接下我們可以進(jìn)入正題:為什么會(huì)出現(xiàn)緩存擊穿、緩存穿透和緩存雪崩現(xiàn)象呢?首先我們來看下請(qǐng)求是如何取到數(shù)據(jù)的:當(dāng)接收到用戶請(qǐng)求,首先先嘗試從Redis緩存中獲取到數(shù)據(jù),如果緩存中能取到數(shù)據(jù)則直接返回結(jié)果,當(dāng)緩存中不存在數(shù)據(jù)時(shí)從DB獲取數(shù)據(jù),如果數(shù)據(jù)庫(kù)成功取到數(shù)據(jù),則更新Redis,然后返回?cái)?shù)據(jù),如果DB無數(shù)據(jù),則返回空結(jié)果。那什么情況下會(huì)出現(xiàn)三大問題現(xiàn)象呢?我們先來看下緩存擊穿的情況:

定義:高并發(fā)的情況下,某個(gè)熱門key突然過期,導(dǎo)致大量請(qǐng)求在Redis未找到緩存數(shù)據(jù),進(jìn)而全部去訪問DB請(qǐng)求數(shù)據(jù),引起DB壓力瞬間增大。

 

 

解決方案:緩存擊穿的情況下一般不容易造成DB的宕機(jī),只是會(huì)造成對(duì)DB的周期性壓力。對(duì)緩存擊穿的解決方案一般可以這樣:Redis中的數(shù)據(jù)不設(shè)置過期時(shí)間,然后在緩存的對(duì)象上添加一個(gè)屬性標(biāo)識(shí)過期時(shí)間,每次獲取到數(shù)據(jù)時(shí),校驗(yàn)對(duì)象中的過期時(shí)間屬性,如果數(shù)據(jù)即將過期,則異步發(fā)起一個(gè)線程主動(dòng)更新緩存中的數(shù)據(jù)。但是這種方案可能會(huì)導(dǎo)致有些請(qǐng)求會(huì)拿到過期的值,就得看業(yè)務(wù)能否可以接受,如果要求數(shù)據(jù)必須是新數(shù)據(jù),則最好的方案則為熱點(diǎn)數(shù)據(jù)設(shè)置為永不過期,然后加一個(gè)互斥鎖保證緩存的單線程寫。

緩存穿透

定義:緩存穿透是指查詢緩存和DB中都不存在的數(shù)據(jù)。比如通過id查詢商品信息,id一般大于0,攻擊者會(huì)故意傳id為-1去查詢,由于緩存是不命中則從DB中獲取數(shù)據(jù),這將會(huì)導(dǎo)致每次緩存都不命中數(shù)據(jù)導(dǎo)致每個(gè)請(qǐng)求都訪問DB,造成緩存穿透。

解決方案:緩存穿透的解決方案可以分成兩個(gè)部分:首先在API層增加基本校驗(yàn):用戶鑒權(quán)校驗(yàn),id校驗(yàn)。比如用戶鑒權(quán)失敗或者id < 0的請(qǐng)求直接進(jìn)行攔截。其次在緩存和DB都取不到數(shù)據(jù)的時(shí)候?qū)ey-value存儲(chǔ)成key-null存儲(chǔ)到Redis, 過期時(shí)間可以存儲(chǔ)的短點(diǎn)比如60S,防止短時(shí)間內(nèi)攻擊者不斷發(fā)起請(qǐng)求導(dǎo)致數(shù)據(jù)庫(kù)壓力過大出現(xiàn)宕機(jī)。

緩存雪崩

定義:緩存中如果大量緩存在一段時(shí)間內(nèi)集中過期了,這時(shí)候會(huì)發(fā)生大量的緩存擊穿現(xiàn)象,所有的請(qǐng)求都落在了DB上,由于查詢數(shù)據(jù)量巨大,引起DB壓力過大甚至導(dǎo)致DB宕機(jī)。

解決方案:緩存雪崩一般沒有完美解決的方法,但是我們可以盡量分析用戶行為,盡量保證key的失效時(shí)間比較平均,防止同一時(shí)間出現(xiàn)大量緩存數(shù)據(jù)同時(shí)過期的現(xiàn)象,并且設(shè)置熱點(diǎn)數(shù)據(jù)永不過期。同時(shí)如果為分布式環(huán)境下,使用分布式鎖來保證緩存的單線程寫,這樣可以避免同一時(shí)間大量緩存失效導(dǎo)致請(qǐng)求全部落在DB上。而我覺得如果可以接受有些請(qǐng)求拿到過期值,最合理的方案實(shí)際上就是使用緩存擊穿的方案:Redis中的數(shù)據(jù)不設(shè)置過期時(shí)間,然后在緩存的對(duì)象上添加一個(gè)屬性標(biāo)識(shí)過期時(shí)間,每次獲取到數(shù)據(jù)時(shí),校驗(yàn)對(duì)象中的過期時(shí)間屬性,如果數(shù)據(jù)即將過期,則異步發(fā)起一個(gè)線程主動(dòng)更新緩存中的數(shù)據(jù)。 

責(zé)任編輯:龐桂玉 來源: 今日頭條
相關(guān)推薦

2023-03-10 13:33:00

緩存穿透緩存擊穿緩存雪崩

2020-03-16 14:57:24

Redis面試雪崩

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2022-03-08 00:07:51

緩存雪崩數(shù)據(jù)庫(kù)

2019-11-05 14:24:31

緩存雪崩框架

2023-04-14 07:34:19

2022-05-27 07:57:20

緩存穿透緩存雪崩緩存擊穿

2022-11-18 14:34:28

2023-12-06 13:38:00

Redis緩存穿透緩存擊穿

2025-06-30 01:55:00

2023-11-10 14:58:03

2024-03-12 10:44:42

2024-04-07 00:00:02

Redis雪崩緩存

2024-04-18 11:43:28

緩存數(shù)據(jù)庫(kù)Redis

2020-10-13 07:44:40

緩存雪崩 穿透

2021-12-25 22:28:27

緩存穿透緩存擊穿緩存雪崩

2020-10-23 10:46:03

緩存雪崩擊穿

2020-12-28 12:37:36

緩存擊穿穿透

2020-03-05 09:09:18

緩存原因方案

2022-07-11 07:36:36

緩存緩存雪崩緩存擊穿
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久精品国产一区二区电影 | 国产精品久久久久久久久久久久 | 色眯眯视频在线观看 | 欧美日韩国产在线观看 | 欧美1级| 精品一区在线免费观看 | 亚洲综合成人网 | 久久久久久久久久久高潮一区二区 | www.xxxx欧美 | 亚洲第一天堂 | 午夜视频网站 | 亚洲性人人天天夜夜摸 | 日日摸夜夜添夜夜添精品视频 | 国产精品视频区 | 成人免费视频网站在线看 | 风间由美一区二区三区在线观看 | 精品粉嫩超白一线天av | 成人在线中文字幕 | 久久久久国产一区二区三区不卡 | 欧美日韩中文字幕 | 亚洲精品电影在线观看 | 欧美日韩亚洲国产 | 91精品久久久 | 久久久国产一区二区三区四区小说 | 亚洲精久| 亚洲精品福利视频 | 色综合一区二区三区 | 北条麻妃一区二区三区在线观看 | 亚洲一区二区三区桃乃木香奈 | 久久精品亚洲欧美日韩精品中文字幕 | 91久久精品国产91久久性色tv | 国产人成精品一区二区三 | 国产日韩精品一区二区 | 国产999精品久久久影片官网 | 91精品久久久久久久久久入口 | 在线欧美 | 精品久久久久香蕉网 | 国产一区二区久久 | 天天射中文 | 91中文字幕 | 精品一区二区视频 |