偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

關(guān)于 Redis ,這里有你不知道的知識

存儲 存儲軟件 Redis
本篇文章不是一篇具體的教程,阿粉打算記錄一下自己對Redis的一些思考。說來慚愧,阿粉剛接觸Redis的時候只是簡單地使用了一下,背了一些面試題,就在簡歷上寫下了Redis這個技能點(diǎn)。

 [[329863]]

前言

本篇文章不是一篇具體的教程,阿粉打算記錄一下自己對Redis的一些思考。說來慚愧,阿粉剛接觸Redis的時候只是簡單地使用了一下,背了一些面試題,就在簡歷上寫下了Redis這個技能點(diǎn)。

我們能在網(wǎng)絡(luò)上輕易地找到關(guān)于Redis具體知識點(diǎn)的講解,但很少有文字說明為什么會有這項技術(shù),阿粉希望通過本文總結(jié)一下個人目前對Redis的理解。

1. 初識Redis

最開始的時候,阿粉是通過網(wǎng)絡(luò)上面的一些項目教程了解到Redis的,當(dāng)時教程里說把首頁數(shù)據(jù)放到Redis里,能夠加快首頁數(shù)據(jù)的訪問速度,于阿粉我就照做了。代碼跑起來后,發(fā)現(xiàn)好像確實(shí)加載得蠻快的,就當(dāng)完成了。

項目做完后,寫到了簡歷里,順便在技能里寫上熟練使用Redis,再背了幾道關(guān)于Redis的數(shù)據(jù)類型,持久化機(jī)制的面試題,便去找實(shí)習(xí)了。

當(dāng)時面試的時候面試官問阿粉:你為什么使用Redis呀?

阿粉按照項目教程里說的復(fù)述了一遍:因為能讓首頁更快地加載數(shù)據(jù),咱們的產(chǎn)品首頁是很重要,越快加載出數(shù)據(jù),用戶越滿意......

現(xiàn)在回想起來真是哭笑不得,你也不能說這個回答有問題,Redis用作緩存的一大亮點(diǎn)就是能夠加快數(shù)據(jù)查詢效率,但是如果從技術(shù)面試的角度看,這個回答其實(shí)更應(yīng)該從技術(shù)的角度去答,這也是促使阿粉寫這篇文章的沖動之一。

2. 為什么要有Redis這項技術(shù)?(你為什么用Redis)

如果現(xiàn)在再被問到為什么要用Redis,阿粉打算從計算機(jī)的存儲結(jié)構(gòu)開始聊。

計算機(jī)界有一本名書《深入理解計算機(jī)系統(tǒng)》,里面有一幅關(guān)于計算機(jī)存儲結(jié)構(gòu)的圖,非常經(jīng)典:

由圖可見計算機(jī)的存儲器是一個金字塔結(jié)構(gòu),越上層的存儲器存儲效率越高,越下層的存儲效率越低。而計算機(jī)中內(nèi)存的層級位于磁盤之上,內(nèi)存的存儲效率要比磁盤快得多。

正常情況下,我們會把應(yīng)用的數(shù)據(jù)存放在數(shù)據(jù)庫中,數(shù)據(jù)庫把數(shù)據(jù)存放在磁盤;而Redis是一款基于內(nèi)存的存儲系統(tǒng),數(shù)據(jù)都存在內(nèi)存里,這就是從Redis讀取數(shù)據(jù)比從數(shù)據(jù)庫讀取數(shù)據(jù)要快的根本原因了。

看到這里你可能會說,把數(shù)據(jù)存在內(nèi)存有啥了不起的,我可以用谷歌的guava呀!再不濟(jì),我可以直接new一個HashMap存數(shù)據(jù)呀,這不都是基于內(nèi)存的嗎?

這個問題讓我聯(lián)想起了我在網(wǎng)上看面經(jīng)的時候看到的一道題:如果讓你設(shè)計一個緩存,你會怎么設(shè)計?

大家可以想一下guava和Map集合使用時的缺點(diǎn)是什么?

很明顯一點(diǎn)就是這兩者雖然基于內(nèi)存,但他們使用的是jvm的內(nèi)存,如果jvm掛掉或者重啟了,數(shù)據(jù)也就丟失了。這就能方便我們聯(lián)想到Redis的持久化機(jī)制,Redis的持久化機(jī)制使得內(nèi)存中的數(shù)據(jù)能夠持久化到磁盤上,解決內(nèi)存數(shù)據(jù)掉電易失的問題,而且Redis是一款中間件,無需依賴于jvm。

(當(dāng)初我只是死背Redis的持久化機(jī)制,并沒有想過為什么。我想搞清楚了這背后的關(guān)系后再去學(xué)習(xí),能夠?qū)W得更扎實(shí)一些吧)

再換一個角度:既然數(shù)據(jù)庫是因為磁盤才慢,那為啥不再內(nèi)存里實(shí)現(xiàn)數(shù)據(jù)庫呢?

還別說,SAP公司還真有基于內(nèi)存的數(shù)據(jù)庫系統(tǒng),但是使用內(nèi)存有一個致命的缺點(diǎn):那就是貴!能買得起那套軟件和巨大內(nèi)存機(jī)器的公司畢竟是少數(shù),所以說為什么要使用Redis,就是因為他在低效的磁盤和昂貴的內(nèi)存中取了一個折中。

補(bǔ)充:面試的時候還被問到一個問題:Redis的內(nèi)存淘汰機(jī)制

當(dāng)時直接懵圈了,后來想了一下其實(shí)這是一個再正常不過的考點(diǎn)了:Redis把數(shù)據(jù)存放在內(nèi)存,內(nèi)存的空間有限,總會有用完的一天。當(dāng)內(nèi)存使用完之后肯定需要有相應(yīng)的內(nèi)存淘汰策略來釋放內(nèi)存。

不過說到內(nèi)存淘汰,我還想起一個高級點(diǎn)的知識點(diǎn),由于Redis的內(nèi)存是有限的,我們使用內(nèi)存的時候應(yīng)該更加小心。Redis內(nèi)部是有許多高效使用內(nèi)存的招數(shù)的,比如說我們存放用戶信息的時候,把用戶信息存成一個hash,要比把用戶信息逐條用key-value存儲占的空間小得多,這些知識你可以在Redid的官網(wǎng)上找到。

3. 關(guān)于Redis的主從復(fù)制,哨兵,集群

在學(xué)習(xí)Redis之前,我對分布式的知識了解得非常少。當(dāng)時為了面試背Redis的面試題,背到有關(guān)主從復(fù)制,哨兵,集群等知識點(diǎn)的時候,我既興奮又茫然。感覺自己背完后掌握了許多分布式的知識,但是把這些知識點(diǎn)都揉在一起了,根本不知道這背后的邏輯是什么?,F(xiàn)在想通了一些,應(yīng)該好好記下來:

在擴(kuò)展到多機(jī)之前,我們先想一下單機(jī)的Redis有什么缺點(diǎn):

  1. 有可能出現(xiàn)單點(diǎn)故障,這樣Redis服務(wù)就不可用了
  2. 單一臺機(jī)器的內(nèi)存有限,存儲不了太多的數(shù)據(jù)
  3. 如果訪問量很大的話,單臺機(jī)器壓力會很大

通過第一個缺點(diǎn),我們可以引出為什么需要主從復(fù)制和哨兵。大家想一想,如果我們只有一個Redis服務(wù),要是服務(wù)掛了就沒法用了,但如果我們安排多一臺Redis服務(wù)器,它的數(shù)據(jù)時刻與第一臺Redis的數(shù)據(jù)保持一致,這樣當(dāng)?shù)谝慌_Redis掛掉后,我們就可以把請求遷移到第二臺Redis上,這樣Redis服務(wù)的可用性就提高了。為了讓第二臺Redis的數(shù)據(jù)與第一臺Redis保持一致,我們就需要用到主從復(fù)制。

有時候,可能一主一從的配置還是不夠保險,這個時候我們就要為主節(jié)點(diǎn)配置兩個或以上的從節(jié)點(diǎn),那么問題來了,要是主節(jié)點(diǎn)掛了,該通過什么方案在從節(jié)點(diǎn)中選出新的主節(jié)點(diǎn)呢?這就用到了哨兵機(jī)制。

而且在一主多從的情況下,我們使用主從復(fù)制讓多臺Redis的數(shù)據(jù)保持一致,這個時候我們就可以把讀請求分?jǐn)偟綇墓?jié)點(diǎn)上,這樣能有效緩解主節(jié)點(diǎn)的讀壓力。

但如果Redis的寫請求壓力也很大,而且數(shù)據(jù)量很大,這個時候為Redis增加備份機(jī)的橫向擴(kuò)展已經(jīng)幫不上什么忙了,這個時候我們就要考慮縱向擴(kuò)展,增加多臺Redis分?jǐn)倢懻埱?,讓不同的key落到不同的機(jī)器上。這個時候我們就要考慮使用一致性哈希等算法把不同的key分給不同的機(jī)器。

Redis自身也提供了集群機(jī)制,但內(nèi)部使用的不是一致性哈希,而是哈希槽。簡單來說就是在哈希槽中劃分不同的區(qū)間,不同的區(qū)間對應(yīng)不同的機(jī)制;當(dāng)擴(kuò)容或縮減的時候有相應(yīng)的哈希槽調(diào)整策略。

我最初學(xué)習(xí)Redis的多機(jī)策略的時候就是搞不清楚集群,主從復(fù)制,哨兵機(jī)制之間的關(guān)系。其實(shí)集群就是一套完整的Redis多機(jī)解決方案,他有效解決了單機(jī)Redis的所有問題。當(dāng)你在集群中為某個節(jié)點(diǎn)配置從機(jī)的時候,主從節(jié)點(diǎn)間同步用的就是主從復(fù)制。主節(jié)點(diǎn)掛掉之后,從節(jié)點(diǎn)的選取,內(nèi)部的邏輯就和哨兵機(jī)制相似。當(dāng)我們使用集群機(jī)制的時候,就可以省去自己寫類似一致性哈希這樣的分?jǐn)傔壿嫞簷C(jī)制會給節(jié)點(diǎn)加上相應(yīng)的數(shù)據(jù)結(jié)構(gòu)來完成這些功能。

如果想深入了解集群背后的實(shí)現(xiàn)原理,我推薦這樣一個學(xué)習(xí)路線:

首先登錄官網(wǎng),按照官網(wǎng)的步驟學(xué)習(xí)配置主從復(fù)制,配置哨兵,搭建集群

然后看《Redis的設(shè)計與實(shí)現(xiàn)》這本書,閱讀主從復(fù)制,哨兵和集群這三個章節(jié)

4. 后話

阿粉覺得,如果把文章中提到的Redis的點(diǎn)都深入了解一下,Redis基本能算入門了。

寫下這篇感想主要也是想提醒自己,學(xué)一項技術(shù)的時候多問為什么,這樣知識學(xué)到手后不容易忘掉。

至于為什么說只能說是入門Redis,因為Redis的用法實(shí)在太多了,你可以把它當(dāng)作緩存,也可以把它當(dāng)成數(shù)據(jù)庫,甚至能把它當(dāng)作消息隊列。緩存可能大家都很熟悉了,在當(dāng)數(shù)據(jù)庫的方面Redis簡直是潛力無限,大家一定要善用它的bitmap位圖功能,簡直能在面對復(fù)雜需求的時候玩出花來。比如說老板要統(tǒng)計所有用戶一年中的登錄天數(shù),一個用戶只需要365bit(46B)的空間,相比于用傳統(tǒng)的mysql不知道也節(jié)省多少倍的空間。

阿粉覺得,如果能把一項技術(shù)長處應(yīng)用在自己的系統(tǒng)中,才算是用好了這項技術(shù)。關(guān)于Redis,在實(shí)際應(yīng)用中還有很多東西得靠我們自己探索,加油共勉!

 

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2021-02-01 08:39:26

JTAG接口Jlink

2021-10-09 16:13:40

5G4G手機(jī)

2020-12-08 11:08:55

時間復(fù)雜度軟件

2021-07-19 08:33:56

時間復(fù)雜度大O

2014-03-12 09:23:06

DevOps團(tuán)隊合作

2019-11-20 10:25:06

sudoLinux

2020-10-28 08:06:09

Vue3框架數(shù)據(jù)

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2022-03-28 18:48:42

人工智能AI

2014-10-21 11:17:41

蘋果設(shè)計

2024-02-05 11:55:41

Next.js開發(fā)URL

2014-03-21 10:23:32

2018-05-08 14:24:50

虛擬化服務(wù)器網(wǎng)絡(luò)

2010-08-23 09:56:09

Java性能監(jiān)控

2015-04-16 11:35:07

大數(shù)據(jù)大數(shù)據(jù)迷思

2011-09-15 17:10:41

2022-10-13 11:48:37

Web共享機(jī)制操作系統(tǒng)

2009-12-10 09:37:43

2021-02-01 23:23:39

FiddlerCharlesWeb
點(diǎn)贊
收藏

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