隨著五月份的到來,一轉眼2020年即將過去一半了,覺得時間轉瞬即逝,所以在四月份我去面試了某大廠的Java開發(fā)的崗位,自己也是很心虛的,因為并不是所有的知識點自己都會的,而是有的熟悉有的不會。等了大概半個多小時吧,對面走來了一位看著就很NB的男子,看著手里還有工作在處理。然后就沖我笑了笑,說:“不好意思,久等了”,示意讓我坐下。然后面試就開始了,看了看我的簡歷,說看我Redis部分不錯,就從這開始吧。我說:Redis....嗯可以。
Redis是什么?
面試官:那你先說說Redis是什么吧?
我:(這不就是總結下 Redis 的定義和特點嘛)Redis 是 C 語言開發(fā)的一個開源的(遵從 BSD 協(xié)議)高性能鍵值對(key-value)的內(nèi)存數(shù)據(jù)庫,可以用作數(shù)據(jù)庫、緩存、消息中間件等。
它是一種 NoSQL(not-only sql,泛指非關系型數(shù)據(jù)庫)的數(shù)據(jù)庫。
我頓了一下,接著說,Redis 作為一個內(nèi)存數(shù)據(jù)庫:
性能優(yōu)秀,數(shù)據(jù)在內(nèi)存中,讀寫速度非???,支持并發(fā) 10W QPS。
單進程單線程,是線程安全的,采用 IO 多路復用機制。
豐富的數(shù)據(jù)類型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
支持數(shù)據(jù)持久化。
可以將內(nèi)存中數(shù)據(jù)保存在磁盤中,重啟時加載。
主從復制,哨兵,高可用。
可以用作分布式鎖。
可以作為消息中間件使用,支持發(fā)布訂閱。
五種數(shù)據(jù)類型
面試官:總結的不錯,看來是早有準備啊。剛來聽你提到 Redis 支持五種數(shù)據(jù)類型,那你能簡單說下這五種數(shù)據(jù)類型嗎?
我:當然可以,但是在說之前,我覺得有必要先來了解下 Redis 內(nèi)部內(nèi)存管理是如何描述這 5 種數(shù)據(jù)類型的。
說著,我拿著筆給面試官畫了一張圖:
我:首先 Redis 內(nèi)部使用一個 redisObject 對象來表示所有的 key 和 value。
redisObject 最主要的信息如上圖所示:type 表示一個 value 對象具體是何種數(shù)據(jù)類型,encoding 是不同數(shù)據(jù)類型在 Redis 內(nèi)部的存儲方式。
比如:type=string 表示 value 存儲的是一個普通字符串,那么 encoding 可以是 raw 或者 int。
我頓了一下,接著說,下面我簡單說下 5 種數(shù)據(jù)類型:
①String 是 Redis 最基本的類型,可以理解成與 Memcached一模一樣的類型,一個 Key 對應一個 Value。Value 不僅是 String,也可以是數(shù)字。
String 類型是二進制安全的,意思是 Redis 的 String 類型可以包含任何數(shù)據(jù),比如 jpg 圖片或者序列化的對象。String 類型的值最大能存儲 512M。
②Hash是一個鍵值(key-value)的集合。Redis 的 Hash 是一個 String 的 Key 和 Value 的映射表,Hash 特別適合存儲對象。常用命令:hget,hset,hgetall 等。
③List 列表是簡單的字符串列表,按照插入順序排序??梢蕴砑右粋€元素到列表的頭部(左邊)或者尾部(右邊) 常用命令:lpush、rpush、lpop、rpop、lrange(獲取列表片段)等。
應用場景:List 應用場景非常多,也是 Redis 最重要的數(shù)據(jù)結構之一,比如 Twitter 的關注列表,粉絲列表都可以用 List 結構來實現(xiàn)。
數(shù)據(jù)結構:List 就是鏈表,可以用來當消息隊列用。Redis 提供了 List 的 Push 和 Pop 操作,還提供了操作某一段的 API,可以直接查詢或者刪除某一段的元素。
實現(xiàn)方式:Redis List 的是實現(xiàn)是一個雙向鏈表,既可以支持反向查找和遍歷,更方便操作,不過帶來了額外的內(nèi)存開銷。
④Set 是 String 類型的無序集合。集合是通過 hashtable 實現(xiàn)的。Set 中的元素是沒有順序的,而且是沒有重復的。常用命令:sdd、spop、smembers、sunion 等。
應用場景:Redis Set 對外提供的功能和 List 一樣是一個列表,特殊之處在于 Set 是自動去重的,而且 Set 提供了判斷某個成員是否在一個 Set 集合中。
⑤Zset 和 Set 一樣是 String 類型元素的集合,且不允許重復的元素。常用命令:zadd、zrange、zrem、zcard 等。
使用場景:Sorted Set 可以通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的,即自動排序。
當你需要一個有序的并且不重復的集合列表,那么可以選擇 Sorted Set 結構。
和 Set 相比,Sorted Set關聯(lián)了一個 Double 類型權重的參數(shù) Score,使得集合中的元素能夠按照 Score 進行有序排列,Redis 正是通過分數(shù)來為集合中的成員進行從小到大的排序。
實現(xiàn)方式:Redis Sorted Set 的內(nèi)部使用 HashMap 和跳躍表(skipList)來保證數(shù)據(jù)的存儲和有序,HashMap 里放的是成員到 Score 的映射。
而跳躍表里存放的是所有的成員,排序依據(jù)是 HashMap 里存的 Score,使用跳躍表的結構可以獲得比較高的查找效率,并且在實現(xiàn)上比較簡單。
數(shù)據(jù)類型應用場景總結:
接下來就是連環(huán)炮式提問,越問越深(⊙o⊙),不免緊張了起來。
Redis 緩存你是怎么使用的?
實際項目中使用緩存會遇到哪些問題?
Redis緩存血崩、緩存穿透、緩存擊穿的區(qū)別?
Redis多線程模型?
Redis 和 Memcached 的區(qū)別?
Redis 的持久化機制?
Redis 持久化機制 AOF 和 RDB 有哪些不同之處?
Redis主從復制原理?
Redis主從復制如何保證數(shù)據(jù)一致性?
Redis數(shù)據(jù)同步原理?
Redis主從復制會存在哪些問題?解決方案是?
緩存的更新策略有幾種?分別有什么注意事項?
請介紹幾個可能導致 Redis 阻塞的原因
Redis 集群架構模式有哪幾種?
Redis 集群最大節(jié)點個數(shù)是多少?
Redis 集群的主從復制模型是怎樣的?
請介紹一下 Redis 集群實現(xiàn)方案
Redis 集群會有寫操作丟失嗎?為什么?
Redis 慢查詢是什么?通過什么配置?
最終全部回答完后,面試官看了我一眼,看來你對Redis了解的很透徹啊,那接下來我們再約一下時間談談JVM性能優(yōu)化、高并發(fā)應用場景解決方案。
由于篇幅限制,所以不能全部一一的展示出來,這里就僅僅展示了一些關于Redis的面試相關的題集和解析,當然面試不可能也只問一部分的內(nèi)容,這只是其中的一部分,這里也整理一份關于Redis的面試題集,有需要的朋友麻煩幫忙轉發(fā),+V x:bjmsb2019即可獲得免費領取面試的領取方式!
Redis 51道面試題+解析
什么是Redis?
什么是緩存穿透?如何避免?什么是緩存雪崩?何如避免?
JVM調(diào)優(yōu)案例式實戰(zhàn)化指導
Java內(nèi)存區(qū)域
垃圾回收器和內(nèi)存分配策略
JVM的執(zhí)行子系統(tǒng)
編寫高效優(yōu)雅Java程序
深入了解性能優(yōu)化
MySQL性能優(yōu)化
事務
鎖
SQL優(yōu)化原則
JOIN的原理
執(zhí)行計劃與執(zhí)行明細
執(zhí)行流程
表結構對性能的影響
索引
我的Spring學習筆記
Spring類
Spring MVC
Spring AOP
Spring IOC
SpringBoot
SpringCloud
事務管理
俗話說的好,只要功夫深,鐵杵磨成針,平時準備好,面試不用慌。
而且還有更多的面試題庫及解析:《Java核心知識點整理》、《1000道互聯(lián)網(wǎng)Java工程師面試題》、《Java高級架構進階核心面試知識點》、《Java面試寶典》都可以免費領取噠。
《Java核心知識點整理》-283頁
《1000道互聯(lián)網(wǎng)Java工程師面試題》-485頁
《Java高級架構進階核心面試知識點》-178頁
《Java面試寶典》-150頁
只要功夫深,鐵杵磨成針。面試的學習資料都已經(jīng)整理完了,希望大家可以成功面試上自己心儀的公司。