一、memcached與redis的區(qū)別?
1.存儲(chǔ)方式不同。memcached把數(shù)據(jù)全部存在內(nèi)存之中,斷電之后會(huì)掛掉,而redis雖然也用到了內(nèi)存,但是會(huì)有部分?jǐn)?shù)據(jù)存在硬盤中,保證數(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è)置過期時(shí)間的數(shù)據(jù)集中,挑選最近最少使用的數(shù)據(jù)淘汰。
2.volatile-ttl:從已經(jīng)設(shè)置過期時(shí)間的數(shù)據(jù)集中,挑選即將要過期的數(shù)據(jù)淘汰。
3.volatile-random:從已經(jīng)設(shè)置過期時(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á)到最快的讀寫速度,將數(shù)據(jù)都讀到內(nèi)存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。如果不將數(shù)據(jù)放在內(nèi)存中,磁盤IO速度會(huì)嚴(yán)重影響redis的性能。
四、redis的并發(fā)競(jìng)爭(zhēng)問題如何解決?
首先redis為單進(jìn)程單線程模式,采用隊(duì)列模式將并發(fā)訪問變?yōu)榇性L問。redis本身時(shí)沒有鎖的概念的,redis對(duì)多個(gè)客戶端連接并不存在競(jìng)爭(zhēng),但是在Jedis客戶端對(duì)redis進(jìn)行并發(fā)訪問時(shí)會(huì)產(chǎn)生一系列問題,這些問題時(shí)由于客戶端連接混亂造成的。有兩種方案解決。
1.在客戶端,對(duì)連接進(jìn)行池化,同時(shí)對(duì)客戶端讀寫redis操作采用內(nèi)部鎖synchronized。
2.在服務(wù)器角度,利用setnx實(shí)現(xiàn)鎖。
五、redis過期鍵的刪除策略?
1.定時(shí)刪除:在設(shè)置鍵的過期時(shí)間的同時(shí),創(chuàng)建一個(gè)timer,讓定時(shí)器在鍵的過期時(shí)間到達(dá)時(shí),立即執(zhí)行對(duì)鍵的刪除操作。(主動(dòng)刪除)
對(duì)內(nèi)存友好,但是對(duì)cpu時(shí)間不友好,有較多過期鍵的而情況下,刪除過期鍵會(huì)占用相當(dāng)一部分cpu時(shí)間。
2.惰性刪除:放任過期鍵不管,但是每次從鍵空間中獲取鍵時(shí),都檢查取到的鍵是否過去,如果過期就刪除,如果沒過期就返回該鍵。(被動(dòng)刪除)
對(duì)cpu時(shí)間友好,程序只會(huì)在取出鍵的時(shí)候才會(huì)對(duì)鍵進(jìn)行過期檢查,這不會(huì)在刪除其他無關(guān)過期鍵上花費(fèi)任何cpu時(shí)間,但是如果一個(gè)鍵已經(jīng)過期,而這個(gè)鍵又保留在數(shù)據(jù)庫(kù)中,那么只要這個(gè)過期鍵不被刪除,他所占用的內(nèi)存就不會(huì)釋放,對(duì)內(nèi)存不友好。
3.定期刪除:每隔一段時(shí)間就對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次檢查,刪除里面的過期鍵。(主動(dòng)刪除)
采用對(duì)內(nèi)存和cpu時(shí)間折中的方法,每個(gè)一段時(shí)間執(zhí)行一次刪除過期鍵操作,并通過限制操作執(zhí)行的時(shí)長(zhǎng)和頻率來減少對(duì)cpu時(shí)間的影響。難點(diǎn)在于,選擇一個(gè)好的策略來設(shè)置刪除操作的時(shí)長(zhǎng)和執(zhí)行頻率。
六、redis與一般db的同步過程?
有兩種方式。
第一種,先去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讀取出來,找到數(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í)間超過 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.若沒有足夠數(shù)量的 Sentinel 同意 Master 已經(jīng)下線, Master 的客觀下線狀態(tài)就會(huì)被移除。若 Master 重新向 Sentinel 的 PING 命令返回有效回復(fù), Master 的主觀下線狀態(tài)就會(huì)被移除。
擴(kuò)展閱讀
企業(yè)面試中關(guān)于MYSQL重點(diǎn)的28道面試題解答