Redis高性能緩存數(shù)據(jù)庫
1和敬、什么是 Redis?簡述它的優(yōu)缺點戏阅?
Redis 的全稱是:Remote Dictionary.Server昼弟,本質(zhì)上是一個 Key-Value 類型的內(nèi)存數(shù)據(jù)庫,很像
memcached奕筐,整個數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當(dāng)中進(jìn)行操作舱痘,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù) flush 到硬盤上進(jìn)行保存。
因為是純內(nèi)存操作离赫,Redis 的性能非常出色芭逝,每秒可以處理超過 10 萬次讀寫操作,是已知性能最快的Key-Value DB笆怠。
Redis 的出色之處不僅僅是性能铝耻,Redis 最大的魅力是支持保存多種數(shù)據(jù)結(jié)構(gòu),此外單個 value 的最大限制是 1GB蹬刷,不像 memcached 只能保存 1MB 的數(shù)據(jù)瓢捉,因此 Redis 可以用來實現(xiàn)很多有用的功能。
比方說用他的 List 來做 FIFO 雙向鏈表办成,實現(xiàn)一個輕量級的高性 能消息隊列服務(wù)泡态,用他的 Set 可以做高性能的 tag 系統(tǒng)等等。
另外 Redis 也可以對存入的 Key-Value 設(shè)置 expire 時間迂卢,因此也可以被當(dāng)作一 個功能加強版的memcached 來用某弦。 Redis 的主要缺點是數(shù)據(jù)庫容量受到物理內(nèi)存的限制桐汤,不能用作海量數(shù)據(jù)的高性能讀寫,因此 Redis 適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運算上靶壮。
2怔毛、Redis 與 memcached 相比有哪些優(yōu)勢?
memcached 所有的值均是簡單的字符串腾降,redis 作為其替代者拣度,支持更為豐富的數(shù)據(jù)類型
redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多
redis 可以持久化其數(shù)據(jù) redis 可以持久化其數(shù)據(jù)
3、Redis 支持哪幾種數(shù)據(jù)類型螃壤?
String抗果、List、Set奸晴、Sorted Set冤馏、hashes
4、Redis 主要消耗什么物理資源寄啼?
內(nèi)存逮光。
5、Redis 有哪幾種數(shù)據(jù)淘汰策略辕录?
noeviction:返回錯誤當(dāng)內(nèi)存限制達(dá)到睦霎,并且客戶端嘗試執(zhí)行會讓更多內(nèi)存被使用的命令。
allkeys-lru: 嘗試回收最少使用的鍵(LRU)走诞,使得新添加的數(shù)據(jù)有空間存放副女。
volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的數(shù)據(jù)有空間存放蚣旱。
allkeys-random: 回收隨機的鍵使得新添加的數(shù)據(jù)有空間存放碑幅。
volatile-random: 回收隨機的鍵使得新添加的數(shù)據(jù)有空間存放,但僅限于在過期集合的鍵塞绿。
volatile-ttl: 回收在過期集合的鍵沟涨,并且優(yōu)先回收存活時間(TTL)較短的鍵,使得新添加的數(shù)據(jù)有空間存放。
6异吻、Redis 官方為什么不提供 Windows 版本裹赴?
因為目前 Linux 版本已經(jīng)相當(dāng)穩(wěn)定,而且用戶量很大诀浪,無需開發(fā) windows 版本棋返,反而會帶來兼容性等問題。
7雷猪、一個字符串類型的值能存儲最大容量是多少睛竣?
512M
8、為什么 Redis 需要把所有數(shù)據(jù)放到內(nèi)存中求摇?
Redis 為了達(dá)到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中射沟,并通過異步的方式將數(shù)據(jù)寫入磁盤殊者。
所以 redis 具有快速和數(shù)據(jù)持久化的特征,如果不將數(shù)據(jù)放在內(nèi)存中验夯,磁盤 I/O 速度為嚴(yán)重影響 redis 的性能猖吴。
在內(nèi)存越來越便宜的今天,redis 將會越來越受歡迎簿姨, 如果設(shè)置了最大使用的內(nèi)存距误,則數(shù)據(jù)已有記錄數(shù)達(dá)到內(nèi)存限值后不能繼續(xù)插入新值。
9扁位、Redis 集群方案應(yīng)該怎么做?都有哪些方案趁俊?
codis
目前用的最多的集群方案域仇,基本和 twemproxy 一致的效果,但它支持在節(jié)點數(shù)量改變情況下寺擂,舊節(jié)點數(shù)據(jù)可恢復(fù)到新 hash 節(jié)點暇务。
redis cluster3.0 自帶的集群,特點在于他的分布式算法不是一致性 hash怔软,而是 hash 槽的概念垦细,以及自身支持節(jié)點設(shè)置從節(jié)點。具體看官方文檔介紹挡逼。
在業(yè)務(wù)代碼層實現(xiàn)括改,起幾個毫無關(guān)聯(lián)的 redis 實例,在代碼層家坎,對 key 進(jìn)行 hash 計算嘱能,然后去對應(yīng)的redis 實例操作數(shù)據(jù)。這種方式對 hash 層代碼要求比較高虱疏,考慮部分包括惹骂,節(jié)點失效后的替代算法方案,數(shù)據(jù)震蕩后的自動腳本恢復(fù)做瞪,實例的監(jiān)控对粪,等等。
Java 架構(gòu)學(xué)習(xí)資料(里面有高可用装蓬、高并發(fā)著拭、高性能及分布式、Jvm 性能調(diào)優(yōu)矛物、Spring 源碼茫死,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己履羞,不要再用"沒有時間“來掩飾自己思想上的懶惰峦萎!趁年輕屡久,使勁拼,給未來的自己一個交代爱榔!
10被环、Redis 集群方案什么情況下會導(dǎo)致整個集群不可用?
有 A详幽,B筛欢,C 三個節(jié)點的集群,在沒有復(fù)制模型的情況下,如果節(jié)點 B 失敗了,那么整個集群就會以為缺少5501-11000 這個范圍的槽而不可用唇聘。
11版姑、MySQL 里有 2000w 數(shù)據(jù),redis 中只存 20w 的數(shù)據(jù)迟郎,如何保證 redis 中的數(shù)據(jù)都是熱點數(shù)據(jù)剥险?
redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候,就會施行數(shù)據(jù)淘汰策略宪肖。
其實面試除了考察 Redis表制,不少公司都很重視高并發(fā)高可用的技術(shù),特別是一線互聯(lián)網(wǎng)公司控乾,分布式么介、
JVM、spring 源碼分析蜕衡、微服務(wù)等知識點已是面試的必考題壤短。文末分享給大家一線互聯(lián)網(wǎng)公司最新的技術(shù)知識(彩蛋)
12、Redis 有哪些適合的場景衷咽?
(1)會話緩存(Session Cache)
最常用的一種使用 Redis 的情景是會話緩存(sessioncache)鸽扁,用 Redis 緩存會話比其他存儲(如Memcached)的優(yōu)勢在于:Redis 提供持久化。當(dāng)維護一個不是嚴(yán)格要求一致性的緩存時镶骗,如果用戶的購物車信息全部丟失桶现,大部分人都會不高興的,現(xiàn)在鼎姊,他們還會這樣嗎骡和?
幸運的是,隨著 Redis 這些年的改進(jìn)相寇,很容易找到怎么恰當(dāng)?shù)氖褂?Redis 來緩存會話的文檔慰于。甚至廣為人知的商業(yè)平臺 Magento 也提供 Redis 的插件。
(2)全頁緩存(FPC)
除基本的會話 token 之外唤衫,Redis 還提供很簡便的 FPC 平臺婆赠。回到一致性問題佳励,即使重啟了 Redis 實例休里,因為有磁盤的持久化蛆挫,用戶也不會看到頁面加載速度的下降,這是一個極大改進(jìn)妙黍,類似 PHP 本地FPC悴侵。
再次以 Magento 為例,Magento 提供一個插件來使用 Redis 作為全頁緩存后端拭嫁。
此外可免,對 WordPress 的用戶來說,Pantheon 有一個非常好的插件 wp-redis做粤,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面浇借。
(3)隊列
Reids 在內(nèi)存存儲引擎領(lǐng)域的一大優(yōu)點是提供 list 和 set 操作,這使得 Redis 能作為一個很好的消息隊列平臺來使用驮宴。Redis 作為隊列使用的操作逮刨,就類似于本地程序語言(如 Python)對 list 的 push/pop操作。
如果你快速的在 Google 中搜索“Redis queues”堵泽,你馬上就能找到大量的開源項目,這些項目的目的就是利用 Redis 創(chuàng)建非常好的后端工具恢总,以滿足各種隊列需求迎罗。例如,Celery 有一個后臺就是使用Redis 作為 broker片仿,你可以從這里去查看纹安。
(4)排行榜/計數(shù)器
Redis 在內(nèi)存中對數(shù)字進(jìn)行遞增或遞減的操作實現(xiàn)的非常好。集合(Set)和有序集合(SortedSet)也使得我們在執(zhí)行這些操作的時候變的非常簡單砂豌,Redis 只是正好提供了這兩種數(shù)據(jù)結(jié)構(gòu)厢岂。
所以,我們要從排序集合中獲取到排名最靠前的 10 個用戶–我們稱之為“user_scores”阳距,我們只需要像下面一樣執(zhí)行即可:
當(dāng)然塔粒,這是假定你是根據(jù)你用戶的分?jǐn)?shù)做遞增的排序。如果你想返回用戶及用戶的分?jǐn)?shù)筐摘,你需要這樣執(zhí)行:
ZRANGE user_scores 0 10 WITHSCORESAgora Games 就是一個很好的例子卒茬,用 Ruby 實現(xiàn)的,它的排行榜就是使用 Redis 來存儲數(shù)據(jù)的咖熟,你可以在這里看到圃酵。
(5)發(fā)布/訂閱
最后(但肯定不是最不重要的)是 Redis 的發(fā)布/訂閱功能。發(fā)布/訂閱的使用場景確實非常多馍管。我已看見人們在社交網(wǎng)絡(luò)連接中使用郭赐,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器,甚至用 Redis 的發(fā)布/訂閱功能來建立聊天系統(tǒng)确沸!
13捌锭、Redis 支持的 Java 客戶端都有哪些俘陷?官方推薦用哪個茴丰?
Redisson圾笨、Jedis、lettuce 等等呼盆,官方推薦使用 Redisson坎匿。
14盾剩、Redis 和 Redisson 有什么關(guān)系?
15替蔬、Jedis 與 Redisson 對比有什么優(yōu)缺點告私?
Jedis 是 Redis 的 Java 實現(xiàn)的客戶端,其 API 提供了比較全面的 Redis 命令的支持承桥;
Redisson 實現(xiàn)了分布式和可擴展的 Java 數(shù)據(jù)結(jié)構(gòu)驻粟,和 Jedis 相比,功能較為簡單凶异,不支持字符串操作蜀撑,不支持排序、事務(wù)剩彬、管道酷麦、分區(qū)等 Redis 特性。Redisson 的宗旨是促進(jìn)使用者對 Redis 的關(guān)注分離喉恋,從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務(wù)邏輯上沃饶。
16、說說 Redis 哈希槽的概念轻黑?
Redis 集群沒有使用一致性 hash,而是引入了哈希槽的概念糊肤,Redis 集群有 16384 個哈希槽,每個 key 通過 CRC16 校驗后對 16384 取模來決定放置哪個槽氓鄙,集群的每個節(jié)點負(fù)責(zé)一部分 hash 槽馆揉。
17、Redis 集群的主從復(fù)制模型是怎樣的玖详?
為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用把介,所以集群使用了主從復(fù)制模型,每個節(jié)點都會有 N-1 個復(fù)制品.
18、Redis 集群會有寫操作丟失嗎蟋座?為什么拗踢?
Redis 并不能保證數(shù)據(jù)的強一致性,這意味這在實際中集群在特定的條件下可能會丟失寫操作向臀。
19巢墅、Redis 集群之間是如何復(fù)制的?
異步復(fù)制
20、Redis 集群最大節(jié)點個數(shù)是多少君纫?
16384 個
21驯遇、Redis 集群如何選擇數(shù)據(jù)庫?
Redis 集群目前無法做數(shù)據(jù)庫選擇蓄髓,默認(rèn)在 0 數(shù)據(jù)庫叉庐。
22、Redis 中的管道有什么用会喝?
一次請求/響應(yīng)服務(wù)器能實現(xiàn)處理新的請求即使舊的請求還未被響應(yīng)陡叠,這樣就可以將多個命令發(fā)送到服務(wù)器,而不用等待回復(fù)肢执,最后在一個步驟中讀取該答復(fù)枉阵。
這就是管道(pipelining),是一種幾十年來廣泛使用的技術(shù)预茄。例如許多 POP3 協(xié)議已經(jīng)實現(xiàn)支持這個功能兴溜,大大加快了從服務(wù)器下載新郵件的過程。
23耻陕、怎么理解 Redis 事務(wù)拙徽?
事務(wù)是一個單獨的隔離操作:事務(wù)中的所有命令都會序列化、按順序地執(zhí)行诗宣,事務(wù)在執(zhí)行的過程中斋攀,不會被其他客戶端發(fā)送來的命令請求所打斷。事務(wù)是一個原子操作:事務(wù)中的命令要么全部被執(zhí)行梧田,要么全部都不執(zhí)行。
24侧蘸、Redis 事務(wù)相關(guān)的命令有哪幾個裁眯?
MULTI、EXEC讳癌、DISCARD穿稳、WATCH
25、Redis key 的過期時間和永久有效分別怎么設(shè)置晌坤?
EXPIRE 和 PERSIST 命令
26逢艘、Redis 如何做內(nèi)存優(yōu)化?
盡可能使用散列表(hashes)骤菠,散列表(是說散列表里面存儲的數(shù)少)使用的內(nèi)存非常小它改,所以你應(yīng)該盡可能的將你的數(shù)據(jù)模型抽象到一個散列表里面。
比如你的 web 系統(tǒng)中有一個用戶對象商乎,不要為這個用戶的名稱央拖,姓氏,郵箱,密碼設(shè)置單獨的 key,而是應(yīng)該把這個用戶的所有信息存儲到一張散列表里面鲜戒。
27专控、Redis 回收進(jìn)程如何工作的?
一個客戶端運行了新的命令遏餐,添加了新的數(shù)據(jù)伦腐。Redi 檢查內(nèi)存使用情況,如果大于 maxmemory 的限制, 則根據(jù)設(shè)定好的策略進(jìn)行回收失都。一個新的命令被執(zhí)行柏蘑,等等。
所以我們不斷地穿越內(nèi)存限制的邊界嗅剖,通過不斷達(dá)到邊界然后不斷地回收回到邊界以下辩越。
如果一個命令的結(jié)果導(dǎo)致大量內(nèi)存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內(nèi)存限制就會被這個內(nèi)存使用量超越
28.加鎖機制
29.鎖互斥機制
30.watch dog 自動延期機制
31.可重入加鎖機制
32.釋放鎖機制
33.上述 Redis 分布式鎖的缺點
34.使用過 Redis 分布式鎖么信粮,它是怎么實現(xiàn)的黔攒?
先拿 setnx 來爭搶鎖,搶到之后强缘,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放督惰。
如果在 setnx 之后執(zhí)行 expire 之前進(jìn)程意外 crash 或者要重啟維護了,那會怎么樣旅掂?
set 指令有非常復(fù)雜的參數(shù)赏胚,這個應(yīng)該是可以同時把 setnx 和 expire 合成一條指令來用的!
35.使用過 Redis 做異步隊列么商虐,你是怎么用的觉阅?有什么缺點?
般使用 list 結(jié)構(gòu)作為隊列秘车,rpush 生產(chǎn)消息典勇,lpop 消費消息。當(dāng) lpop 沒有消息的時候叮趴,要適當(dāng) sleep一會再重試割笙。
缺點:
在消費者下線的情況下,生產(chǎn)的消息會丟失眯亦,得使用專業(yè)的消息隊列如 rabbitmq 等伤溉。
能不能生產(chǎn)一次消費多次呢?
使用 pub/sub 主題訂閱者模式妻率,可以實現(xiàn) 1:N 的消息隊列乱顾。
36.什么是緩存穿透?如何避免舌涨?什么是緩存雪崩糯耍?何如避免扔字?
緩存穿透
一般的緩存系統(tǒng),都是按照 key 去緩存查詢温技,如果不存在對應(yīng)的 value革为,就應(yīng)該去后端系統(tǒng)查找(比如DB)。一些惡意的請求會故意查詢不存在的 key,請求量很大舵鳞,就會對后端系統(tǒng)造成很大的壓力震檩。這就叫做緩存穿透。
如何避免蜓堕?
1:對查詢結(jié)果為空的情況也進(jìn)行緩存抛虏,緩存時間設(shè)置短一點,或者該 key 對應(yīng)的數(shù)據(jù) insert 了之后清理緩存套才。
2:對一定不存在的 key 進(jìn)行過濾迂猴。可以把所有的可能存在的 key 放到一個大的 Bitmap 中背伴,查詢時通過該 bitmap 過濾沸毁。
緩存雪崩
當(dāng)緩存服務(wù)器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候傻寂,會給后端系統(tǒng)帶來很大壓力息尺。導(dǎo)致系統(tǒng)崩潰。
如何避免疾掰?
1:在緩存失效后搂誉,通過加鎖或者隊列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量。比如對某個 key 只允許一個線程查詢數(shù)據(jù)和寫緩存静檬,其他線程等待炭懊。
2:做二級緩存,A1 為原始緩存拂檩,A2 為拷貝緩存凛虽,A1 失效時,可以訪問 A2广恢,A1 緩存失效時間設(shè)置為短期,A2 設(shè)置為長期
3:不同的 key呀潭,設(shè)置不同的過期時間钉迷,讓緩存失效的時間點盡量均勻
Redis擴展面試題
37.redis 和 memcached 什么區(qū)別?為什么高并發(fā)下有時單線程的 redis 比多線程的memcached 效率要高钠署?
38.使用 redis 如何設(shè)計分布式鎖糠聪?說一下實現(xiàn)思路?使用 zk 可以嗎谐鼎?如何實現(xiàn)舰蟆?這兩種有什么區(qū)別?
39.知道 redis 的持久化嗎?底層如何實現(xiàn)的身害?有什么優(yōu)點缺點味悄?
40.緩存穿透、緩存擊穿塌鸯、緩存雪崩解決方案侍瑟?
41.在選擇緩存時,什么時候選擇 redis丙猬,什么時候選擇 memcached涨颜?
42.Redis 常見的性能問題和解決方案
43.Redis 的數(shù)據(jù)淘汰策略有哪些
44.Redis 當(dāng)中有哪些數(shù)據(jù)結(jié)構(gòu)
45.使用 Redis 做過異步隊列嗎,是如何實現(xiàn)的
46.Redis 如何實現(xiàn)延時隊列
.........
面試題整理
由于篇幅過長的原因茧球,為了不影響大家的閱讀效果庭瑰,文中沒有給到所有的答案,以及剩下的面試題我這里以文件的形式整理好了抢埋,需要借閱的程序員朋友可以免費來領(lǐng)取弹灭。
面試文件獲取方式:
轉(zhuǎn)發(fā)+關(guān)注我,后臺私信回復(fù)【面試】領(lǐng)取面試資料(助你金九銀十能跳槽漲薪)
收集了還有你不知道的其它面試題(springboot羹令、mybatis鲤屡、并發(fā)、java中高級面試總結(jié)等)Java高頻面試專題合集解析:
當(dāng)然在這還有更多整理總結(jié)的Java進(jìn)階學(xué)習(xí)筆記和面試題未展示福侈,在這也是免費分享給那些有需要的朋友酒来,其中囊括了Dubbo、Redis肪凛、Netty堰汉、zookeeper、Spring cloud伟墙、分布式翘鸭、高并發(fā)等架構(gòu)資料和完整的Java架構(gòu)學(xué)習(xí)進(jìn)階導(dǎo)圖!
這些資料都以整理成了PDF文檔戳葵,如果有需要獲取到這個群里面的文檔的話幫忙轉(zhuǎn)發(fā)一下然后再關(guān)注我私信回復(fù)“面試”得到獲取方式吧就乓!
更多Java架構(gòu)進(jìn)階資料展示