強!上線3天獲10w瀏覽量,京東T8純手碼Redis快取手冊,我粉了

2021-05-10 21:00:37

Hello,今天給各位童鞋們分享Redis快取,趕緊拿出小本子記下來吧!
image.png

簡介

什麼是Redis?

Redis是一種儲存系統,像MongoDB一樣,都是鍵值對儲存,也就是key-value結構。也就是說,Redis其實是一種資料庫,它可以跨平臺使用,本系列整合SpringBoot+Redis。

Redis本身是由C語言編寫,是符合ANSI C標準的開源系統。Redis是Remote Dictionary Server的縮寫,現在常用於分散式資料庫以及高可用快取系統。實際上,學會Redis整合了SpringBoot後,再整合SpringCloud就是水到渠成了。

為什麼要用Redis?

有朋友可能要問,既然Redis和MongoDB這麼像,那我用後者不就行麼,幹嘛學前者?實際上MongoDB和Redis是有很大區別的,他們只是在儲存方式上有相似點。下面列出二者的不同之處:

  • 資料儲存位置

MongoDB儲存的資料存放在磁碟,少部分資料存放在記憶體中。為啥資料庫資料還要存放在記憶體呢?是因為資料庫的快取系統會判斷熱點資料,頻繁存取的資料要放在記憶體達到高效處理。

Redis的資料全部存放在記憶體,並定期寫入磁碟,也因此造就了Redis的高效能。當記憶體不夠用,Redis會利用LRU(Least Recently Used)演演算法取代資料,沒錯,就是作業系統西面置換演演算法。

  • 資料儲存方式

MongoDB利用了mmap函數,將檔案資料對映的記憶體進行增刪查改,修改完之後作業系統會將記憶體資料flush到磁碟。問題是二者並非一個事務,因此兩個事務間宕機的話,資料自然丟失。

Redis有兩種儲存模式,RDB與AOF模式,這個我們後面會說到。

  • 資料處理速度

MongoDB比Redis慢,這也是Redis屬於記憶體儲存系統的最大優勢。當然,我們暫時不考慮記憶體不夠用的情況。

除此之外,目前分散式是大廠主流技術棧,Redis是大廠會採用的分散式快取方式。並且在應對高並行的場景上,比如阿里雙十一,騰訊遊戲新面板的出場或者過年紅包等,利用Redis和訊息佇列是主流的方法。

入門是什麼程度?精通是什麼程度?

入門就是對Redis完全不瞭解,但是你要有基礎的知識,比如基礎的資料結構,基礎的型別,基礎的記憶體知識,基礎的分散式知識,

基礎的Java/Spring知識和linux的基本操作。這個大可放心,我水平也一般般,所以我說的基礎一定是基礎。

精通並不是說最後能自己寫一個Redis,或者說自己能成為Redis的穩定開發維護者,我自己也做不到,所以這裡的精通是能夠了解Redis的各種機制、演演算法,瞭解Redis提供的常用方法,瞭解Redis使用場景,自己能排坑,並且能夠自己整合SpringBoot框架。實際上,這個整合SpringBoot框架最簡單,官網寫的很詳細。最好能在Redis基礎上進行二次開發,實際上理解了原理,會寫C語言,二次開發還是不難的。

既然是系列文章,我就不能全寫在一篇裡,內容太多對於我的排版和學習者的體驗也不好,所以我會盡量把每一篇文章壓縮在一個可以接受的長度範圍,當然,我儘量在每一篇文章都給出系列所有文章的連結,供大家,也供我日後方便查閱。如果文章能幫到你,希望給個贊鼓勵下,雖然不是靠這個生存,但是得到認可還是很高興的。

快取以及使用場景

什麼是快取?

快取實際上就是某個程式利用記憶體來優化頻繁讀取的資料的一種方式。快取就是記憶體的一部分。之前我們寫到,資料庫操作往往是儲存在磁碟中的,但是磁碟的IO又慢的不得了,怎麼辦?程式猿們想了一種方法,就是利用好記憶體。不是磁碟IO慢麼,那就利用記憶體好了,記憶體IO很快的,但是東西太多,放不進記憶體怎麼辦?那就把常用的資料放在記憶體吧。

現在是2021年,熟悉NBA的朋友都知道,今年威少的資料又爆炸,所以球迷可能會時常看威少的資料,加上威少的粉絲也不少,可能就存在高並行的問題。但是每次從磁碟拿資料也太慢了,那就把單獨把威少的資料放在記憶體中,別人的資料繼續躺在磁碟裡,這樣大大加快了系統響應的速度,這就是快取。

但是,NBA可不止有一個球星,庫裡,詹姆斯,約基奇等都是很出色的球員,擁有球迷的數量不比威少少,那就把他們的資料都放在快取中吧,這樣就快了。但是我們發現,NBA球星太多了,記憶體放不下,怎麼辦?這就引出了我們的常見的快取淘汰演演算法,對作業系統有了解的朋友可能知道,什麼LRU,LFU,FIFO,FILO等等,我把這個放在後面的Redis演演算法機制裡說。

本地快取與分散式快取

先看看例子,還是NBA球員,現在我的記憶體太小了啊,每個計算機只能存放一名NBA球員的資料,但是我現在有3名球員資料需要存放在計算機裡面怎麼辦?

本地快取

本地快取就是將資料存放在本地記憶體中,由於不需要通過網路連線到其他主機,自然速度也最快,當然缺點也是有的。比如Mybatis一二級快取,Caffeine,Guava都是本地快取的典型範例。回到之前的例子,3名球員放在3臺不同的主機,如果用本地快取的架構就是這樣的:
image.png

優點:

速度快,不用經過網路傳輸

缺點:

每臺主機可用快取容量有限

多節點無法共用資料

分散式快取

分散式快取就是利用網路,將快取放在某一臺主機上,這樣快取的容量限制就是快取機的記憶體大小,其IO瓶頸就是網速。Redis就是典型的分散式快取,當然,我們也可以讓Redis變成徹頭徹尾的本地快取,不經網路呼叫即可。
image.png

當然,上圖並不準確,既然快取的分散式了,當然不能只部署在一臺快取機上,往往都是叢集的方式部署快取機的。

熱點Key問題

什麼是熱點key呢?很簡單,我們看到微博時常會宕機,除了使用者量大,資訊量多以外,往往是某個明星又宣佈「我們有個孩子」這類的事情,無數使用者存取該資源,該資源對應的key就被稱為熱點key,突然間的高並行,使得某一個熱點被高頻存取,從而導致伺服器快取資源耗竭,怎麼處理?

解決方法有很多,但是咱們今天說到快取問題了,就只說快取解決方案。拿明星有了孩子舉例子,從原因分析到解決方案,其實原因有了,解決方案就是信手拈來的事情了。

原因分析:某明星A與某明星B有了孩子,A和B在分散式快取伺服器上,但是當這種爆炸性新聞發生的時候,大量使用者存取分散式快取伺服器,即使快取資源沒有耗盡,網路IO也無法承載。由於我們的假設是key在一臺機器,那麼暫時不考慮拆分key的情況,就是快取暫時能頂得住,但是網路IO崩了,分散式快取伺服器承受不了那麼大的資料量,怎麼辦?

解決方法:既然解決不了網路的問題,那就不解決了,乾脆不用,畢竟擴大網路頻寬這種外行都懂的方法入不了咱們的法眼。怎麼不用?那就是本地快取+分散式快取。網路受不了,就把高頻資源放在本地伺服器上,外界存取相關資源,直接從本地伺服器取,和分散式快取伺服器無關。只有當新來的高頻資源存取,且老高頻資源熱度下去時,取代即可。

好啦,今天的文章就到這裡,希望能幫助到螢幕前迷茫的你們