日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 架構(gòu)師社區(qū)
[導(dǎo)讀]Redis經(jīng)常用于系統(tǒng)中的緩存,這樣可以解決目前IO設(shè)備無(wú)法滿足互聯(lián)網(wǎng)應(yīng)用海量的讀寫請(qǐng)求的問(wèn)題。

作者:周二鴨

來(lái)源:https://www.cnblogs.com/jojop/p/14106671.html

Redis經(jīng)常用于系統(tǒng)中的緩存,這樣可以解決目前IO設(shè)備無(wú)法滿足互聯(lián)網(wǎng)應(yīng)用海量的讀寫請(qǐng)求的問(wèn)題。

一、緩存穿透

緩存穿透是指緩存和數(shù)據(jù)庫(kù)中都沒(méi)有的數(shù)據(jù),而用戶不斷發(fā)起請(qǐng)求,如發(fā)起id為-1的數(shù)據(jù)或者特別大的不存在的數(shù)據(jù)。有可能是黑客利用漏洞攻擊從而去壓垮應(yīng)用的數(shù)據(jù)庫(kù)。

1. 常見(jiàn)解決方案

對(duì)于緩存穿透問(wèn)題,常見(jiàn)的解決方案有以下三種:
  • 驗(yàn)證攔截:接口層進(jìn)行校驗(yàn),如鑒定用戶權(quán)限,對(duì)ID之類的字段做基礎(chǔ)的校驗(yàn),如id<=0的字段直接攔截;
  • 緩存空數(shù)據(jù):當(dāng)數(shù)據(jù)庫(kù)查詢到的數(shù)據(jù)為空時(shí),也將這條數(shù)據(jù)進(jìn)行緩存,但緩存的有效性設(shè)置得要較短,以免影響正常數(shù)據(jù)的緩存;
   
		
Copy
public Student getStudentsByID(Long id) {  // 從Redis中獲取學(xué)生信息 Student student = redisTemplate.opsForValue() .get(String.valueOf(id)); if (student != null) { return student; }  // 從數(shù)據(jù)庫(kù)查詢學(xué)生信息,并存入Redis student = studentDao.selectByStudentId(id); if (student != null) { redisTemplate.opsForValue() .set(String.valueOf(id), student, 60, TimeUnit.MINUTES); } else { // 即使不存在,也將其存入緩存中 redisTemplate.opsForValue() .set(String.valueOf(id), null, 60, TimeUnit.SECONDS); }  return student;}
  • 使用布隆過(guò)濾器:布隆過(guò)濾器是一種比較獨(dú)特?cái)?shù)據(jù)結(jié)構(gòu),有一定的誤差。當(dāng)它指定一個(gè)數(shù)據(jù)存在時(shí),它不一定存在,但是當(dāng)它指定一個(gè)數(shù)據(jù)不存在時(shí),那么它一定是不存在的。

2. 布隆過(guò)濾器

布隆過(guò)濾器是一種比較特殊的數(shù)據(jù)結(jié)構(gòu),有點(diǎn)類似與HashMap,在業(yè)務(wù)中我們可能會(huì)通過(guò)使用HashMap來(lái)判斷一個(gè)值是否存在,它可以在O(1)時(shí)間復(fù)雜度內(nèi)返回結(jié)果,效率極高,但是受限于存儲(chǔ)容量,如果可能需要去判斷的值超過(guò)億級(jí)別,那么HashMap所占的內(nèi)存就很可觀了。而B(niǎo)loomFilter解決這個(gè)問(wèn)題的方案很簡(jiǎn)單。首先用多個(gè)bit位去代替HashMap中的數(shù)組,這樣的話儲(chǔ)存空間就下來(lái)了,之后就是對(duì) Key 進(jìn)行多次哈希,將 Key 哈希后的值所對(duì)應(yīng)的 bit 位置為1。當(dāng)判斷一個(gè)元素是否存在時(shí),就去判斷這個(gè)值哈希出來(lái)的比特位是否都為1,如果都為1,那么可能存在,也可能不存在(如下圖F)。但是如果有一個(gè)bit位不為1,那么這個(gè)Key就肯定不存在。

“Redis”緩存的三大問(wèn)題及其解決方案

注意: BloomFilter并不支持刪除操作,只支持添加操作。這一點(diǎn)很容易理解,因?yàn)槟闳绻獎(jiǎng)h除數(shù)據(jù),就得將對(duì)應(yīng)的bit位置為0,但是你這個(gè)Key對(duì)應(yīng)的bit位可能其他的Key也對(duì)應(yīng)著。

3. 緩存空數(shù)據(jù)與布隆過(guò)濾器的比較

上面對(duì)這兩種方案都進(jìn)行了簡(jiǎn)單的介紹,緩存空數(shù)據(jù)與布隆過(guò)濾器都能有效解決緩存穿透問(wèn)題,但使用場(chǎng)景有著些許不同;
  • 當(dāng)一些惡意攻擊查詢查詢的key各不相同,而且數(shù)量巨多,此時(shí)緩存空數(shù)據(jù)不是一個(gè)好的解決方案。因?yàn)樗枰鎯?chǔ)所有的Key,內(nèi)存空間占用高。并且在這種情況下,很多key可能只用一次,所以存儲(chǔ)下來(lái)沒(méi)有意義。所以對(duì)于這種情況而言,使用布隆過(guò)濾器是個(gè)不錯(cuò)的選擇;
  • 而對(duì)與空數(shù)據(jù)的Key數(shù)量有限、Key重復(fù)請(qǐng)求效率較高的場(chǎng)景而言,可以選擇緩存空數(shù)據(jù)的方案。

二、緩存擊穿

緩存擊穿是指當(dāng)前熱點(diǎn)數(shù)據(jù)存儲(chǔ)到期時(shí),多個(gè)線程同時(shí)并發(fā)訪問(wèn)熱點(diǎn)數(shù)據(jù)。因?yàn)榫彺鎰傔^(guò)期,所有并發(fā)請(qǐng)求都會(huì)到數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)。

解決方案

  • 將熱點(diǎn)數(shù)據(jù)設(shè)置為永不過(guò)期;
  • 加互斥鎖:互斥鎖可以控制查詢數(shù)據(jù)庫(kù)的線程訪問(wèn),但這種方案會(huì)導(dǎo)致系統(tǒng)的吞吐量下降,需要根據(jù)實(shí)際情況使用。
public String get(key) { String value = redis.get(key); if (value == null) { // 代表緩存值過(guò)期 // 設(shè)置3min的超時(shí),防止del操作失敗的時(shí)候,下次緩存過(guò)期一直不能load db if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { // 代表設(shè)置成功 value = db.get(key); redis.set(key, value, expire_secs); redis.del(key_mutex); } else { // 這個(gè)時(shí)候代表同時(shí)候的其他線程已經(jīng)load db并回設(shè)到緩存了,這時(shí)候重試獲取緩存值即可 sleep(50); get(key); // 重試 } } else { return value;  }}
   
		
Copy

三、緩存雪崩

緩存雪崩發(fā)生有幾種情況,比如大量緩存集中在或者緩存同時(shí)在大范圍中失效,出現(xiàn)了大量請(qǐng)求去訪問(wèn)數(shù)據(jù)庫(kù),從而導(dǎo)致CPU和內(nèi)存過(guò)載,甚至停機(jī)。一個(gè)簡(jiǎn)單的雪崩過(guò)程:
  1. Redis 集群產(chǎn)生了大面積故障;
  2. 緩存失敗,此時(shí)仍有大量請(qǐng)求去訪問(wèn) Redis 緩存服務(wù)器;
  3. 在大量 Redis 請(qǐng)求失敗后,這些請(qǐng)求將會(huì)去訪問(wèn)數(shù)據(jù)庫(kù);
  4. 由于應(yīng)用的設(shè)計(jì)依賴于數(shù)據(jù)庫(kù)和 Redis 服務(wù),很快就會(huì)造成服務(wù)器集群的雪崩,最終導(dǎo)致整個(gè)系統(tǒng)的癱瘓。

解決方案

  • 【事前】高可用緩存:高可用緩存是防止出現(xiàn)整個(gè)緩存故障。即使個(gè)別節(jié)點(diǎn),機(jī)器甚至機(jī)房都關(guān)閉,系統(tǒng)仍然可以提供服務(wù),Redis 哨兵(Sentinel) 和 Redis 集群(Cluster) 都可以做到高可用;
  • 【事中】緩存降級(jí)(臨時(shí)支持):當(dāng)訪問(wèn)次數(shù)急劇增加導(dǎo)致服務(wù)出現(xiàn)問(wèn)題時(shí),我們?nèi)绾未_保服務(wù)仍然可用。在國(guó)內(nèi)使用比較多的是 Hystrix,它通過(guò)熔斷、降級(jí)、限流三個(gè)手段來(lái)降低雪崩發(fā)生后的損失。只要確保數(shù)據(jù)庫(kù)不死,系統(tǒng)總可以響應(yīng)請(qǐng)求,每年的春節(jié) 12306 我們不都是這么過(guò)來(lái)的嗎?只要還可以響應(yīng)起碼還有搶到票的機(jī)會(huì);
  • 【事后】Redis備份和快速預(yù)熱:Redis數(shù)據(jù)備份和恢復(fù)、快速緩存預(yù)熱。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

Redis作為高性能的內(nèi)存數(shù)據(jù)庫(kù),在緩存、會(huì)話存儲(chǔ)、消息隊(duì)列等場(chǎng)景中廣泛應(yīng)用。然而,隨著業(yè)務(wù)規(guī)模擴(kuò)大,Redis的配置、使用和維護(hù)面臨諸多挑戰(zhàn)。

關(guān)鍵字: Redis 數(shù)據(jù)庫(kù)

Redis 作為高性能鍵值存儲(chǔ)系統(tǒng),其設(shè)計(jì)細(xì)節(jié)中蘊(yùn)含著對(duì)效率與靈活性的深刻考量。默認(rèn)配置的 16 個(gè)數(shù)據(jù)庫(kù)(編號(hào) 0-15)便是這一理念的典型體現(xiàn)。

關(guān)鍵字: Redis 數(shù)據(jù)庫(kù)

在當(dāng)今數(shù)字化時(shí)代,互聯(lián)網(wǎng)應(yīng)用面臨著海量用戶訪問(wèn)和高并發(fā)請(qǐng)求的挑戰(zhàn)。無(wú)論是電商平臺(tái)的秒殺活動(dòng),還是社交媒體的話題爆發(fā),都要求系統(tǒng)具備快速響應(yīng)和高效處理能力。傳統(tǒng)的單一緩存策略已無(wú)法滿足這一需求,分布式多級(jí)緩存架構(gòu)應(yīng)運(yùn)而生。...

關(guān)鍵字: 緩存架構(gòu) 緩存

在高性能服務(wù)架構(gòu)設(shè)計(jì)中,緩存是不可或缺的環(huán)節(jié)。在實(shí)際項(xiàng)目中,我們通常會(huì)將一些熱點(diǎn)數(shù)據(jù)存儲(chǔ)在Redis或Memcached等緩存中間件中,只有在緩存訪問(wèn)未命中時(shí)才查詢數(shù)據(jù)庫(kù)。

關(guān)鍵字: 緩存 內(nèi)存

為實(shí)現(xiàn)印度政府"自力更生的印度"(Atmanirbhar Bharat)戰(zhàn)略,某本土電信設(shè)備制造商聯(lián)合運(yùn)營(yíng)商加速國(guó)產(chǎn)化替代,卻遭遇三大挑戰(zhàn):

關(guān)鍵字: 威剛工控 緩存 固態(tài)硬盤

緩存選擇是指計(jì)算機(jī)系統(tǒng)中的一種機(jī)制,用于決定從哪個(gè)緩存中獲取數(shù)據(jù)。當(dāng)計(jì)算機(jī)需要訪問(wèn)數(shù)據(jù)時(shí),它首先會(huì)檢查緩存中是否已經(jīng)存在所需的數(shù)據(jù)。如果存在,則直接從緩存中獲取數(shù)據(jù),從而提高訪問(wèn)速度。如果不存在,則計(jì)算機(jī)需要從更慢的存儲(chǔ)...

關(guān)鍵字: 嵌入式 緩存

在現(xiàn)代軟件系統(tǒng)中,數(shù)據(jù)庫(kù)與緩存是兩個(gè)重要的組成部分。數(shù)據(jù)庫(kù)負(fù)責(zé)數(shù)據(jù)的持久化存儲(chǔ),而緩存則用于加速數(shù)據(jù)訪問(wèn)速度。然而,如何保證數(shù)據(jù)庫(kù)與緩存之間數(shù)據(jù)的一致性是一個(gè)具有挑戰(zhàn)性的問(wèn)題。本文將探討數(shù)據(jù)庫(kù)與緩存數(shù)據(jù)一致性問(wèn)題,并關(guān)注...

關(guān)鍵字: 緩存 數(shù)據(jù)庫(kù)

在Redis中,有三種不同的部署模式:主從復(fù)制(Master-Slave Replication)、哨兵(Sentinel)模式和集群(Cluster)模式。每種模式都有其特定的用途和優(yōu)勢(shì),適用于不同的場(chǎng)景。

關(guān)鍵字: Redis 集群

緩存的工作原理在于,當(dāng)CPU需要數(shù)據(jù)時(shí),會(huì)首先在緩存中查找,快速響應(yīng)。如果未找到,會(huì)從慢速的內(nèi)存中獲取,并將數(shù)據(jù)塊存入緩存,以便后續(xù)快速訪問(wèn)。緩存按層次劃分,有一級(jí)緩存、二級(jí)緩存和三級(jí)緩存。

關(guān)鍵字: 緩存 CPU

緩存的工作原理是將CPU最近最可能用到的少量信息(數(shù)據(jù)或指令)從主存復(fù)制到Cache中。當(dāng)CPU需要讀取數(shù)據(jù)時(shí),首先從緩存中查找,如果找到就立即讀取并送給CPU處理;如果沒(méi)有找到,就用相對(duì)慢的速度從內(nèi)存中讀取并送給CPU...

關(guān)鍵字: CPU 緩存
關(guān)閉