Redis簡述

一、Redis的概念

Redis是一個基于內(nèi)存的高性能key-value數(shù)據(jù)庫分歇。

Redis本質(zhì)上是一個Key-Value類型的內(nèi)存數(shù)據(jù)庫傀蓉,很像memcached,整個數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當(dāng)中進(jìn)行操作职抡,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù)flush到硬盤上進(jìn)行保存葬燎。因?yàn)槭羌儍?nèi)存操作,Redis的性能非常出色缚甩,每秒可以處理超過 10萬次讀寫操作谱净,是已知性能最快的Key-Value DB。

Redis 與其他 key – value 緩存產(chǎn)品有以下三個特點(diǎn):

  • Redis支持?jǐn)?shù)據(jù)的持久化蹄胰,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中岳遥,重啟的時候可以再次加載進(jìn)行使用奕翔。
  • Redis不僅僅支持簡單的key-value類型的數(shù)據(jù)裕寨,同時還提供list,set派继,zset宾袜,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
  • Redis支持?jǐn)?shù)據(jù)的備份驾窟,即master-slave模式的數(shù)據(jù)備份庆猫。

二、Redis的五種常用的數(shù)據(jù)類型

Redis的五種常用的數(shù)據(jù)類型分別是:String绅络、Hash月培、List嘁字、Set和Sorted set

不同數(shù)據(jù)類型的描述

1 String

常用命令:
set/get/decr/incr/mget等;

應(yīng)用場景:
String是最常用的一種數(shù)據(jù)類型杉畜,普通的key/value存儲都可以歸為此類纪蜒;

實(shí)現(xiàn)方式:
String在redis內(nèi)部存儲默認(rèn)就是一個字符串,被redisObject所引用此叠,當(dāng)遇到incr纯续、decr等操作時會轉(zhuǎn)成數(shù)值型進(jìn)行計(jì)算,此時redisObject的encoding字段為int灭袁。

2 Hash

常用命令:
hget/hset/hgetall等

應(yīng)用場景:
我們要存儲一個用戶信息對象數(shù)據(jù)猬错,其中包括用戶ID、用戶姓名茸歧、年齡和生日倦炒,通過用戶ID我們希望獲取該用戶的姓名或者年齡或者生日;

實(shí)現(xiàn)方式:
Redis的Hash實(shí)際是內(nèi)部存儲的Value為一個HashMap举娩,并提供了直接存取這個Map成員的接口析校。如圖所示,Key是用戶ID, value是一個Map铜涉。這個Map的key是成員的屬性名智玻,value是屬性值。這樣對數(shù)據(jù)的修改和存取都可以直接通過其內(nèi)部Map的Key(Redis里稱內(nèi)部Map的key為field), 也就是通過 key(用戶ID) + field(屬性標(biāo)簽) 就可以操作對應(yīng)屬性數(shù)據(jù)芙代。當(dāng)前HashMap的實(shí)現(xiàn)有兩種方式:當(dāng)HashMap的成員比較少時Redis為了節(jié)省內(nèi)存會采用類似一維數(shù)組的方式來緊湊存儲吊奢,而不會采用真正的HashMap結(jié)構(gòu),這時對應(yīng)的value的redisObject的encoding為zipmap纹烹,當(dāng)成員數(shù)量增大時會自動轉(zhuǎn)成真正的HashMap,此時encoding為int页滚。

3 List

常用命令:
lpush/rpush/lpop/rpop/lrange等;

應(yīng)用場景:
Redis list的應(yīng)用場景非常多铺呵,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一裹驰,比如twitter的關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來實(shí)現(xiàn)片挂;

實(shí)現(xiàn)方式:
Redis list的實(shí)現(xiàn)為一個雙向鏈表幻林,即可以支持反向查找和遍歷,更方便操作音念,不過帶來了部分額外的內(nèi)存開銷沪饺,Redis內(nèi)部的很多實(shí)現(xiàn),包括發(fā)送緩沖隊(duì)列等也都是用的這個數(shù)據(jù)結(jié)構(gòu)闷愤。

4 Set

常用命令:
sadd/spop/smembers/sunion等整葡;

應(yīng)用場景:
Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動排重的讥脐,當(dāng)你需要存儲一個列表數(shù)據(jù)遭居,又不希望出現(xiàn)重復(fù)數(shù)據(jù)時啼器,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合內(nèi)的重要接口俱萍,這個也是list所不能提供的镀首;

實(shí)現(xiàn)方式:
set 的內(nèi)部實(shí)現(xiàn)是一個 value永遠(yuǎn)為null的HashMap,實(shí)際就是通過計(jì)算hash的方式來快速排重的鼠次,這也是set能提供判斷一個成員是否在集合內(nèi)的原因更哄。

5 Sorted Set

常用命令:
zadd/zrange/zrem/zcard等;

應(yīng)用場景:
Redis sorted set的使用場景與set類似腥寇,區(qū)別是set不是自動有序的成翩,而sorted set可以通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的赦役,即自動排序麻敌。當(dāng)你需要一個有序的并且不重復(fù)的集合列表,那么可以選擇sorted set數(shù)據(jù)結(jié)構(gòu)掂摔,比如twitter 的public timeline可以以發(fā)表時間作為score來存儲术羔,這樣獲取時就是自動按時間排好序的。

實(shí)現(xiàn)方式:
Redis sorted set的內(nèi)部使用HashMap和跳躍表(SkipList)來保證數(shù)據(jù)的存儲和有序乙漓,HashMap里放的是成員到score的映射级历,而跳躍表里存放的是所有的成員,排序依據(jù)是HashMap里存的score,使用跳躍表的結(jié)構(gòu)可以獲得比較高的查找效率叭披,并且在實(shí)現(xiàn)上比較簡單寥殖。

三、Redis的內(nèi)存淘汰機(jī)制

Redis提供了下面幾種淘汰策略供用戶選擇涩蜘,其中默認(rèn)的策略為noeviction策略:

  • noeviction:當(dāng)內(nèi)存使用達(dá)到閾值的時候嚼贡,所有引起申請內(nèi)存的命令會報(bào)錯。
  • allkeys-lru:在主鍵空間中同诫,優(yōu)先移除最近未使用的key粤策。
  • volatile-lru:在設(shè)置了過期時間的鍵空間中,優(yōu)先移除最近未使用的key误窖。
  • allkeys-random:在主鍵空間中叮盘,隨機(jī)移除某個key。
  • volatile-random:在設(shè)置了過期時間的鍵空間中贩猎,隨機(jī)移除某個key熊户。
  • volatile-ttl:在設(shè)置了過期時間的鍵空間中萍膛,具有更早過期時間的key優(yōu)先移除吭服。

詳見:Redis 內(nèi)存淘汰機(jī)制

四、Redis的復(fù)制機(jī)制

詳見:淺析Redis復(fù)制

五蝗罗、Redis 和 Memcached 的區(qū)別

  • Redis支持服務(wù)器端的數(shù)據(jù)操作:Redis相比Memcached來說艇棕,擁有更多的數(shù)據(jù)結(jié)構(gòu)和并支持更豐富的數(shù)據(jù)操作蝌戒,通常在Memcached里,你需要將數(shù)據(jù)拿到客戶端來進(jìn)行類似的修改再set回去沼琉。這大大增加了網(wǎng)絡(luò)IO的次數(shù)和數(shù)據(jù)體積北苟。在Redis中,這些復(fù)雜的操作通常和一般的GET/SET一樣高效打瘪。所以友鼻,如果需要緩存能夠支持更復(fù)雜的結(jié)構(gòu)和操作,那么Redis會是不錯的選擇闺骚。

  • 內(nèi)存使用效率對比:使用簡單的key-value存儲的話彩扔,Memcached的內(nèi)存利用率更高,而如果Redis采用hash結(jié)構(gòu)來做key-value存儲僻爽,由于其組合式的壓縮虫碉,其內(nèi)存利用率會高于Memcached。

  • 性能對比:由于Redis只使用單核胸梆,而Memcached可以使用多核敦捧,所以平均每一個核上Redis在存儲小數(shù)據(jù)時比Memcached性能更高。而在100k以上的數(shù)據(jù)中碰镜,Memcached性能要高于Redis兢卵,雖然Redis最近也在存儲大數(shù)據(jù)的性能上進(jìn)行優(yōu)化,但是比起Memcached绪颖,還是稍有遜色济蝉。

詳見:Redis 和 Memcached 的區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市菠发,隨后出現(xiàn)的幾起案子王滤,更是在濱河造成了極大的恐慌,老刑警劉巖滓鸠,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雁乡,死亡現(xiàn)場離奇詭異,居然都是意外死亡糜俗,警方通過查閱死者的電腦和手機(jī)踱稍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悠抹,“玉大人珠月,你說我怎么就攤上這事⌒ǖ校” “怎么了啤挎?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卵凑。 經(jīng)常有香客問我庆聘,道長胜臊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任伙判,我火速辦了婚禮象对,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宴抚。我一直安慰自己勒魔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布菇曲。 她就那樣靜靜地躺著沥邻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羊娃。 梳的紋絲不亂的頭發(fā)上唐全,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音蕊玷,去河邊找鬼邮利。 笑死,一個胖子當(dāng)著我的面吹牛垃帅,可吹牛的內(nèi)容都是我干的延届。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贸诚,長吁一口氣:“原來是場噩夢啊……” “哼方庭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起酱固,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤械念,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后运悲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龄减,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年班眯,在試婚紗的時候發(fā)現(xiàn)自己被綠了希停。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡署隘,死狀恐怖宠能,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情磁餐,我是刑警寧澤违崇,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響亦歉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畅哑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一肴楷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荠呐,春花似錦赛蔫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至媚创,卻和暖如春渗钉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钞钙。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工鳄橘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芒炼。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓瘫怜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親本刽。 傳聞我的和親對象是個殘疾皇子鲸湃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容