一、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ì)被移除。
擴(kuò)展閱讀
企業(yè)面試中關(guān)于MYSQL重點(diǎn)的28道面試題解答