Redis緩存那點(diǎn)破事 | 絕殺面試官 25 問!
時(shí)間:2021-10-21 14:37:34
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]為了便于大家查找問題,了解全貌,整理個(gè)目錄,我們可以快速全局了解關(guān)于Redis緩存,面試官一般喜歡問哪些問題?接下來(lái),我們逐條來(lái)看看每個(gè)問題及答案Redis有哪些特性?答案:性能高,讀的速度是100000次/s,寫的速度是80000次/s數(shù)據(jù)持久化,支持RDB、AOF支持事務(wù)。通...
為了便于大家查找問題,了解全貌,整理個(gè)目錄,我們可以快速全局了解關(guān)于Redis 緩存,面試官一般喜歡問哪些問題?
接下來(lái),我們逐條來(lái)看看每個(gè)問題及答案
Redis 有哪些特性?答案:
Redis 為什么這么快?答案:
Redis 底層的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)有哪些?答案:
Redis 支持哪些數(shù)據(jù)類型?答案:五種常用數(shù)據(jù)類型:
Redis 常用的 5 種數(shù)據(jù)結(jié)構(gòu)和應(yīng)用場(chǎng)景?答案:
為什么采用單線程?答案:官方回復(fù),CPU不會(huì)成為Redis的制約瓶頸,Redis主要受內(nèi)存、網(wǎng)絡(luò)限制。例如,在一個(gè)普通的 Linux 系統(tǒng)上,使用pipelining 可以每秒傳遞 100 萬(wàn)個(gè)請(qǐng)求,所以如果您的應(yīng)用程序主要使用 O(N) 或 O(log(N)) 命令,則幾乎不會(huì)使用太多 CPU,屬于IO密集型系統(tǒng)。
Redis 6.0 之后又改用多線程呢?答案:Redis的多線程主要是處理數(shù)據(jù)的讀寫、協(xié)議解析。執(zhí)行命令還是采用單線程順序執(zhí)行。主要是因?yàn)閞edis的性能瓶頸在于網(wǎng)絡(luò)IO而非CPU,使用多線程進(jìn)行一些周邊預(yù)處理,提升了IO的讀寫效率,從而提高了整體的吞吐量。antirez 在 RedisConf 2019 分享時(shí)提到,Redis 6 引入的多線程 IO 對(duì)性能提升至少一倍以上。
過期鍵Key 的刪除策略有哪些?答案:有3種過期刪除策略。惰性刪除、定期刪除、定時(shí)刪除
如果Redis的內(nèi)存空間不足,淘汰機(jī)制?答案:
Redis 突然掛了怎么解決?答案:1、從系統(tǒng)可用性角度思考,Redis Cluster引入主備機(jī)制,當(dāng)主節(jié)點(diǎn)掛了后,自動(dòng)切換到備用節(jié)點(diǎn),繼續(xù)提供服務(wù)。2、Client端引入本地緩存,通過開關(guān)切換,避免Redis突然掛掉,高并發(fā)流量把數(shù)據(jù)庫(kù)打掛。
Redis 持久化有哪些方式?答案:1、快照RDB。將某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)庫(kù)狀態(tài)保存到
Redis 常用場(chǎng)景答案:
Redis 緩存要注意的七大經(jīng)典問題?答案:列舉了億級(jí)系統(tǒng),高訪問量情況下Redis緩存可能會(huì)遇到哪些問題?以及對(duì)應(yīng)的解決方案。
Redis 集群方案有哪幾種?答案:
Redis 主從數(shù)據(jù)同步(主從復(fù)制)的過程?答案:
主從復(fù)制的優(yōu)缺點(diǎn)?答案:1、優(yōu)點(diǎn):
Sentinel(哨兵)模式的優(yōu)缺點(diǎn)?答案:哨兵模式基于主從復(fù)制模式,增加了哨兵來(lái)監(jiān)控與自動(dòng)處理故障。1、優(yōu)點(diǎn):
Redis Cluster 模式的優(yōu)缺點(diǎn)?答案:實(shí)現(xiàn)了Redis的分布式存儲(chǔ),即每臺(tái)節(jié)點(diǎn)存儲(chǔ)不同的內(nèi)容,來(lái)解決在線擴(kuò)容的問題。1、優(yōu)點(diǎn):
Redis 如何做擴(kuò)容?答案:為了避免數(shù)據(jù)遷移失效,通常使用
Redis 的集群原理?答案:一個(gè)redis集群由多個(gè)節(jié)點(diǎn)node組成,而多個(gè)node之間通過
Redis 如何做到高可用?答案:哨兵機(jī)制。具有自動(dòng)故障轉(zhuǎn)移、集群監(jiān)控、消息通知等功能。哨兵可以同時(shí)監(jiān)視所有的主、從服務(wù)器,當(dāng)某個(gè)master下線時(shí),自動(dòng)提升對(duì)應(yīng)的slave為master,然后由新master對(duì)外提供服務(wù)。
什么是 Redis 事務(wù)?答案:Redis事務(wù)是一組命令的集合,將多個(gè)命令打包,然后把這些命令按順序添加到隊(duì)列中,并且按順序執(zhí)行這些命令。Redis事務(wù)中沒有像Mysql關(guān)系型數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別的概念,不能保證原子性操作,也沒有像Mysql那樣執(zhí)行事務(wù)失敗會(huì)進(jìn)行回滾操作
Redis 事務(wù)執(zhí)行流程?答案:通過
Redis 與 Guava 、Caffeine 有什么區(qū)別?答案:緩存分為本地緩存和分布式緩存。1、Caffeine、Guava,屬于本地緩存,特點(diǎn):
如何實(shí)現(xiàn)一個(gè)分布式鎖?答案:
接下來(lái),我們逐條來(lái)看看每個(gè)問題及答案
Redis 有哪些特性?答案:
- 性能高, 讀的速度是100000次/s,寫的速度是80000次/s
- 數(shù)據(jù)持久化,支持RDB 、AOF
- 支持事務(wù)。通過
MULTI
和EXEC
指令包起來(lái)。 - 多種數(shù)據(jù)結(jié)構(gòu)類型
- 主從復(fù)制
- 其他特性:發(fā)布/訂閱、通知、key過期等
Redis 為什么這么快?答案:
- 完全基于內(nèi)存,沒有磁盤IO上的開銷,異步持久化除外
- 單線程,避免多個(gè)線程切換的性能損耗
- 非阻塞的IO多路復(fù)用機(jī)制
- 底層的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)優(yōu)化,使用原生的數(shù)據(jù)結(jié)構(gòu)提升性能。
Redis 底層的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)有哪些?答案:
- 字符串。沒有采用C語(yǔ)言的傳統(tǒng)字符串,而是自己實(shí)現(xiàn)的一個(gè)簡(jiǎn)單動(dòng)態(tài)字符串SDS的抽象類型,并保存了長(zhǎng)度信息。
- 鏈表(linkedlist)。雙向無(wú)環(huán)鏈表結(jié)構(gòu),每個(gè)鏈表的節(jié)點(diǎn)由一個(gè)listNode結(jié)構(gòu)來(lái)表示,每個(gè)節(jié)點(diǎn)都有前置和后置節(jié)點(diǎn)的指針
- 字典(hashtable)。保存鍵值對(duì)的抽象數(shù)據(jù)結(jié)構(gòu),底層使用hash表,每個(gè)字典帶有兩個(gè)hash表,供平時(shí)使用和rehash時(shí)使用。
- 跳躍表(skiplist)。跳躍表是有序集合的底層實(shí)現(xiàn)之一。redis跳躍表由zskiplist和zskiplistNode組成,zskiplist用于保存跳躍表 信息(表頭、表尾節(jié)點(diǎn)、?度等),zskiplistNode用于表示表跳躍節(jié)點(diǎn),每個(gè)跳躍表的層高都是1- 32的隨機(jī)數(shù),在同一個(gè)跳躍表中,多個(gè)節(jié)點(diǎn)可以包含相同的分值,但是每個(gè)節(jié)點(diǎn)的成員對(duì)象必須是唯一的,節(jié)點(diǎn)按照分值大小排序,如果分值相同,則按照成員對(duì)象的大小排序。
- 整數(shù)集合(intset)。用于保存整數(shù)值的集合抽象數(shù)據(jù)結(jié)構(gòu),不會(huì)出現(xiàn)重復(fù)元素,底層實(shí)現(xiàn)為數(shù)組。
- 壓縮列表(ziplist)。為節(jié)約內(nèi)存而開發(fā)的順序性數(shù)據(jù)結(jié)構(gòu),可以包含多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或者整數(shù)值。
Redis 支持哪些數(shù)據(jù)類型?答案:五種常用數(shù)據(jù)類型:
String
、Hash
、Set
、List
、SortedSet
。三種特殊的數(shù)據(jù)類型:Bitmap
、HyperLogLog
、Geospatial
,其中Bitmap 、HyperLogLog的底層都是 String 數(shù)據(jù)類型,Geospatial 底層是 Sorted Set 數(shù)據(jù)類型。- 字符串對(duì)象string:int整數(shù)、embstr編碼的簡(jiǎn)單動(dòng)態(tài)字符串、raw簡(jiǎn)單動(dòng)態(tài)字符串
- 列表對(duì)象list:ziplist、linkedlist
- 哈希對(duì)象hash:ziplist、hashtable
- 集合對(duì)象set:intset、hashtable
- 有序集合對(duì)象zset:ziplist、skiplist
Redis 常用的 5 種數(shù)據(jù)結(jié)構(gòu)和應(yīng)用場(chǎng)景?答案:
- String:緩存、計(jì)數(shù)器、分布式鎖等
- List:鏈表、隊(duì)列、微博關(guān)注人時(shí)間軸列表等
- Hash:用戶信息、Hash 表等
- Set:去重、贊、踩、共同好友等
- Zset:訪問量排行榜、點(diǎn)擊量排行榜等
為什么采用單線程?答案:官方回復(fù),CPU不會(huì)成為Redis的制約瓶頸,Redis主要受內(nèi)存、網(wǎng)絡(luò)限制。例如,在一個(gè)普通的 Linux 系統(tǒng)上,使用pipelining 可以每秒傳遞 100 萬(wàn)個(gè)請(qǐng)求,所以如果您的應(yīng)用程序主要使用 O(N) 或 O(log(N)) 命令,則幾乎不會(huì)使用太多 CPU,屬于IO密集型系統(tǒng)。
Redis 6.0 之后又改用多線程呢?答案:Redis的多線程主要是處理數(shù)據(jù)的讀寫、協(xié)議解析。執(zhí)行命令還是采用單線程順序執(zhí)行。主要是因?yàn)閞edis的性能瓶頸在于網(wǎng)絡(luò)IO而非CPU,使用多線程進(jìn)行一些周邊預(yù)處理,提升了IO的讀寫效率,從而提高了整體的吞吐量。antirez 在 RedisConf 2019 分享時(shí)提到,Redis 6 引入的多線程 IO 對(duì)性能提升至少一倍以上。
過期鍵Key 的刪除策略有哪些?答案:有3種過期刪除策略。惰性刪除、定期刪除、定時(shí)刪除
- 惰性刪除。使用key時(shí)才進(jìn)行檢查,如果已經(jīng)過期,則刪除。缺點(diǎn):過期的key如果沒有被訪問到,一直無(wú)法刪除,一直占用內(nèi)存,造成空間浪費(fèi)。
- 定期刪除。每隔一段時(shí)間做一次檢查,刪除過期的key,每次只是隨機(jī)取一些key去檢查。
- 定時(shí)刪除。為每個(gè)key設(shè)置過期時(shí)間,同時(shí)創(chuàng)建一個(gè)定時(shí)器。一旦到期,立即執(zhí)行刪除。缺點(diǎn):如果過期鍵比較多時(shí),占用CPU較多,對(duì)服務(wù)的性能有很大影響。
如果Redis的內(nèi)存空間不足,淘汰機(jī)制?答案:
- volatile-lru:從已設(shè)置過期時(shí)間的key中,移出最近最少使用的key進(jìn)行淘汰
- allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,移除最近最少使用的key(這個(gè)是最常用的)
- volatile-ttl:從已設(shè)置過期時(shí)間的key中,移出將要過期的key
- volatile-random:從已設(shè)置過期時(shí)間的key中,隨機(jī)選擇key淘汰
- allkeys-random:從key中隨機(jī)選擇key進(jìn)行淘汰
- no-eviction:禁止淘汰數(shù)據(jù)。當(dāng)內(nèi)存達(dá)到閾值的時(shí)候,新寫入操作報(bào)錯(cuò)
- volatile-lfu:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最不經(jīng)常使用的數(shù)據(jù)淘汰(LFU(Least Frequently Used)算法,也就是最頻繁被訪問的數(shù)據(jù)將來(lái)最有可能被訪問到)
- allkeys-lfu:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,移除最不經(jīng)常使用的key。
Redis 突然掛了怎么解決?答案:1、從系統(tǒng)可用性角度思考,Redis Cluster引入主備機(jī)制,當(dāng)主節(jié)點(diǎn)掛了后,自動(dòng)切換到備用節(jié)點(diǎn),繼續(xù)提供服務(wù)。2、Client端引入本地緩存,通過開關(guān)切換,避免Redis突然掛掉,高并發(fā)流量把數(shù)據(jù)庫(kù)打掛。
Redis 持久化有哪些方式?答案:1、快照RDB。將某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)庫(kù)狀態(tài)保存到
RDB文件
中,RDB文件是一個(gè)壓縮的二進(jìn)制文件,保存在磁盤上。當(dāng)Redis崩潰時(shí),可用于恢復(fù)數(shù)據(jù)。通過SAVE
或BGSAVE
來(lái)生成RDB文件。- SAVE:會(huì)阻塞redis進(jìn)程,直到RDB文件創(chuàng)建完畢,在進(jìn)程阻塞期間,redis不能處理任何命令請(qǐng)求。
- BGSAVE:會(huì)fork出一個(gè)子進(jìn)程,然后由子進(jìn)程去負(fù)責(zé)生成RDB文件,父進(jìn)程還可以繼續(xù)處理命令請(qǐng)求,不會(huì)阻塞進(jìn)程。
Redis 常用場(chǎng)景答案:
- 1、緩存,有句話說的好,「性能不夠,緩存來(lái)湊」
- 2、分布式鎖,利用Redis 的 setnx
- 3、分布式session
- 4、計(jì)數(shù)器,通過incr命令
- 5、排行榜,Redis 的 有序集合
- 6、其他
Redis 緩存要注意的七大經(jīng)典問題?答案:列舉了億級(jí)系統(tǒng),高訪問量情況下Redis緩存可能會(huì)遇到哪些問題?以及對(duì)應(yīng)的解決方案。
- 1、緩存集中失效
- 2、緩存穿透
- 3、緩存雪崩
- 4、緩存熱點(diǎn)
- 5、緩存大Key
- 6、緩存數(shù)據(jù)的一致性
- 7、數(shù)據(jù)并發(fā)競(jìng)爭(zhēng)預(yù)熱
Redis 集群方案有哪幾種?答案:
- 主從復(fù)制模式
- Sentinel(哨兵)模式
- Redis Cluster模式
Redis 主從數(shù)據(jù)同步(主從復(fù)制)的過程?答案:
- 1、slave啟動(dòng)后,向master發(fā)送sync命令
- 2、master收到sync之后,執(zhí)行bgsave保存快照,生成RDB全量文件
- 3、master把slave的寫命令記錄到緩存
- 4、bgsave執(zhí)行完畢之后,發(fā)送RDB文件到slave,slave執(zhí)行
- 5、master發(fā)送緩沖區(qū)的寫命令給slave,slave接收命令并執(zhí)行,完成復(fù)制初始化。
- 6、此后,master每次執(zhí)行一個(gè)寫命令都會(huì)同步發(fā)送給slave,保持master與slave之間數(shù)據(jù)的一致性
主從復(fù)制的優(yōu)缺點(diǎn)?答案:1、優(yōu)點(diǎn):
- master能自動(dòng)將數(shù)據(jù)同步到slave,可以進(jìn)行讀寫分離,分擔(dān)master的讀壓力
- master、slave之間的同步是以非阻塞的方式進(jìn)行的,同步期間,客戶端仍然可以提交查詢或更新請(qǐng)求
- 不具備自動(dòng)容錯(cuò)與恢復(fù)功能,master 節(jié)點(diǎn)宕機(jī)后,需要手動(dòng)指定新的 master
- master宕機(jī),如果宕機(jī)前數(shù)據(jù)沒有同步完,則切換IP后會(huì)存在數(shù)據(jù)不一致的問題
- 難以支持在線擴(kuò)容,Redis的容量受限于單機(jī)配置
Sentinel(哨兵)模式的優(yōu)缺點(diǎn)?答案:哨兵模式基于主從復(fù)制模式,增加了哨兵來(lái)監(jiān)控與自動(dòng)處理故障。1、優(yōu)點(diǎn):
- 哨兵模式基于主從復(fù)制模式,所以主從復(fù)制模式有的優(yōu)點(diǎn),哨兵模式也有
- master 掛掉可以自動(dòng)進(jìn)行切換,系統(tǒng)可用性更高
- Redis的容量受限于單機(jī)配置
- 需要額外的資源來(lái)啟動(dòng)sentinel進(jìn)程
Redis Cluster 模式的優(yōu)缺點(diǎn)?答案:實(shí)現(xiàn)了Redis的分布式存儲(chǔ),即每臺(tái)節(jié)點(diǎn)存儲(chǔ)不同的內(nèi)容,來(lái)解決在線擴(kuò)容的問題。1、優(yōu)點(diǎn):
- 無(wú)中心架構(gòu),數(shù)據(jù)按照slot分布在多個(gè)節(jié)點(diǎn)
- 集群中的每個(gè)節(jié)點(diǎn)都是平等的,每個(gè)節(jié)點(diǎn)都保存各自的數(shù)據(jù)和整個(gè)集群的狀態(tài)。每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接,而且這些連接保持活躍,這樣就保證了我們只需要連接集群中的任意一個(gè)節(jié)點(diǎn),就可以獲取到其他節(jié)點(diǎn)的數(shù)據(jù)。
- 可線性擴(kuò)展到1000多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)可動(dòng)態(tài)添加或刪除
- 能夠?qū)崿F(xiàn)自動(dòng)故障轉(zhuǎn)移,節(jié)點(diǎn)之間通過
gossip協(xié)議
交換狀態(tài)信息,用投票機(jī)制完成slave到master的角色轉(zhuǎn)換
- 數(shù)據(jù)通過異步復(fù)制,不保證數(shù)據(jù)的強(qiáng)一致性
- slave充當(dāng) “冷備”,不對(duì)外提供讀、寫服務(wù),只作為故障轉(zhuǎn)移使用。
- 批量操作限制,目前只支持具有相同slot值的key執(zhí)行批量操作,對(duì)mset、mget、sunion等操作支持不友好
- key事務(wù)操作支持有限,只支持多key在同一節(jié)點(diǎn)的事務(wù)操作,多key分布在不同節(jié)點(diǎn)時(shí)無(wú)法使用事務(wù)功能
- 不支持多數(shù)據(jù)庫(kù)空間,一臺(tái)redis可以支持16個(gè)db,集群模式下只能使用一個(gè),即
db 0
。Redis Cluster模式不建議使用pipeline和multi-keys操作,減少max redirect產(chǎn)生的場(chǎng)景。
Redis 如何做擴(kuò)容?答案:為了避免數(shù)據(jù)遷移失效,通常使用
一致性哈希
實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容縮容,有效減少需要遷移的Key數(shù)量。但是Cluster 模式,采用固定Slot槽位方式(16384個(gè)),對(duì)每個(gè)key計(jì)算CRC16值,然后對(duì)16384取模,然后根據(jù)slot值找到目標(biāo)機(jī)器,擴(kuò)容時(shí),我們只需要遷移一部分的slot到新節(jié)點(diǎn)即可。Redis 的集群原理?答案:一個(gè)redis集群由多個(gè)節(jié)點(diǎn)node組成,而多個(gè)node之間通過
cluster meet
命令來(lái)進(jìn)行連接,組成一個(gè)集群。數(shù)據(jù)存儲(chǔ)通過分片的形式,整個(gè)集群分成了16384
個(gè)slot,每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分槽位。整個(gè)槽位的信息會(huì)同步到所有節(jié)點(diǎn)中。key與slot的映射關(guān)系:- 健值對(duì) key,進(jìn)行
CRC16
計(jì)算,計(jì)算出一個(gè) 16 bit 的值 - 將 16 bit 的值對(duì) 16384 取模,得到 0 ~ 16383 的數(shù)表示 key 對(duì)應(yīng)的哈希槽
Redis 如何做到高可用?答案:哨兵機(jī)制。具有自動(dòng)故障轉(zhuǎn)移、集群監(jiān)控、消息通知等功能。哨兵可以同時(shí)監(jiān)視所有的主、從服務(wù)器,當(dāng)某個(gè)master下線時(shí),自動(dòng)提升對(duì)應(yīng)的slave為master,然后由新master對(duì)外提供服務(wù)。
什么是 Redis 事務(wù)?答案:Redis事務(wù)是一組命令的集合,將多個(gè)命令打包,然后把這些命令按順序添加到隊(duì)列中,并且按順序執(zhí)行這些命令。Redis事務(wù)中沒有像Mysql關(guān)系型數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別的概念,不能保證原子性操作,也沒有像Mysql那樣執(zhí)行事務(wù)失敗會(huì)進(jìn)行回滾操作
Redis 事務(wù)執(zhí)行流程?答案:通過
MULTI
、EXEC
、WATCH
等命令來(lái)實(shí)現(xiàn)事務(wù)機(jī)制,事務(wù)執(zhí)行過程將一系列多個(gè)命令按照順序一次性執(zhí)行,在執(zhí)行期間,事務(wù)不會(huì)被中斷,也不會(huì)去執(zhí)行客戶端的其他請(qǐng)求,直到所有命令執(zhí)行完畢。具體過程:- 服務(wù)端收到客戶端請(qǐng)求,事務(wù)以
MULTI
開始 - 如果正處于事務(wù)狀態(tài)時(shí),則會(huì)把后續(xù)命令放入隊(duì)列同時(shí)返回給客戶端
QUEUED
,反之則直接執(zhí)行這 個(gè)命令 - 當(dāng)收到客戶端的
EXEC
命令時(shí),才會(huì)將隊(duì)列里的命令取出、順序執(zhí)行,執(zhí)行完將當(dāng)前狀態(tài)從事務(wù)狀態(tài)改為非事務(wù)狀態(tài) - 如果收到
DISCARD
命令,放棄執(zhí)行隊(duì)列中的命令,可以理解為Mysql的回滾操作,并且將當(dāng)前的狀態(tài)從事務(wù)狀態(tài)改為非事務(wù)狀態(tài)
WATCH 監(jiān)視某個(gè)key,該命令只能在MULTI命令之前執(zhí)行。如果監(jiān)視的key被其他客戶端修改,EXEC將會(huì)放棄執(zhí)行隊(duì)列中的所有命令。UNWATCH 取消監(jiān)視之前通過WATCH 命令監(jiān)視的key。通過執(zhí)行EXEC 、DISCARD 兩個(gè)命令之前監(jiān)視的key也會(huì)被取消監(jiān)視。
Redis 與 Guava 、Caffeine 有什么區(qū)別?答案:緩存分為本地緩存和分布式緩存。1、Caffeine、Guava,屬于本地緩存,特點(diǎn):
- 直接訪問內(nèi)存,速度快,受內(nèi)存限制,無(wú)法進(jìn)行大數(shù)據(jù)存儲(chǔ)。
- 無(wú)網(wǎng)絡(luò)通訊開銷,性能更高。
- 只支持本地應(yīng)用進(jìn)程訪問,同步更新所有節(jié)點(diǎn)的本地緩存數(shù)據(jù)成本較高。
- 應(yīng)用進(jìn)程重啟,數(shù)據(jù)會(huì)丟失。
- 集群模式,支持大數(shù)據(jù)量存儲(chǔ)
- 數(shù)據(jù)集中存儲(chǔ),保證數(shù)據(jù)的一致性
- 數(shù)據(jù)跨網(wǎng)絡(luò)傳輸,性能低于本地緩存。但同一個(gè)機(jī)房,兩臺(tái)服務(wù)器之間請(qǐng)求跑一個(gè)來(lái)回也就需要500微秒,比起其優(yōu)勢(shì),這點(diǎn)損耗完全可以忽略,這也是分布式緩存受歡迎的原因。
- 支持副本機(jī)制,有效的保證了高可用性。
如何實(shí)現(xiàn)一個(gè)分布式鎖?答案:
- 1、數(shù)據(jù)庫(kù)表,性能比較差
- 2、使用Lua腳本 (包含 SETNX EXPIRE 兩條指令)
- 3、SET的擴(kuò)展命令(SET key value [EX][PX] [NX|XX])
- 4、Redlock 框架
- 5、Zookeeper Curator框架提供了現(xiàn)成的分布式鎖