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