Redis面試題-Redis的數(shù)據(jù)類型及其底層數(shù)據(jù)結(jié)構(gòu)

redis都有哪些數(shù)據(jù)類型洗做?分別在哪些場(chǎng)景下使用比較合適弓叛?

(1)string
這是最基本的類型了,沒(méi)啥可說(shuō)的诚纸,就是普通的set和get邪码,做簡(jiǎn)單的kv緩存;
(2)hash
這個(gè)是類似map的一種結(jié)構(gòu)咬清,這個(gè)一般就是可以將結(jié)構(gòu)化的數(shù)據(jù)闭专,比如一個(gè)對(duì)象(前提是這個(gè)對(duì)象沒(méi)嵌套其他的對(duì)象)給緩存在redis里,然后每次讀寫緩存的時(shí)候旧烧,可以就操作hash里的某個(gè)字段影钉。
hash類的數(shù)據(jù)結(jié)構(gòu),主要是用來(lái)存放一些對(duì)象掘剪,把一些簡(jiǎn)單的對(duì)象給緩存起來(lái)平委,后續(xù)操作的時(shí)候,你可以直接僅僅修改這個(gè)對(duì)象中的某個(gè)字段的值夺谁。
(3)list
有序列表廉赔,這個(gè)是可以玩兒出很多花樣的。
微博匾鸥,某個(gè)大v的粉絲蜡塌,就可以以list的格式放在redis里去緩存。
key=某大v
value=[zhangsan, lisi, wangwu]
比如可以通過(guò)list存儲(chǔ)一些列表型的數(shù)據(jù)結(jié)構(gòu)勿负,類似粉絲列表了馏艾、文章的評(píng)論列表了之類的東西。
比如可以通過(guò)lrange命令奴愉,就是從某個(gè)元素開始讀取多少個(gè)元素琅摩,可以基于list實(shí)現(xiàn)分頁(yè)查詢,這個(gè)很棒的一個(gè)功能锭硼,基于redis實(shí)現(xiàn)簡(jiǎn)單的高性能分頁(yè)房资,可以做類似微博那種下拉不斷分頁(yè)的東西,性能高檀头,就一頁(yè)一頁(yè)走轰异。
比如可以搞個(gè)簡(jiǎn)單的消息隊(duì)列,從list頭懟進(jìn)去鳖擒,從list尾巴那里弄出來(lái)溉浙。
(4)set
無(wú)序集合,自動(dòng)去重蒋荚。
直接基于set將系統(tǒng)里需要去重的數(shù)據(jù)扔進(jìn)去,自動(dòng)就給去重了馆蠕,如果你需要對(duì)一些數(shù)據(jù)進(jìn)行快速的全局去重期升,你當(dāng)然也可以基于jvm內(nèi)存里的HashSet進(jìn)行去重惊奇,但是如果你的某個(gè)系統(tǒng)部署在多臺(tái)機(jī)器上呢?
得基于redis進(jìn)行全局的set去重
可以基于set玩兒交集播赁、并集颂郎、差集的操作,比如交集吧容为,可以把兩個(gè)人的粉絲列表整一個(gè)交集乓序,看看倆人的共同好友是誰(shuí)?對(duì)吧坎背!
把兩個(gè)大v的粉絲都放在兩個(gè)set中替劈,對(duì)兩個(gè)set做交集。
(5)sorted set
排序的set得滤,去重但是可以排序陨献,寫進(jìn)去的時(shí)候給一個(gè)分?jǐn)?shù),自動(dòng)根據(jù)分?jǐn)?shù)排序懂更,這個(gè)可以玩兒很多的花樣眨业,最大的特點(diǎn)是有個(gè)分?jǐn)?shù)可以自定義排序規(guī)則。
比如說(shuō)你要是想根據(jù)時(shí)間對(duì)數(shù)據(jù)排序沮协,那么可以寫入進(jìn)去的時(shí)候用某個(gè)時(shí)間作為分?jǐn)?shù)龄捡,人家自動(dòng)給你按照時(shí)間排序了。
排行榜:將每個(gè)用戶以及其對(duì)應(yīng)的什么分?jǐn)?shù)寫入進(jìn)去慷暂,zadd board score username墅茉,接著zrevrange board 0 99,就可以獲取排名前100的用戶呜呐;zrank board username就斤,可以看到用戶在排行榜里的排名。
(6)Redis5.0新數(shù)據(jù)結(jié)構(gòu)-stream
Redis的作者在Redis5.0中蘑辑,放出一個(gè)新的數(shù)據(jù)結(jié)構(gòu)洋机,Stream。Redis Stream 的內(nèi)部洋魂,其實(shí)也是一個(gè)隊(duì)列绷旗,每一個(gè)不同的key,對(duì)應(yīng)的是不同的隊(duì)列副砍,每個(gè)隊(duì)列的元素衔肢,也就是消息,都有一個(gè)msgid豁翎,并且需要保證msgid是嚴(yán)格遞增的角骤。在Stream當(dāng)中,消息是默認(rèn)持久化的,即便是Redis重啟邦尊,也能夠讀取到消息背桐。那么,stream是如何做到多播的呢蝉揍?其實(shí)非常的簡(jiǎn)單链峭,與其他隊(duì)列系統(tǒng)相似,Redis對(duì)不同的消費(fèi)者又沾,也有消費(fèi)者Group這樣的概念弊仪,不同的消費(fèi)組,可以消費(fèi)同一個(gè)消息杖刷,對(duì)于不同的消費(fèi)組励饵,都維護(hù)一個(gè)Idx下標(biāo),表示這一個(gè)消費(fèi)群組消費(fèi)到了哪里挺勿,每次進(jìn)行消費(fèi)曲横,都會(huì)更新一下這個(gè)下標(biāo),往后面一位進(jìn)行偏移不瓶。

1禾嫉、string 數(shù)據(jù)類型
底層:動(dòng)態(tài)字符串
string 是Redis的最基本的數(shù)據(jù)類型,可以理解為與 Memcached 一模一樣的類型蚊丐,一個(gè)key 對(duì)應(yīng)一個(gè) value熙参。string 類型是二進(jìn)制安全的,意思是 Redis 的 string 可以包含任何數(shù)據(jù)麦备,比如圖片或者序列化的對(duì)象孽椰,一個(gè) redis 中字符串 value 最多可以是 512M。
①凛篙、上面的 ttl 命令是返回 key 的剩余過(guò)期時(shí)間黍匾,單位為秒。
②呛梆、mset和mget這種批量處理命令锐涯,能夠極大的提高操作效率。因?yàn)橐淮蚊顖?zhí)行所需要的時(shí)間=1次網(wǎng)絡(luò)傳輸時(shí)間+1次命令執(zhí)行時(shí)間填物,n個(gè)命令耗時(shí)=n次網(wǎng)絡(luò)傳輸時(shí)間+n次命令執(zhí)行時(shí)間纹腌,而批量處理命令會(huì)將n次網(wǎng)絡(luò)時(shí)間縮減為1次網(wǎng)絡(luò)時(shí)間,也就是1次網(wǎng)絡(luò)傳輸時(shí)間+n次命令處理時(shí)間滞磺。
但是需要注意的是升薯,Redis是單線程的,如果一次批量處理命令過(guò)多击困,會(huì)造成Redis阻塞或網(wǎng)絡(luò)擁塞(傳輸數(shù)據(jù)量大)涎劈。
③、setnx可以用于實(shí)現(xiàn)分布式鎖,具體實(shí)現(xiàn)方式后面會(huì)介紹责语。
  上面是 string 類型的基本命令炮障,下面介紹幾個(gè)自增自減操作目派,這在實(shí)際工作中還是特別有用的(分布式環(huán)境中統(tǒng)計(jì)系統(tǒng)的在線人數(shù)坤候,利用Redis的高性能讀寫,在Redis中完成秒殺企蹭,而不是直接操作數(shù)據(jù)庫(kù)白筹。)。

字符串對(duì)象
字符串是Redis最基本的數(shù)據(jù)類型谅摄,不僅所有key都是字符串類型徒河,其它幾種數(shù)據(jù)類型構(gòu)成的元素也是字符串。注意字符串的長(zhǎng)度不能超過(guò)512M送漠。
列表對(duì)象
list 列表顽照,它是簡(jiǎn)單的字符串列表,按照插入順序排序闽寡,你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)代兵,它的底層實(shí)際上是個(gè)鏈表結(jié)構(gòu)。
編碼
列表對(duì)象的編碼可以是 ziplist(壓縮列表) 和 linkedlist(雙端鏈表)爷狈。
哈希對(duì)象
哈希對(duì)象的鍵是一個(gè)字符串類型植影,值是一個(gè)鍵值對(duì)集合。
編碼
哈希對(duì)象的編碼可以是 ziplist 或者 hashtable涎永。
集合對(duì)象
集合對(duì)象 set 是 string 類型(整數(shù)也會(huì)轉(zhuǎn)換成string類型進(jìn)行存儲(chǔ))的無(wú)序集合思币。注意集合和列表的區(qū)別:集合中的元素是無(wú)序的,因此不能通過(guò)索引來(lái)操作元素羡微;集合中的元素不能有重復(fù)谷饿。
有序集合對(duì)象
和上面的集合對(duì)象相比,有序集合對(duì)象是有序的妈倔。與列表使用索引下標(biāo)作為排序依據(jù)不同博投,有序集合為每個(gè)元素設(shè)置一個(gè)分?jǐn)?shù)(score)作為排序依據(jù)。
編碼
有序集合的編碼可以是 ziplist 或者 skiplist启涯。
ziplist 編碼的有序集合對(duì)象使用壓縮列表作為底層實(shí)現(xiàn)贬堵,每個(gè)集合元素使用兩個(gè)緊挨在一起的壓縮列表節(jié)點(diǎn)來(lái)保存,第一個(gè)節(jié)點(diǎn)保存元素的成員结洼,第二個(gè)節(jié)點(diǎn)保存元素的分值黎做。并且壓縮列表內(nèi)的集合元素按分值從小到大的順序進(jìn)行排列,小的放置在靠近表頭的位置松忍,大的放置在靠近表尾的位置蒸殿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宏所,更是在濱河造成了極大的恐慌酥艳,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爬骤,死亡現(xiàn)場(chǎng)離奇詭異充石,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)霞玄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門骤铃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坷剧,你說(shuō)我怎么就攤上這事惰爬。” “怎么了惫企?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵撕瞧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我狞尔,道長(zhǎng)丛版,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任沪么,我火速辦了婚禮,結(jié)果婚禮上禽车,老公的妹妹穿的比我還像新娘寇漫。我一直安慰自己,他們只是感情好殉摔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恩尾,像睡著了一般弛说。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翰意,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天木人,我揣著相機(jī)與錄音信柿,去河邊找鬼。 笑死醒第,一個(gè)胖子當(dāng)著我的面吹牛渔嚷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稠曼,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼形病,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蒲列?” 一聲冷哼從身側(cè)響起窒朋,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搀罢,失蹤者是張志新(化名)和其女友劉穎蝗岖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榔至,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抵赢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唧取。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铅鲤。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖枫弟,靈堂內(nèi)的尸體忽然破棺而出邢享,到底是詐尸還是另有隱情,我是刑警寧澤淡诗,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布骇塘,位于F島的核電站,受9級(jí)特大地震影響韩容,放射性物質(zhì)發(fā)生泄漏款违。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一群凶、第九天 我趴在偏房一處隱蔽的房頂上張望插爹。 院中可真熱鬧,春花似錦请梢、人聲如沸赠尾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)气嫁。三九已至,卻和暖如春形真,著一層夾襖步出監(jiān)牢的瞬間杉编,已是汗流浹背超全。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邓馒,地道東北人嘶朱。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像光酣,于是被迫代替她去往敵國(guó)和親疏遏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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