京東二面:Redis為什么這么快?

課代表總結(jié)了Redis的信息??????
視頻內(nèi)容:
1??為什么Redis速度快??
2??Redis為何選擇單線程呢???
3??Redis應(yīng)用場(chǎng)景有哪些????
4??Redis 怎么實(shí)現(xiàn)消息隊(duì)列???
5??Redis主從復(fù)制的原理???
6??刪除策略??
視頻內(nèi)容:
1??為什么Redis速度快??
基于內(nèi)存:Redis是使用內(nèi)存存儲(chǔ),沒有磁盤IO上的開銷。數(shù)據(jù)存在內(nèi)存中,讀寫速度快。
單線程實(shí)現(xiàn)( Redis 6.0以前): Redis使用單個(gè)線程處理請(qǐng)求,避免了多個(gè)線程之間線程切換和鎖資源爭(zhēng)用的開銷。
IO多路復(fù)用模型:Redis采用IO多路復(fù)用技術(shù)。Redis 使用單線程來(lái)輪詢描述符,將數(shù)據(jù)庫(kù)的操作都轉(zhuǎn)換成了事件,不在網(wǎng)絡(luò)lO上浪費(fèi)過(guò)多的時(shí)間。

2??Redis為何選擇單線程呢???

1、單線程實(shí)現(xiàn)可以避免過(guò)多的上下文切換開銷。程序始終運(yùn)行在進(jìn)程中單個(gè)線程內(nèi),沒有多線程切換的場(chǎng)景。
2、避免同步機(jī)制的開銷。如果Redis選擇多線程模型,需要考慮數(shù)據(jù)同步的問(wèn)題,則必然會(huì)引入某些同步機(jī)制,會(huì)導(dǎo)致在操作數(shù)據(jù)過(guò)程中帶來(lái)更多的開銷,增加程序復(fù)雜度的同時(shí)還會(huì)降低性能。
3、實(shí)現(xiàn)簡(jiǎn)單,方便維護(hù)。如果Redis使用多線程模式,那么所有的底層數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)都必須考慮線程安全問(wèn)題,那么Redis的實(shí)現(xiàn)將會(huì)變得更加復(fù)雜。
3??Redis應(yīng)用場(chǎng)景有哪些????
1、緩存熱點(diǎn)數(shù)據(jù),緩解數(shù)據(jù)庫(kù)的壓力。
2、利用Redis 原子性的自增操作,可以實(shí)現(xiàn)計(jì)數(shù)器的功能,比如統(tǒng)計(jì)用戶點(diǎn)贊數(shù)、用戶訪問(wèn)數(shù)等。
3、作為簡(jiǎn)單的消息隊(duì)列,實(shí)現(xiàn)異步操作。
4、限速器,可用于限制某個(gè)用戶訪問(wèn)某個(gè)接口的頻率,比如秒殺場(chǎng)景用于防止用戶快速點(diǎn)擊帶來(lái)不必要的壓力。
5、好友關(guān)系,利用集合的一些命令,比如交集、并集、差集等,實(shí)現(xiàn)共同好友、共同愛好之類的功能。

4??Redis 怎么實(shí)現(xiàn)消息隊(duì)列???
1、使用列表,讓生產(chǎn)者將任務(wù)使用LPUSH命令放進(jìn)列表,消費(fèi)者不斷用RPOP從列表取出任務(wù)。
2、發(fā)布訂閱模式。類似于MQ的主題模式。只能消費(fèi)訂閱之后發(fā)布的消息,一個(gè)消息可以被多個(gè)訂閱者消費(fèi)。
3、延時(shí)隊(duì)列。使用sortedset,拿時(shí)間戳作為score,消息內(nèi)容作為key,調(diào)用zadd來(lái)生產(chǎn)消息,消費(fèi)者用`zrangebyscore`指令獲取N秒之前的數(shù)據(jù)輪詢進(jìn)行處理。

5??Redis主從復(fù)制的原理???
Redis的復(fù)制功能是支持多個(gè)數(shù)據(jù)庫(kù)之間的數(shù)據(jù)同步。主數(shù)據(jù)庫(kù)可以進(jìn)行讀寫操作,當(dāng)主數(shù)據(jù)庫(kù)的數(shù)據(jù)發(fā)生變化時(shí)會(huì)自動(dòng)將數(shù)據(jù)同步到從數(shù)據(jù)庫(kù)。從數(shù)據(jù)庫(kù)一般是只讀的,它會(huì)接收主數(shù)據(jù)庫(kù)同步過(guò)來(lái)的數(shù)據(jù)。

6??刪除策略??
1、被動(dòng)刪除。在訪問(wèn)key時(shí),如果發(fā)現(xiàn)key已經(jīng)過(guò)期,那么會(huì)將key刪除。
2、主動(dòng)刪除。定時(shí)清理key,每次清理會(huì)依次遍歷所有DB,從db隨機(jī)取出20個(gè)key,如果過(guò)期就刪除,如果其中有5個(gè)key過(guò)期,那么就繼續(xù)對(duì)這個(gè)db進(jìn)行清理,否則開始清理下一個(gè)db。
3、內(nèi)存不夠時(shí)清理。Redis有最大內(nèi)存的限制,通過(guò)maxmemory參數(shù)可以設(shè)置最大內(nèi)存,當(dāng)使用的內(nèi)存超過(guò)了設(shè)置的最大內(nèi)存,就要進(jìn)行內(nèi)存釋放,在進(jìn)行內(nèi)存釋放的時(shí)候,會(huì)按照配置的淘汰策略清理內(nèi)存。
