凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~
涼涼!面試阿里我被Redis技術(shù)專題給弄死了~
📚我本以為我可以像是別的博主一樣去阿里面試隨隨便便,因?yàn)镽edis,我直接被阿里大佬淦翻在地上
好了不裝了 沒(méi)過(guò)沒(méi)關(guān)系 我總結(jié)了一些這些最難的知識(shí)點(diǎn)!!!!然后自己總結(jié)歸類再去百度查詢了一些 最終得出這份Redis技術(shù)專題
題目開(kāi)淦
Redis集群的主從復(fù)制模型是怎樣的?
為了是在部分節(jié)點(diǎn)失敗或者大部分節(jié)點(diǎn)無(wú)法通信的情況下集群仍然可用,所以集群是用了主從復(fù)制模型,每個(gè)節(jié)點(diǎn)都會(huì)有N-1個(gè)復(fù)制品
Redis集群會(huì)有寫(xiě)操作丟失嗎?為什么?
Redis并不能保證數(shù)據(jù)強(qiáng)一致性,這意味著在實(shí)際中集群在特定的條件下可能會(huì)丟失寫(xiě)操作
Redis集群之間是如何復(fù)制的
異步復(fù)制
Redis如何做內(nèi)存優(yōu)化
盡可能使用散列表(hashes),散列表(是說(shuō)列表里面存儲(chǔ)的數(shù)少)使用的內(nèi)存非常小,所以你應(yīng)該盡可能的將你的數(shù)據(jù)模型抽象到一個(gè)散列表里面,比如你的web系統(tǒng)中有一個(gè)用戶對(duì)象,不要為這個(gè)用戶的名稱,姓氏,郵箱,密碼設(shè)置單獨(dú)的key,而是應(yīng)該把這個(gè)用戶所有信息存儲(chǔ)到一張散列表中
Redis回收進(jìn)程如何工作?
一個(gè)Client運(yùn)行了新的命令,添加了新的數(shù)據(jù),Redis會(huì)檢查內(nèi)存使用情況,如果大于maxmemory的限制,則根據(jù)設(shè)定好的策略進(jìn)行回收
Redis支持哪幾種常用數(shù)據(jù)類型?
- String(字符串)
- List(列表)
- Set(集合)
- Sorted Set(有序集合)
- hash(哈希表)
Redis 與 memcached 相比有哪些優(yōu)勢(shì)?(主要是Redis的優(yōu)勢(shì))
- 1.memcached所有的值均是簡(jiǎn)單的字符串,redis支持更為豐富的數(shù)據(jù)類型。
- 2.redis的速度比memcached快很多,redis的速度比memcached快很多(有爭(zhēng)議,考慮到Memache多線程可以充分利用多核,在考慮6.0后的Redis支持多線程,所以存在版本的概念)。
- 3.redis可以持久化其數(shù)據(jù)redis可以持久化其數(shù)據(jù),數(shù)據(jù)的可靠性和一致性更高。
- 4.redis單個(gè)key存儲(chǔ)的value可以達(dá)到1G而Memcache只有1M存儲(chǔ)大小。
- 5.redis對(duì)集群情況下的高可用支持的方案很多,所以集群情況下高可用更好。
- 6.針對(duì)于第一條的補(bǔ)充,包含功能場(chǎng)景的豐富化,比如,消息隊(duì)列、原子操作處 理(Lua腳本以及自增自減的操作)、事務(wù)機(jī)制和延時(shí)隊(duì)列機(jī)制等等功能。
- 7.采用的網(wǎng)絡(luò)模型非常好(epoll機(jī)制)擯棄給純內(nèi)存考慮,并且采用了內(nèi)部共享內(nèi)存池機(jī)制(可以復(fù)用內(nèi)存,惰性分配),采用單線程機(jī)制減少用戶態(tài)和內(nèi)核態(tài)的切換以及線程之間上下文的切換。
Redis 集群方案應(yīng)該怎么做?都有哪些方案?
- codis目前用的最多的集群方案,屬于一個(gè)基于服務(wù)端操作的負(fù)載均衡機(jī)制屬于代理后端服務(wù)實(shí)例的機(jī)制,可以支持1024的集群節(jié)點(diǎn),但它支持在節(jié)點(diǎn)數(shù)量改變情況下,舊節(jié)點(diǎn)數(shù)據(jù)可恢復(fù)到新hash(CRC32算法)節(jié)點(diǎn)。//加入Java開(kāi)發(fā)交流君樣:756584822一起吹水聊天
- twemproxy ,基本和codis一致的效果,但是對(duì)于節(jié)點(diǎn)變化的情況處理不是很好,所以性能方面來(lái)講依賴于twemproxy的節(jié)點(diǎn)的吞吐能力。
- redis cluster3.0 自帶的集群,特點(diǎn)在于他的分布式算法不是一致性hash,而是 hash槽(slot)的概念,以及自身支持節(jié)點(diǎn)設(shè)置從節(jié)點(diǎn),并且節(jié)點(diǎn)之間都有引用鏈接關(guān)系幫助定位hash槽的數(shù)據(jù),支持節(jié)點(diǎn)達(dá)到16384個(gè)節(jié)點(diǎn)。
(Redis)什么是緩存擊穿?如何避免?
高并發(fā)的系統(tǒng)中,大量的請(qǐng)求同時(shí)查詢一個(gè) key 時(shí),此時(shí)這個(gè)key正好失效了,就會(huì)導(dǎo)致大量的請(qǐng)求都打到數(shù)據(jù)庫(kù)上面去。這種現(xiàn)象我們稱為緩存擊穿。
📚如何避免?
- 1:在緩存失效后,通過(guò)加鎖或者隊(duì)列來(lái)控制讀數(shù)據(jù)庫(kù)寫(xiě)緩存的線程數(shù)量。比如對(duì)某個(gè) key 只允許一個(gè)線程查詢數(shù)據(jù)和寫(xiě)緩存,其他線程等待,等第一個(gè)線程查詢到了數(shù)據(jù),然后做緩存。后面的線程進(jìn)來(lái)發(fā)現(xiàn)已經(jīng)有緩存了,就直接走緩存。
- 2:做二級(jí)緩存,A1 為原始緩存,A2 為拷貝緩存,A1 失效時(shí),可以訪問(wèn) A2,A1 緩存失效時(shí)間設(shè)置為短期,A2 設(shè)置為長(zhǎng)期,犧牲一致性,提高可用性
- 3:設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過(guò)期(不推薦哦)。
Redis如何實(shí)現(xiàn)高可用呢?
Redis實(shí)現(xiàn)高可用主要有三種方式:主從復(fù)制、哨兵模式,以及 Redis 集群。
📚主從復(fù)制
將從前的一臺(tái) Redis 服務(wù)器,同步數(shù)據(jù)到多臺(tái)從 Redis 服務(wù)器上,即一主多從的模式,這個(gè)跟MySQL主從復(fù)制的原理一樣。
📚主從復(fù)制哨兵模式
使用 Redis 主從服務(wù)的時(shí)候,會(huì)有一個(gè)問(wèn)題,就是當(dāng) Redis 的主從服務(wù)器出現(xiàn)故障宕機(jī)時(shí),需要手動(dòng)進(jìn)行恢復(fù),為了解決這個(gè)問(wèn)題,Redis 增加了哨兵模式(因?yàn)樯诒J阶龅搅丝梢员O(jiān)控主從服務(wù)器,并且提供自動(dòng)容災(zāi)恢復(fù)的功能)。
📚Redis Cluster(集群)
Redis Cluster 是一種分布式去中心化的運(yùn)行模式,是在 Redis 3.0 版本中推出的 Redis 集群方案,它將數(shù)據(jù)分布在不同的服務(wù)器上,以此來(lái)降低系統(tǒng)對(duì)單主節(jié)點(diǎn)的依賴,從而提高 Redis 服務(wù)的讀寫(xiě)性能。
使用哨兵模式在數(shù)據(jù)上有副本數(shù)據(jù)做保證,在可用性上又有哨兵監(jiān)控,一旦master宕機(jī)會(huì)選舉slave節(jié)點(diǎn)為master節(jié)點(diǎn),這種已經(jīng)滿足了我們的生產(chǎn)環(huán)境需要,那為什么還需要使用集群模式呢?
哨兵模式歸根節(jié)點(diǎn)還是主從模式,在主從模式下我們可以通過(guò)增加slave節(jié)點(diǎn)來(lái)擴(kuò)展讀并發(fā)能力,但是沒(méi)辦法擴(kuò)展寫(xiě)能力和存儲(chǔ)能力,存儲(chǔ)能力只能是master節(jié)點(diǎn)能夠承載的上限。所以為了擴(kuò)展寫(xiě)能力和存儲(chǔ)能力,我們就需要引入集群模式。
Redis為何那么快???
Redis的快速很多人都知道是因?yàn)榛趦?nèi)存,但這只是一方面,其實(shí)redis在底層是一套很完善的多路復(fù)用事件處理機(jī)制來(lái)保證執(zhí)行的高效的
線程模型
redis內(nèi)部使用文件事件處理器file event handler,它包含如下幾個(gè)部分
- 多個(gè)socket
- IO多路復(fù)用程序
- 文件事件分派器
- 事件處理器(連接應(yīng)答處理器,命令請(qǐng)求處理器,命令回復(fù)處理器)
之所以說(shuō)redis是單線程其實(shí)是指這個(gè)文件事件處理器是單線程的,它采用多路復(fù)用的方式監(jiān)聽(tīng)系統(tǒng)上多個(gè)socket,將socket上產(chǎn)生的事件壓入隊(duì)列中,由文件事件分派器從隊(duì)列中取出一個(gè)socket根據(jù)事件類型發(fā)給相應(yīng)的事件處理器
整個(gè)處理過(guò)程如圖:
處理過(guò)程可以分為以下幾個(gè)步驟:
- 客戶端向redis發(fā)起一個(gè)socket請(qǐng)求,向redis的server socket請(qǐng)求連接,這里命名為socket01
- server socket產(chǎn)生一個(gè)AE_READABLE事件,IO多路復(fù)用程序監(jiān)聽(tīng)到事件后將這個(gè)socket01壓入隊(duì)列
- 文件事件分派器從隊(duì)列中取出socket01,交給連接應(yīng)答處理器
- 連接應(yīng)答處理器會(huì)將socket01的AE_READABLE事件與命令請(qǐng)求處理器相關(guān)聯(lián)
- 假設(shè)客戶端執(zhí)行set操作,這時(shí)命令請(qǐng)求處理器會(huì)從socket01讀取key value,在內(nèi)存中完成key value的設(shè)置
- 在內(nèi)存中完成設(shè)置后,會(huì)將socket01的AE_WRITEABLE事件與命令回復(fù)處理器相關(guān)聯(lián),然后壓入隊(duì)列中
- 事件分派器拿到socket01后,交給命令回復(fù)處理器,由命令回復(fù)處理器向socket01寫(xiě)入本次操作的結(jié)果,比如OK,之后解除關(guān)聯(lián)
以上就是一個(gè)命令在redis中執(zhí)行的過(guò)程
總結(jié)一下效率高的原因
- 內(nèi)存操作
- IO多路復(fù)用機(jī)制,減少了阻塞
- 單線程避免了線程切換的開(kāi)銷(xiāo)和競(jìng)爭(zhēng)問(wèn)題
- 最最根本的redis是用C語(yǔ)言寫(xiě)的,本來(lái)就直接跟操作系統(tǒng)交互,命令執(zhí)行快得飛起
總結(jié)
以上是生活随笔為你收集整理的凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 社保多少岁可以领?
- 下一篇: 超详细图解!【MySQL进阶篇】MySQ