Redis常見(jiàn)面試題

Redis常見(jiàn)面試題

一、memcached與redis的區(qū)別?

  1.存儲(chǔ)方式不同。memcached把數(shù)據(jù)全部存在內(nèi)存之中,斷電之后會(huì)掛掉,而redis雖然也用到了內(nèi)存,但是會(huì)有部分?jǐn)?shù)據(jù)存在硬盤(pán)中,保證數(shù)據(jù)持久性。

  2.數(shù)據(jù)支持類型不同。memcached對(duì)數(shù)據(jù)支持比較簡(jiǎn)單,而redis支持?jǐn)?shù)據(jù)類型較豐富,如string、list、set、sorted set、hash。

  3.底層實(shí)現(xiàn)不同。一般調(diào)用系統(tǒng)函數(shù),會(huì)消耗比較多的時(shí)間去請(qǐng)求,redis自己構(gòu)建了vm,速度會(huì)更快。

二、redis數(shù)據(jù)的淘汰策略?

  1.volatile-lru:從已經(jīng)設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中,挑選最近最少使用的數(shù)據(jù)淘汰。

  2.volatile-ttl:從已經(jīng)設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中,挑選即將要過(guò)期的數(shù)據(jù)淘汰。

  3.volatile-random:從已經(jīng)設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中,隨機(jī)挑選數(shù)據(jù)淘汰。

  4.allkeys-lru:從所有的數(shù)據(jù)集中,挑選最近最少使用的數(shù)據(jù)淘汰。

  5.allkeys-random:從所有的數(shù)據(jù)集中,隨機(jī)挑選數(shù)據(jù)淘汰。

  6。no-enviction:禁止淘汰數(shù)據(jù)。

三、為什么redis把所有數(shù)據(jù)都放到內(nèi)存中?

  redis為了達(dá)到最快的讀寫(xiě)速度,將數(shù)據(jù)都讀到內(nèi)存中,并通過(guò)異步的方式將數(shù)據(jù)寫(xiě)入磁盤(pán)。如果不將數(shù)據(jù)放在內(nèi)存中,磁盤(pán)IO速度會(huì)嚴(yán)重影響redis的性能。

四、redis的并發(fā)競(jìng)爭(zhēng)問(wèn)題如何解決?

  首先redis為單進(jìn)程單線程模式,采用隊(duì)列模式將并發(fā)訪問(wèn)變?yōu)榇性L問(wèn)。redis本身時(shí)沒(méi)有鎖的概念的,redis對(duì)多個(gè)客戶端連接并不存在競(jìng)爭(zhēng),但是在Jedis客戶端對(duì)redis進(jìn)行并發(fā)訪問(wèn)時(shí)會(huì)產(chǎn)生一系列問(wèn)題,這些問(wèn)題時(shí)由于客戶端連接混亂造成的。有兩種方案解決。

  1.在客戶端,對(duì)連接進(jìn)行池化,同時(shí)對(duì)客戶端讀寫(xiě)redis操作采用內(nèi)部鎖synchronized。

  2.在服務(wù)器角度,利用setnx實(shí)現(xiàn)鎖。

五、redis過(guò)期鍵的刪除策略?

  1.定時(shí)刪除:在設(shè)置鍵的過(guò)期時(shí)間的同時(shí),創(chuàng)建一個(gè)timer,讓定時(shí)器在鍵的過(guò)期時(shí)間到達(dá)時(shí),立即執(zhí)行對(duì)鍵的刪除操作。(主動(dòng)刪除)

    對(duì)內(nèi)存友好,但是對(duì)cpu時(shí)間不友好,有較多過(guò)期鍵的而情況下,刪除過(guò)期鍵會(huì)占用相當(dāng)一部分cpu時(shí)間。

  2.惰性刪除:放任過(guò)期鍵不管,但是每次從鍵空間中獲取鍵時(shí),都檢查取到的鍵是否過(guò)去,如果過(guò)期就刪除,如果沒(méi)過(guò)期就返回該鍵。(被動(dòng)刪除)

    對(duì)cpu時(shí)間友好,程序只會(huì)在取出鍵的時(shí)候才會(huì)對(duì)鍵進(jìn)行過(guò)期檢查,這不會(huì)在刪除其他無(wú)關(guān)過(guò)期鍵上花費(fèi)任何cpu時(shí)間,但是如果一個(gè)鍵已經(jīng)過(guò)期,而這個(gè)鍵又保留在數(shù)據(jù)庫(kù)中,那么只要這個(gè)過(guò)期鍵不被刪除,他所占用的內(nèi)存就不會(huì)釋放,對(duì)內(nèi)存不友好。

  3.定期刪除:每隔一段時(shí)間就對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次檢查,刪除里面的過(guò)期鍵。(主動(dòng)刪除)

    采用對(duì)內(nèi)存和cpu時(shí)間折中的方法,每個(gè)一段時(shí)間執(zhí)行一次刪除過(guò)期鍵操作,并通過(guò)限制操作執(zhí)行的時(shí)長(zhǎng)和頻率來(lái)減少對(duì)cpu時(shí)間的影響。難點(diǎn)在于,選擇一個(gè)好的策略來(lái)設(shè)置刪除操作的時(shí)長(zhǎng)和執(zhí)行頻率。

六、redis與一般db的同步過(guò)程?

  有兩種方式。

  第一種,先去redis中判斷數(shù)據(jù)是否存在,如果存在,則直接返回緩存好的數(shù)據(jù),如果不存在,去db中讀取數(shù)據(jù),并把數(shù)據(jù)緩存一份到redis中。適用與數(shù)據(jù)里比較大,但是不經(jīng)常更新的情況,如用戶排行。

  第二種,先去redis中判斷數(shù)據(jù)是否存在,如果存在,則直接更新對(duì)應(yīng)數(shù)據(jù)(這一步會(huì)記錄下更新的key,并把更新后的數(shù)據(jù)返回給頁(yè)面,如果不存在,先去數(shù)據(jù)庫(kù)中更新內(nèi)容,然后把數(shù)據(jù)保存一份到redis中。再往后,后臺(tái)會(huì)進(jìn)行一系列操作,把redis中更新的key讀取出來(lái),找到數(shù)據(jù)庫(kù)中對(duì)應(yīng)的數(shù)據(jù),并更新數(shù)據(jù)庫(kù)。這種方式是把redis當(dāng)作數(shù)據(jù)庫(kù)使用,適合大數(shù)據(jù)的頻繁變動(dòng)。但是對(duì)redis的依賴很大,要做好掛掉之后的數(shù)據(jù)備份。

  七、簡(jiǎn)述redis的哨兵模式

  哨兵是對(duì)redis進(jìn)行實(shí)時(shí)的監(jiān)控,主要有兩個(gè)功能。

  1.監(jiān)測(cè)主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)是否正常運(yùn)行。2.當(dāng)主數(shù)據(jù)庫(kù)出現(xiàn)故障的時(shí)候,可以自動(dòng)將一個(gè)從數(shù)據(jù)庫(kù)轉(zhuǎn)換為主數(shù)據(jù)庫(kù),實(shí)現(xiàn)自動(dòng)切換。

八、redis的哨兵的監(jiān)控機(jī)制是怎樣的?

  哨兵監(jiān)控也是有集群的,會(huì)有多個(gè)哨兵進(jìn)行監(jiān)控,當(dāng)判斷發(fā)生故障的哨兵達(dá)到一定數(shù)量的時(shí)候才進(jìn)行修復(fù)。一個(gè)健壯的部署至少需要三個(gè)哨兵實(shí)例。

每個(gè)Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實(shí)例發(fā)送一個(gè) PING 命令?

  2.如果一個(gè)實(shí)例(instance)距離最后一次有效回復(fù) PING 命令的時(shí)間超過(guò) down-after-milliseconds 選項(xiàng)所指定的值, 則這個(gè)實(shí)例會(huì)被 Sentinel 標(biāo)記為主觀下線。

  3.如果一個(gè)Master被標(biāo)記為主觀下線,則正在監(jiān)視這個(gè)Master的所有 Sentinel 要以每秒一次的頻率確認(rèn)Master的確進(jìn)入了主觀下線狀態(tài)。

  4.當(dāng)有足夠數(shù)量的 Sentinel(大于等于配置文件指定的值)在指定的時(shí)間范圍內(nèi)確認(rèn)Master的確進(jìn)入了主觀下線狀態(tài), 則Master會(huì)被標(biāo)記為客觀下線?

  5.在一般情況下, 每個(gè) Sentinel 會(huì)以每 10 秒一次的頻率向它已知的所有Master,Slave發(fā)送 INFO 命令?

  6.當(dāng)Master被 Sentinel 標(biāo)記為客觀下線時(shí),Sentinel 向下線的 Master 的所有 Slave 發(fā)送 INFO 命令的頻率會(huì)從 10 秒一次改為每秒一次?

  7.若沒(méi)有足夠數(shù)量的 Sentinel 同意 Master 已經(jīng)下線, Master 的客觀下線狀態(tài)就會(huì)被移除。若 Master 重新向 Sentinel 的 PING 命令返回有效回復(fù), Master 的主觀下線狀態(tài)就會(huì)被移除。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、memcached與redis的區(qū)別? 1.存儲(chǔ)方式不同。memcached把數(shù)據(jù)全部存在內(nèi)存之中,斷電之后會(huì)...
    程序員BUG閱讀 1,185評(píng)論 1 41
  • 介紹:Redis 是一個(gè)開(kāi)源的使用 ANSI C 語(yǔ)言編寫(xiě)、遵守 BSD 協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日...
    李明燚閱讀 290評(píng)論 0 0
  • 標(biāo)簽: redis 緩存 主從 哨兵 集群 本文簡(jiǎn)單的介紹redis三種模式在linux的安裝部署和數(shù)據(jù)存儲(chǔ)的總結(jié)...
    luhanlin閱讀 4,488評(píng)論 0 5
  • 十年耕讀苦, 寒梅傲雪芬; 揮筆書(shū)穎慧, 金甲賜才人; 寶鑰開(kāi)靈庫(kù), 一躍跳龍門(mén)。
    芬芳的漣漪閱讀 2,798評(píng)論 63 91
  • 忠于自己,表達(dá)自己,做好自己。 這話從公眾號(hào)《定投十年賺十倍》文章中看到,第一次看到不以為然,后面慢慢感悟到這句話...
    方熾閱讀 654評(píng)論 0 0

友情鏈接更多精彩內(nèi)容