Redis已經(jīng)越來(lái)越多地應(yīng)用到互聯(lián)網(wǎng)技術(shù)中,而關(guān)于Redis的相關(guān)問(wèn)題,也成為面試中必不可少的一部分,本文開始將會(huì)逐漸把我了解到的關(guān)于Redis的一些面試問(wèn)題整理出來(lái),供各位參考,如有不對(duì)之處,煩請(qǐng)指正。
簡(jiǎn)介
Redis共支持五種數(shù)據(jù)結(jié)構(gòu),分別是string(字符串)、hash(字典)、list(列表)、set(集合)、zset(有序集合)。
詳解
string(字符串)
數(shù)據(jù)結(jié)構(gòu):Redis中string數(shù)據(jù)結(jié)構(gòu)為動(dòng)態(tài)字符數(shù)組,采用預(yù)分配冗余空間的方式來(lái)減少內(nèi)存分配。
擴(kuò)容機(jī)制:當(dāng)字符串長(zhǎng)度小于1MB時(shí),擴(kuò)容都是加倍現(xiàn)有空間。當(dāng)字符串長(zhǎng)度大于1MB時(shí),每次擴(kuò)容1MB,最大長(zhǎng)度為512MB。
計(jì)數(shù):當(dāng)值為整數(shù)時(shí),可以進(jìn)行自增操作。范圍為signed long 的最大值和最小值之間。
hash(字典)
數(shù)據(jù)結(jié)構(gòu):Redis中l(wèi)ist相當(dāng)于Java的HashMap。
漸進(jìn)式rehash:在Redis中針對(duì)hash沖突采用的是漸進(jìn)式rehash操作。漸進(jìn)式rehash會(huì)同時(shí)保留新舊兩個(gè)hash結(jié)構(gòu),查詢時(shí)同時(shí)查詢兩個(gè)hash結(jié)構(gòu)。在后續(xù)的定時(shí)任務(wù)及hash操作的過(guò)程中完成從舊hash結(jié)構(gòu),遷移到新hash結(jié)構(gòu)的過(guò)程。
list(列表)
數(shù)據(jù)結(jié)構(gòu):Redis中l(wèi)ist相當(dāng)于Java的LinkedList,所以寫操作時(shí)間復(fù)雜度為O(1),讀操作時(shí)間復(fù)雜度為O(n)。
set(集合)
數(shù)據(jù)結(jié)構(gòu):Redis中set相當(dāng)于Java的HashSet。
zset(有序集合)
數(shù)據(jù)結(jié)構(gòu):Redis中zset類似于一個(gè)帶權(quán)值(score)的SortedSet。其內(nèi)部通過(guò)跳躍列表(關(guān)于跳躍列表,將會(huì)在后期的文章中進(jìn)行分享)實(shí)現(xiàn)。
總結(jié)
1.通用規(guī)則
hash、list、set、zset這四種數(shù)據(jù)結(jié)構(gòu)為容器型數(shù)據(jù)結(jié)構(gòu),所有容器型數(shù)據(jù)結(jié)構(gòu)遵守以下規(guī)則:
create if not exists:當(dāng)容器不存在時(shí),需先創(chuàng)建一個(gè)容器,再進(jìn)行操作;
drop if not elements:當(dāng)容器內(nèi)無(wú)元素時(shí),會(huì)立即刪除容器,釋放內(nèi)存。
2.過(guò)期時(shí)間
過(guò)期時(shí)間以對(duì)象為單位,如整個(gè)hash結(jié)構(gòu)。
當(dāng)string被set方法修改后,過(guò)期時(shí)間將會(huì)失效。