深入理解Redis,以Redis面試題來復習;Java程序員面試必備寶典

前言

沒得前言,因為懶宿稀,都是面試題、書籍和學習資料赖捌,自己看祝沸!

一. Redis面試真題

1. 什么是 Redis?簡述它的優(yōu)缺點越庇?

Redis 本質(zhì)上是一個 Key-Value 類型的內(nèi)存數(shù)據(jù)庫罩锐,很像 memcached,整個數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當中 進行操作卤唉,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù) flush 到硬盤上進行保存涩惑。

因為是純內(nèi)存操作,Redis 的性能非常出色搬味,每秒可以處理超過 10 萬次讀寫操作境氢,是已知性能最快的 Ke y-Value DB。

Redis 的出色之處不僅僅是性能碰纬,Redis 最大的魅力是支持保存多種數(shù)據(jù)結(jié)構萍聊,此外單個 value 的最大限 制是 1GB,不像 memcached 只能保存 1MB 的數(shù)據(jù)悦析,因此 Redis 可以用來實現(xiàn)很多有用的功能寿桨。

比方說用他的 List 來做 FIFO 雙向鏈表,實現(xiàn)一個輕量級的高性 能消息隊列服務,用他的 Set 可以做高 性能的 tag 系統(tǒng)等等亭螟。

另外 Redis 也可以對存入的 Key-Value 設置 expire 時間挡鞍,因此也可以被當作一 個功能加強版的 memcac hed 來用。 Redis 的主要缺點是數(shù)據(jù)庫容量受到物理內(nèi)存的限制预烙,不能用作海量數(shù)據(jù)的高性能讀寫墨微,因 此 Redis 適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運算上。

2. Redis 相比 memcached 有哪些優(yōu)勢扁掸?

  • memcached 所有的值均是簡單的字符串翘县,redis 作為其替代者,支持更為豐富的數(shù)據(jù)類型
  • redis 的速度比 memcached 快很多
  • redis 可以持久化其數(shù)據(jù)

3. Redis 支持哪幾種數(shù)據(jù)類型谴分?

String锈麸、List、Set牺蹄、Sorted Set忘伞、hashes

4. Redis 主要消耗什么物理資源?

內(nèi)存沙兰。

5. Redis 的全稱是什么氓奈?

Remote Dictionary Server。

6. Redis 有哪幾種數(shù)據(jù)淘汰策略僧凰?

  • noeviction:返回錯誤當內(nèi)存限制達到并且客戶端嘗試執(zhí)行會讓更多內(nèi)存被使用的命令(大部分的寫入指 令探颈,但 DEL 和幾個例外)
  • 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ù)有空間存 放化借。

7. Redis 官方為什么不提供 Windows 版本?

因為目前 Linux 版本已經(jīng)相當穩(wěn)定捡多,而且用戶量很大蓖康,無需開發(fā) windows 版本,反而會帶來兼容性等問 題垒手。

8. 一個字符串類型的值能存儲最大容量是多少蒜焊?

512M

9. 為什么 Redis 需要把所有數(shù)據(jù)放到內(nèi)存中?

Redis 為了達到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中科贬,并通過異步的方式將數(shù)據(jù)寫入磁盤泳梆。

所以 redis 具有快速和數(shù)據(jù)持久化的特征。如果不將數(shù)據(jù)放在內(nèi)存中,磁盤 I/O 速度為嚴重影響 redis 的 性能优妙。

在內(nèi)存越來越便宜的今天乘综,redis 將會越來越受歡迎。 如果設置了最大使用的內(nèi)存套硼,則數(shù)據(jù)已有記錄數(shù)達 到內(nèi)存限值后不能繼續(xù)插入新值卡辰。

10. Redis 集群方案應該怎么做?都有哪些方案邪意?

①.codis:目前用的最多的集群方案看政,基本和 twemproxy 一致的效果,但它支持在 節(jié)點數(shù)量改變情況下抄罕,舊節(jié)點數(shù) 據(jù)可恢復到新 hash 節(jié)點。

②.redis cluster3.0 自帶的集群于颖,特點在于他的分布式算法不是一致性 hash呆贿,而是 hash 槽的概念,以及自 身支持節(jié)點設置從節(jié)點森渐。具體看官方文檔介紹做入。

③.在業(yè)務代碼層實現(xiàn),起幾個毫無關聯(lián)的 redis 實例同衣,在代碼層竟块,對 key 進行 hash 計算,然后去對應的 r edis 實例操作數(shù)據(jù)耐齐。 這種方式對 hash 層代碼要求比較高浪秘,考慮部分包括,節(jié)點失效后的替代算法方 案埠况,數(shù)據(jù)震蕩后的自動腳本恢復耸携,實例的監(jiān)控,等等辕翰。

11. Redis 集群方案什么情況下會導致整個集群不可用夺衍?

有 A,B喜命,C 三個節(jié)點的集群,在沒有復制模型的情況下,如果節(jié)點 B 失敗了沟沙,那么整個集群就會以為缺少 5 501-11000 這個范圍的槽而不可用。

12. MySQL 里有 2000w 數(shù)據(jù)壁榕,redis 中只存 20w 的數(shù)據(jù)矛紫,如何保證 redis中的數(shù)據(jù)都是熱點數(shù)據(jù)?

redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候护桦,就會施行數(shù)據(jù)淘汰策略含衔。

13. Redis 有哪些適合的場景?

①. 會話緩存(Session Cache)

最常用的一種使用 Redis 的情景是會話緩存(session cache)。用 Redis 緩存會話比其他存儲(如 Mem cached)的優(yōu)勢在于:Redis 提供持久化贪染。當維護一個不是嚴格要求一致性的緩存時缓呛,如果用戶的購物車 信息全部丟失,大部分人都會不高興的杭隙,現(xiàn)在哟绊,他們還會這樣嗎?

幸運的是痰憎,隨著 Redis 這些年的改進票髓,很容易找到怎么恰當?shù)氖褂?Redis 來緩存會話的文檔。甚至廣為 人知的商業(yè)平臺 Magento 也提供 Redis 的插件铣耘。

②. 全頁緩存(FPC)

除基本的會話 token 之外洽沟,Redis 還提供很簡便的 FPC 平臺∥舷福回到一致性問題裆操,即使重啟了 Redis 實 例,因為有磁盤的持久化炉媒,用戶也不會看到頁面加載速度的下降踪区,這是一個極大改進,類似 PHP 本地 FP C吊骤。

再次以 Magento 為例缎岗,Magento 提供一個插件來使用 Redis 作為全頁緩存后端。

此外白粉,對 WordPress 的用戶來說传泊,Pantheon 有一個非常好的插件 wp-redis,這個插件能幫助你以最快 速度加載你曾瀏覽過的頁面鸭巴。

③. 隊列

Reids 在內(nèi)存存儲引擎領域的一大優(yōu)點是提供 list 和 set 操作或渤,這使得 Redis 能作為一個很好的消息隊 列平臺來使用。Redis 作為隊列使用的操作奕扣,就類似于本地程序語言(如 Python)對 list 的 push/pop 操作薪鹦。

如果你快速的在 Google 中搜索“Redis queues”,你馬上就能找到大量的開源項目惯豆,這些項目的目的就是 利用 Redis 創(chuàng)建非常好的后端工具池磁,以滿足各種隊列需求。例如楷兽,Celery 有一個后臺就是使用 Redis 作 為 broker地熄,你可以從這里去查看。

④. 排行榜/計數(shù)器

Redis 在內(nèi)存中對數(shù)字進行遞增或遞減的操作實現(xiàn)的非常好芯杀。集合(Set)和有序集合(Sorted Set)也 使得我們在執(zhí)行這些操作的時候變的非常簡單端考,Redis 只是正好提供了這兩種數(shù)據(jù)結(jié)構雅潭。

所以,我們要從排序集合中獲取到排名最靠前的 10 個用戶–我們稱之為“user_scores”却特,我們只需要像下 面一樣執(zhí)行即可:

當然扶供,這是假定你是根據(jù)你用戶的分數(shù)做遞增的排序。如果你想返回用戶及用戶的分數(shù)裂明,你需要這樣執(zhí) 行: ZRANGE user_scores 0 10 WITHSCORES Agora Games就是一個很好的例子椿浓,用 Ruby 實現(xiàn)的,它的排行榜就是使用 Redis 來存儲數(shù)據(jù)的闽晦,你可 以在這里看到扳碍。

⑤. 發(fā)布/訂閱

最后(但肯定不是最不重要的)是 Redis 的發(fā)布/訂閱功能。發(fā)布/訂閱的使用場景確實非常多仙蛉。我已看見 人們在社交網(wǎng)絡連接中使用笋敞,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器,甚至用 Redis 的發(fā)布/訂閱功能來建 立聊天系統(tǒng)荠瘪!

14. Redis 支持的 Java 客戶端都有哪些液样?官方推薦用哪個?

Redisson巧还、Jedis、lettuce 等等坊秸,官方推薦使用 Redisson麸祷。

15. Redis 和 Redisson 有什么關系?

Redisson 是一個高級的分布式協(xié)調(diào) Redis 客服端褒搔,能幫助用戶在分布式環(huán)境中輕松實現(xiàn)一些 Java 的對象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, List Multimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, Atomi cLong, CountDownLatch, Publish / Subscribe, HyperLogLog)阶牍。

16. Jedis 與 Redisson 對比有什么優(yōu)缺點?

Jedis 是 Redis 的 Java 實現(xiàn)的客戶端星瘾,其 API 提供了比較全面的 Redis 命令的支持走孽; Redisson 實現(xiàn)了分布式和可擴展的 Java 數(shù)據(jù)結(jié)構,和 Jedis 相比琳状,功能較為簡單磕瓷,不支持字符串操作, 不支持排序念逞、事務困食、管道、分區(qū)等 Redis 特性翎承。Redisson 的宗旨是促進使用者對 Redis 的關注分離硕盹,從 而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務邏輯上。

17. Redis 如何設置密碼及驗證密碼叨咖?

設置密碼:config set requirepass 123456
授權密碼:auth 123456

18. 說說 Redis 哈希槽的概念瘩例?

Redis 集群沒有使用一致性 hash,而是引入了哈希槽的概念啊胶,Redis 集群有 16384 個哈希槽,每個 key 通 過 CRC16 校驗后對 16384 取模來決定放置哪個槽垛贤,集群的每個節(jié)點負責一部分 hash 槽焰坪。

19. Redis 集群的主從復制模型是怎樣的?

為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用南吮,所以集群使用了主從復制模型, 每個節(jié)點都會有 N-1 個復制品.

20. Redis 集群會有寫操作丟失嗎琳彩?為什么?

Redis 并不能保證數(shù)據(jù)的強一致性部凑,這意味這在實際中集群在特定的條件下可能會丟失寫操作露乏。

21. Redis 集群之間是如何復制的?

異步復制

22. Redis 集群最大節(jié)點個數(shù)是多少涂邀?

16384 個瘟仿。

23. Redis 集群如何選擇數(shù)據(jù)庫?

Redis 集群目前無法做數(shù)據(jù)庫選擇比勉,默認在 0 數(shù)據(jù)庫劳较。

24. 怎么測試 Redis 的連通性?

ping

25. Redis 中的管道有什么用浩聋?

一次請求/響應服務器能實現(xiàn)處理新的請求即使舊的請求還未被響應观蜗。這樣就可以將多個命令發(fā)送到服務 器,而不用等待回復衣洁,最后在一個步驟中讀取該答復墓捻。

這就是管道(pipelining),是一種幾十年來廣泛使用的技術坊夫。例如許多 POP3 協(xié)議已經(jīng)實現(xiàn)支持這個功 能砖第,大大加快了從服務器下載新郵件的過程。

26. 怎么理解 Redis 事務环凿?

事務是一個單獨的隔離操作:事務中的所有命令都會序列化梧兼、按順序地執(zhí)行。事務在執(zhí)行的過程中智听,不會 被其他客戶端發(fā)送來的命令請求所打斷羽杰。

事務是一個原子操作:事務中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行到推。

27. Redis 事務相關的命令有哪幾個忽洛?

MULTI、EXEC环肘、DISCARD欲虚、WATCH

28. Redis key 的過期時間和永久有效分別怎么設置?

EXPIRE 和 PERSIST 命令悔雹。

29. Redis 如何做內(nèi)存優(yōu)化复哆?

盡可能使用散列表(hashes)欣喧,散列表(是說散列表里面存儲的數(shù)少)使用的內(nèi)存非常小,所以你應該 盡可能的將你的數(shù)據(jù)模型抽象到一個散列表里面梯找。

比如你的 web 系統(tǒng)中有一個用戶對象唆阿,不要為這個用戶的名稱,姓氏锈锤,郵箱驯鳖,密碼設置單獨的 key,而是 應該把這個用戶的所有信息存儲到一張散列表里面。

30. Redis 回收進程如何工作的久免?

一個客戶端運行了新的命令浅辙,添加了新的數(shù)據(jù)。

Redi 檢查內(nèi)存使用情況阎姥,如果大于 maxmemory 的限制, 則根據(jù)設定好的策略進行回收记舆。

一個新的命令被執(zhí)行,等等呼巴。

所以我們不斷地穿越內(nèi)存限制的邊界泽腮,通過不斷達到邊界然后不斷地回收回到邊界以下。

如果一個命令的結(jié)果導致大量內(nèi)存被使用(例如很大的集合的交集保存到一個新的鍵)衣赶,不用多久內(nèi)存限 制就會被這個內(nèi)存使用量超越诊赊。

二. 深入理解Redis(書籍)

以由淺入深、由原理到應用場景的方式介紹了Redis 這款NoSQL 數(shù)據(jù)庫產(chǎn)品府瞄。書中不僅細致地講解了Redis 中的數(shù)據(jù)結(jié)構及流行的使用模式碧磅,還針對Redis 鍵的設計和管理,以及內(nèi)存管理提出了建設性的方案摘能。同時,作者深入Redis 源碼敲街,將其內(nèi)部構造通過源代碼調(diào)試的方式進行呈現(xiàn)团搞。

適合有一定NoSQL 經(jīng)驗的開發(fā)者或者架構師閱讀。讀者可以從書中找到許多應用場景和解決方案多艇,例如Docker 部署逻恐、Redis 消息隊列、基于Redis 的ETL 應用和基于Redis 的機器學習等峻黍。

三. Java程序員復習面試題

1. Java筑基(基礎)面試專題系列:Tomcat+MySQL+設計模式+并發(fā)編程+Netty+JVM

2. JVM與性能優(yōu)化知識點整理

3. Spring面試專題

4. 分布式數(shù)據(jù)庫面試專題系列:Memcached+Redis+MongoDB

5. 分布式通訊面試專題系列:ActiveMQ+RabbitMQ+Kafka

6. 分布式限流面試專題系列:Nginx+zookeeper

7. 后端開發(fā)常問面試題集錦(算法問題)

8. 持續(xù)需更新复隆!

Java程序員福利"常用資料分享"

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姆涩,隨后出現(xiàn)的幾起案子挽拂,更是在濱河造成了極大的恐慌,老刑警劉巖骨饿,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亏栈,死亡現(xiàn)場離奇詭異台腥,居然都是意外死亡,警方通過查閱死者的電腦和手機绒北,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門黎侈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闷游,你說我怎么就攤上這事峻汉。” “怎么了脐往?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵休吠,是天一觀的道長。 經(jīng)常有香客問我钙勃,道長蛛碌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任辖源,我火速辦了婚禮蔚携,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘克饶。我一直安慰自己酝蜒,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布矾湃。 她就那樣靜靜地躺著亡脑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邀跃。 梳的紋絲不亂的頭發(fā)上霉咨,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音拍屑,去河邊找鬼途戒。 笑死,一個胖子當著我的面吹牛僵驰,可吹牛的內(nèi)容都是我干的喷斋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蒜茴,長吁一口氣:“原來是場噩夢啊……” “哼星爪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粉私,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤顽腾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诺核,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崔泵,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡秒赤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了憎瘸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片入篮。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幌甘,靈堂內(nèi)的尸體忽然破棺而出潮售,到底是詐尸還是另有隱情,我是刑警寧澤锅风,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布酥诽,位于F島的核電站,受9級特大地震影響皱埠,放射性物質(zhì)發(fā)生泄漏肮帐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一边器、第九天 我趴在偏房一處隱蔽的房頂上張望训枢。 院中可真熱鬧芒珠,春花似錦晋修、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十酣。三九已至,卻和暖如春际长,著一層夾襖步出監(jiān)牢的瞬間耸采,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工工育, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虾宇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓翅娶,卻偏偏與公主長得像文留,于是被迫代替她去往敵國和親好唯。 傳聞我的和親對象是個殘疾皇子竭沫,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容