Redis基礎(chǔ)和應(yīng)用(一)

1.1 Redis基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)

1.1.1 Redis的安裝

體驗(yàn)Redis需要使用Linux或者Mac環(huán)境,redis的安裝主要有以下三種方式。

  • 使用Docker安裝
  • 通關(guān)Github源碼編譯
  • 直接安裝apt-get install(Ubuntu)葫慎、yun install(RedHat)或者brew install(Mac)

1.1.2 Redis的5種數(shù)據(jù)結(jié)構(gòu)

? Redis有5中數(shù)據(jù)結(jié)構(gòu),分別為:String(字符串)纽窟、list(列表)、hash(字典)兼吓、set(集合)臂港、zset(有序集合)。

String(字符串)

? Redis的字符串是動(dòng)態(tài)字符串视搏,是可以修改的字符串审孽,內(nèi)部機(jī)構(gòu)的實(shí)現(xiàn)類似于Java的ArrayList,采用預(yù)分配冗余空間的方式來(lái)減少內(nèi)存的頻繁分配浑娜。

List(列表)

? Redis的列表相當(dāng)于Java語(yǔ)言里的LinkedList佑力,這意味著list的插入和刪除操作非常快棚愤,但索引定位很慢搓萧。

? Redis的列表結(jié)構(gòu)常用來(lái)做異步隊(duì)列使用。

? 如果再深入一點(diǎn)宛畦,你會(huì)發(fā)現(xiàn)Redis底層存儲(chǔ)的不是一個(gè)簡(jiǎn)單linkedList,而是稱職為“快速鏈表”(quickList)的一個(gè)結(jié)構(gòu)揍移。

? 在列表元素較少的情況下次和,會(huì)使用一塊連續(xù)的內(nèi)存存儲(chǔ),這個(gè)機(jī)構(gòu)是zipList那伐,即壓縮列表踏施。它將所有的元素彼此緊挨著一起存儲(chǔ)石蔗,分配的是一塊連續(xù)的內(nèi)存。當(dāng)數(shù)據(jù)量比較多的時(shí)候才會(huì)改成quickList畅形。Redis將鏈表和zipList結(jié)合起來(lái)組成了quickList养距,也就是將多個(gè)zipList使用雙向指針串起來(lái)使用。quickList既滿足了快速的插入刪除性能日熬,又不會(huì)出現(xiàn)太大的冗余空間棍厌。

hash(字典)

? Redis的字典相當(dāng)于Java語(yǔ)言里的HashMap,它是無(wú)序字典竖席,內(nèi)部存儲(chǔ)了很多鍵值對(duì)耘纱。實(shí)現(xiàn)結(jié)構(gòu)上與Java的HashMap也是一樣的,都是==數(shù)組==+==鏈表==的二維結(jié)構(gòu)毕荐。但他們的rehash的方式不一樣束析,Redis為了追求高性能,采用了漸進(jìn)式rehash策略憎亚。

? 漸進(jìn)式rehash會(huì)在rehash的同時(shí)员寇,保留新舊兩個(gè)hash結(jié)構(gòu),查詢時(shí)會(huì)同時(shí)查詢兩個(gè)hash結(jié)構(gòu)第美,循環(huán)漸進(jìn)地將舊hash的內(nèi)同一點(diǎn)點(diǎn)地遷移到新的hash結(jié)構(gòu)中蝶锋,最后使用新的hash結(jié)構(gòu)取而代之。

? hash結(jié)構(gòu)可以用來(lái)存儲(chǔ)用戶信息斋日,與字符串需要一次性全部序列化整個(gè)用戶對(duì)象不用牲览,hash可以對(duì)用戶結(jié)構(gòu)中的每個(gè)字段單獨(dú)存儲(chǔ)。這樣當(dāng)我們需要獲去用戶信息時(shí)可以進(jìn)行部分獲取恶守。而以字符串的形式去保存用戶信息的話第献,就只能一次性全部讀取,這樣就會(huì)浪費(fèi)網(wǎng)絡(luò)流量兔港。

? 個(gè)人遇到過(guò)Redis獲取一個(gè)完整的商戶信息字符串庸毫,有一萬(wàn)多個(gè)字符,大于28k的內(nèi)存

? hash也有缺點(diǎn)衫樊,hash結(jié)構(gòu)的存儲(chǔ)消耗要高于單個(gè)字符串飒赃。

set(集合)

? Redis的集合相當(dāng)于Java語(yǔ)言里的HashSet,它內(nèi)部的鍵值對(duì)是無(wú)序的科侈、唯一的载佳。它的內(nèi)部實(shí)現(xiàn)相當(dāng)于一個(gè)特殊的字典,字典中所有的value都是一個(gè)值NULL臀栈。

set結(jié)構(gòu)可以用來(lái)存儲(chǔ)在某活動(dòng)中中將的用戶ID蔫慧,因?yàn)橛腥ブ毓δ埽梢员WC同一個(gè)用戶不會(huì)中將兩次权薯。

zset(有序集合)

? 它類似于Java的SortedSetHashMap的結(jié)合體姑躲,相當(dāng)于一個(gè)有序set.睡扬。它的內(nèi)部實(shí)現(xiàn)是一種叫做==“跳躍列表”==的數(shù)據(jù)結(jié)構(gòu)。

? 跳躍列表是在一個(gè)鏈表中黍析,每隔幾個(gè)元素選出一個(gè)代表元素卖怜,然后用一級(jí)指針串起來(lái),再?gòu)倪@寫被串起來(lái)的代表中再選出一些代表元素阐枣,最終形成了一個(gè)金字塔結(jié)構(gòu)马靠。定位插入點(diǎn)時(shí),現(xiàn)在最頂層進(jìn)行定位侮繁,然后一級(jí)一級(jí)下潛到最底層找到合適的位置虑粥,將新元素插進(jìn)去。


1.1.3 容器型數(shù)據(jù)結(jié)構(gòu)的通用規(guī)則

list宪哩、set娩贷、hash、zset這四縱數(shù)據(jù)結(jié)構(gòu)是容器型數(shù)據(jù)結(jié)構(gòu)锁孟,共享以下兩條原則:

  1. create if not exists: 如果容器不存在彬祖,那就創(chuàng)建一個(gè),再進(jìn)行操作品抽。
  2. drop uf no elements: 如果容器里的元素沒(méi)有了储笑,那么立即刪除容器,釋放內(nèi)存圆恤。

1.1.4 過(guò)期時(shí)間

? Redis所有的數(shù)據(jù)結(jié)構(gòu)都可以設(shè)置過(guò)期時(shí)間突倍。過(guò)期是以對(duì)象為單位。

? 如果一個(gè)字符串以及設(shè)置了過(guò)期時(shí)間盆昙,然后你調(diào)用set方法修改了它羽历,那么它的過(guò)期時(shí)間會(huì)消失。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淡喜,一起剝皮案震驚了整個(gè)濱河市秕磷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炼团,老刑警劉巖澎嚣,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘟芝,居然都是意外死亡易桃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門锌俱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颈抚,“玉大人,你說(shuō)我怎么就攤上這事嚼鹉》泛海” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵锚赤,是天一觀的道長(zhǎng)匹舞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)线脚,這世上最難降的妖魔是什么赐稽? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮浑侥,結(jié)果婚禮上姊舵,老公的妹妹穿的比我還像新娘。我一直安慰自己寓落,他們只是感情好括丁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伶选,像睡著了一般史飞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仰税,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天构资,我揣著相機(jī)與錄音,去河邊找鬼陨簇。 笑死吐绵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的河绽。 我是一名探鬼主播己单,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼葵姥!你這毒婦竟也來(lái)了荷鼠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤榔幸,失蹤者是張志新(化名)和其女友劉穎允乐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體削咆,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牍疏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拨齐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳞陨。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厦滤,到底是詐尸還是另有隱情援岩,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布掏导,位于F島的核電站享怀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏趟咆。R本人自食惡果不足惜添瓷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望值纱。 院中可真熱鬧鳞贷,春花似錦、人聲如沸虐唠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凿滤。三九已至妈橄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翁脆,已是汗流浹背眷蚓。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留反番,地道東北人沙热。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像罢缸,于是被迫代替她去往敵國(guó)和親篙贸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345