日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

redis反杀面试官之10问

發(fā)布時(shí)間:2024/2/28 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis反杀面试官之10问 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)言

1. 筆者近兩年來(lái)一直使用redis,也對(duì)redis有過(guò)仔細(xì)的研究,不敢說(shuō)精通,熟悉至少是有的

2. redis越來(lái)越火,網(wǎng)上相應(yīng)的文章,總結(jié),面試問(wèn)題也有很多,但大多是應(yīng)付簡(jiǎn)單面試用的,如果面試官再深入一些,恐怕大多數(shù)人都hold不住

3. 所以特在這里總結(jié)了一些有難度的問(wèn)題,若你能認(rèn)真學(xué)習(xí)研究,不但能大幅提高對(duì)redis的理解程度,反殺面試官也是輕輕松松

4. 問(wèn)題不止10個(gè),隨時(shí)想到隨時(shí)更新,有時(shí)間就會(huì)把答案補(bǔ)上來(lái)

問(wèn)題1:持久化的混合存儲(chǔ)模式(前面RDB+后面AOF),它的實(shí)現(xiàn)原理和好處

答:

問(wèn)題2:scan命令,第三個(gè)參數(shù)應(yīng)該怎么填

答:先看下scan命令的格式,第1個(gè)參數(shù)是下標(biāo),第2個(gè)參數(shù)是匹配模式,第三個(gè)參數(shù)是限制個(gè)數(shù)

1 2 3 SCAN cursor [MATCH pattern] [COUNT count]

但是這個(gè)count限制并不是必定能起效,受多種因素影響,大致如下

1. 當(dāng)redis發(fā)現(xiàn)你用hscan,zscan,scan命令遍歷的對(duì)象是壓縮列表實(shí)現(xiàn)的,說(shuō)明對(duì)象內(nèi)元素比較少,會(huì)全部遍歷篩選后返回

2. 如果你不傳count參數(shù),那么redis會(huì)默認(rèn)設(shè)置為10

3. redis是對(duì)數(shù)組里面單個(gè)下標(biāo)里面的元素遍歷,如果某個(gè)下標(biāo)里面符合match格式的元素很多,會(huì)超出count值,單個(gè)下標(biāo)遍歷完后才會(huì)判斷是否超出count值,所以可能已經(jīng)超過(guò)了count

4. 如果單次遍歷過(guò)程中耗時(shí)過(guò)長(zhǎng),為防止redis卡頓,即使符合條件的元素有很多,也會(huì)提前返回,此時(shí)個(gè)數(shù)會(huì)少于count值

綜上:具體使用時(shí)要根據(jù)你對(duì)結(jié)果值的處理操作(元素?cái)?shù)據(jù)總體量大小,單個(gè)元素的操作耗時(shí)等)來(lái)決定一批篩選多少個(gè)元素,redis已經(jīng)為我們做好了防護(hù)

具體scan命令的實(shí)現(xiàn)原理可參考筆者的這篇博客redis的scan命令的源碼分析,實(shí)現(xiàn)原理_papaya的博客-CSDN博客

問(wèn)題3:scan命令,返回的游標(biāo)值在redis中代表什么,是槽位嗎,這個(gè)槽位和redis集群的槽位概念有關(guān)系嗎

答:

問(wèn)題4:scan命令,返回的key中,有一定概率會(huì)出現(xiàn)重復(fù)的情況,能說(shuō)下到底什么情況下會(huì)出現(xiàn)重復(fù)嗎?為什么,這種重復(fù)能優(yōu)化嗎

答:redis縮容的時(shí)候會(huì)出現(xiàn),因?yàn)閞ehash采用高位加法,舉例:遍歷到下圖中的橙色下標(biāo)(110)時(shí)發(fā)生了縮容,前面的000,100,010都已經(jīng)遍歷過(guò)了,其中000,100節(jié)點(diǎn)會(huì)被rehash到新的00節(jié)點(diǎn)上,不會(huì)重復(fù)遍歷。但是010,110節(jié)點(diǎn)都會(huì)rehash到新的10下標(biāo)(第一行綠色的)上,那么010下標(biāo)上對(duì)應(yīng)的元素就會(huì)被重復(fù)遍歷

問(wèn)題5:redis的讀寫(xiě)分離模式中,因?yàn)橹鲝耐叫枰獣r(shí)間,所以有一定概率會(huì)出現(xiàn)主redis剛剛寫(xiě)入,從redis讀取不到進(jìn)而認(rèn)為該key不存在的情況,如何優(yōu)化

答:

問(wèn)題6:redis命令查看單個(gè)key的大小有哪些命令,哪些是準(zhǔn)確的,哪些是不準(zhǔn)確的,比如--bigkeys命令的原理

答:

問(wèn)題7:redis集群選舉時(shí)是使用raft算法還是paxos算法,知道raft算法和paxos算法的區(qū)別嗎

答:

問(wèn)題8:rehash為什么要用高位加法,而不是我們通常的低位加法,好處是什么

答:采用高位進(jìn)位加法,無(wú)論是擴(kuò)容還是縮容,rehash 后的槽位在遍歷順序上是相鄰的,這也是scan命令能保證全盤(pán)遍歷的精妙之處,詳見(jiàn)這篇博客:redis之rehash原理_papaya的博客-CSDN博客_redis rehash原理

問(wèn)題9:redis對(duì)象中有個(gè)字段叫l(wèi)ru,只有24位,在LRU模式下,存儲(chǔ)的是最后一次訪問(wèn)時(shí)間。由于只有24位,能表示的最大時(shí)間只有194天,超過(guò)194天的key怎么辦,如何才能計(jì)算出它真正的空閑時(shí)間?

答:代碼如下

// 計(jì)算對(duì)象的空閑時(shí)間,也就是沒(méi)有被訪問(wèn)的時(shí)間,返回結(jié)果是毫秒 unsigned long long estimateObjectIdleTime(robj* o) {unsigned long long lruclock = LRU_CLOCK();// 獲取Redis時(shí)鐘,也就是server.lruclock的值,單位:秒if (lruclock >= o->lru){// 正常遞增時(shí)直接減即可(LRU_CLOCK_RESOLUTION的值默認(rèn)是1000)return (lruclock - o->lru) * LRU_CLOCK_RESOLUTION;}else{// 折返了,則加一輪最大值后再減(LRU_CLOCK_MAX表示一輪的最大值,即2^24 - 1)return (lruclock + LRU_CLOCK_MAX - 0->lru) * LRU_CLOCK_RESOLUTION;} }

問(wèn)題10:redis事務(wù)的watch有沒(méi)有ABA問(wèn)題,是如何解決的?

答:沒(méi)有ABA問(wèn)題。redis會(huì)為每個(gè)要監(jiān)聽(tīng)的key維護(hù)一個(gè)監(jiān)聽(tīng)的client列表,任何key發(fā)生變化時(shí)都會(huì)檢測(cè)一下是否是watch中的key。若是watch中的key,則把監(jiān)控這個(gè)key的所有client都標(biāo)記為REDIS_DIRTY_CAS,意思是為該client的所有CAS操作都“dirty”了。當(dāng)服務(wù)器收到該client的事務(wù)執(zhí)行命令(即exec命令時(shí)),會(huì)檢測(cè)是否有REDIS_DIRTY_CAS標(biāo)記,若有,則直接返回,不再執(zhí)行事務(wù)

詳細(xì)分析可以見(jiàn)筆者的這篇博客:

redis的watch沒(méi)有ABA的問(wèn)題_papaya的博客-CSDN博客

問(wèn)題11:布隆過(guò)濾器怎么刪除元素呢?

答:經(jīng)典的布隆過(guò)濾器不支持刪除元素

如果一定要?jiǎng)h除元素,業(yè)內(nèi)普遍有兩種做法

方法1:定時(shí)異步重建布隆過(guò)濾器,比如每隔3天把所有元素重新hash,建立新的布隆過(guò)濾器,重建完后再刪掉舊的布隆過(guò)濾器。

方法2:使用計(jì)數(shù)型的布隆過(guò)濾器。因?yàn)榻?jīng)典的布隆過(guò)濾器的一個(gè)位只能為0或1,為1時(shí)不能記錄有多少個(gè)元素引用了該位,一旦刪除,數(shù)據(jù)就亂了。但計(jì)數(shù)型的布隆過(guò)濾器每個(gè)位是一個(gè)數(shù)字,記錄了有多少個(gè)元素引用了該位,刪除一個(gè)元素時(shí)只需對(duì)其hash對(duì)應(yīng)的位的數(shù)字進(jìn)行減1即可。

問(wèn)題12:一般情況下redis cluster中key和slot的映射是通過(guò)算法(原理:crc16(key)%16384)對(duì)應(yīng)的,知道如何強(qiáng)制把key映射到指定的slot呢?

答:鍵哈希標(biāo)簽原理代碼如下

unsigned int keyHashSlot(char *key, int keylen) {undefined int s, e;// 找到 { 的indexfor (s = 0; s < keylen; s++){if (key[s] == '{') break;}// 沒(méi)找到就計(jì)算crc16()的值if (s == keylen) {return crc16(key,keylen) & 0x3FFF;}// 再往后面找 } 的indexfor (e = s+1; e < keylen; e++){if (key[e] == '}') break;}// 沒(méi)找到 } 或者{}之間為空,仍然計(jì)算crc16()的值if (e == keylen || e == s+1) {return crc16(key,keylen) & 0x3FFF;}// 獲取{}之間的字符串進(jìn)行crc16()計(jì)算return crc16(key+s+1,e-s-1) & 0x3FFF; }

總結(jié)

以上是生活随笔為你收集整理的redis反杀面试官之10问的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。