6月份,我不自量力的面試了某裏的 Java 開發崗位,迎面走來一位風塵僕僕的中年男子,手裏拿着屏幕還亮着的 Mac。他衝着我禮貌的笑了笑,然後說了句“不好意思,讓你久等了”,然後示意我坐下,說:“我們開始吧,看了你的簡歷,覺得你對 Redis 應該掌握的不錯,我們今天就來討論下 Redis……”。我想:“來就來,兵來將擋水來土掩”。
Redis 是什麼
面試官:你先來說下 Redis 是什麼吧!
我:(這不就是總結下 Redis 的定義和特點嘛)Redis 是 C 語言開發的一個開源的(遵從 BSD 協議)高性能鍵值對(key-value)的內存數據庫,可以用作數據庫、緩存、消息中間件等。
它是一種 NoSQL(not-only sql,泛指非關係型數據庫)的數據庫。
我頓了一下,接着說,Redis 作爲一個內存數據庫:
性能優秀,數據在內存中,讀寫速度非常快,支持併發 10W QPS。
單進程單線程,是線程安全的,採用 IO 多路複用機制。
豐富的數據類型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
支持數據持久化。
可以將內存中數據保存在磁盤中,重啓時加載。主從複製,哨兵,高可用。
可以用作分佈式鎖。
可以作爲消息中間件使用,支持發佈訂閱。
五種數據類型
面試官:總結的不錯,看來是早有準備啊。剛來聽你提到 Redis 支持五種數據類型,那你能簡單說下這五種數據類型嗎?
我:當然可以,但是在說之前,我覺得有必要先來了解下 Redis 內部內存管理是如何描述這 5 種數據類型的。
說着,我拿着筆給面試官畫了一張圖:
我:首先 Redis 內部使用一個 redisObject 對象來表示所有的 key 和 value。
redisObject 最主要的信息如上圖所示:type 表示一個 value 對象具體是何種數據類型,encoding 是不同數據類型在 Redis 內部的存儲方式。
比如:type=string 表示 value 存儲的是一個普通字符串,那麼 encoding 可以是 raw 或者 int。
我頓了一下,接着說,下面我簡單說下 5 種數據類型:
①String 是 Redis 最基本的類型,可以理解成與 Memcached一模一樣的類型,一個 Key 對應一個 Value。Value 不僅是 String,也可以是數字。
String 類型是二進制安全的,意思是 Redis 的 String 類型可以包含任何數據,比如 jpg 圖片或者序列化的對象。String 類型的值最大能存儲 512M。
②Hash是一個鍵值(key-value)的集合。Redis 的 Hash 是一個 String 的 Key 和 Value 的映射表,Hash 特別適合存儲對象。常用命令:hget,hset,hgetall 等。
③List 列表是簡單的字符串列表,按照插入順序排序。可以添加一個元素到列表的頭部(左邊)或者尾部(右邊) 常用命令:lpush、rpush、lpop、rpop、lrange(獲取列表片段)等。
應用場景:List 應用場景非常多,也是 Redis 最重要的數據結構之一,比如 Twitter 的關注列表,粉絲列表都可以用 List 結構來實現。
數據結構:List 就是鏈表,可以用來當消息隊列用。Redis 提供了 List 的 Push 和 Pop 操作,還提供了操作某一段的 API,可以直接查詢或者刪除某一段的元素。
實現方式:Redis List 的是實現是一個雙向鏈表,既可以支持反向查找和遍歷,更方便操作,不過帶來了額外的內存開銷。
④Set 是 String 類型的無序集合。集合是通過 hashtable 實現的。Set 中的元素是沒有順序的,而且是沒有重複的。常用命令:sdd、spop、smembers、sunion 等。
應用場景:Redis Set 對外提供的功能和 List 一樣是一個列表,特殊之處在於 Set 是自動去重的,而且 Set 提供了判斷某個成員是否在一個 Set 集合中。
⑤Zset 和 Set 一樣是 String 類型元素的集合,且不允許重複的元素。常用命令:zadd、zrange、zrem、zcard 等。
使用場景:Sorted Set 可以通過用戶額外提供一個優先級(score)的參數來爲成員排序,並且是插入有序的,即自動排序。
當你需要一個有序的並且不重複的集合列表,那麼可以選擇 Sorted Set 結構。
和 Set 相比,Sorted Set關聯了一個 Double 類型權重的參數 Score,使得集合中的元素能夠按照 Score 進行有序排列,Redis 正是通過分數來爲集合中的成員進行從小到大的排序。
實現方式:Redis Sorted Set 的內部使用 HashMap 和跳躍表(skipList)來保證數據的存儲和有序,HashMap 裏放的是成員到 Score 的映射。
而跳躍表裏存放的是所有的成員,排序依據是 HashMap 裏存的 Score,使用跳躍表的結構可以獲得比較高的查找效率,並且在實現上比較簡單。
數據類型應用場景總結:
接下來就是連環炮式提問,越問越深(⊙o⊙),不免緊張了起來。
- Redis 緩存你是怎麼使用的?
- 實際項目中使用緩存會遇到哪些問題?
- Redis緩存血崩、緩存穿透、緩存擊穿的區別?
- Redis多線程模型?
- Redis 和 Memcached 的區別?
- Redis 的持久化機制?
- Redis 持久化機制 AOF 和 RDB 有哪些不同之處?
- Redis主從複製原理?
- Redis主從複製如何保證數據一致性?
- Redis數據同步原理?
- Redis主從複製會存在哪些問題?解決方案是?
- 緩存的更新策略有幾種?分別有什麼注意事項?
- 請介紹幾個可能導致 Redis 阻塞的原因
- Redis 集羣架構模式有哪幾種?
- Redis 集羣最大節點個數是多少?
- Redis 集羣的主從複製模型是怎樣的?
- 請介紹一下 Redis 集羣實現方案
- Redis 集羣會有些操作丟失嗎?爲什麼?
- Redis 慢查詢是什麼?通過什麼配置?
最終全部回答完後,面試官看了我一眼,看來你對Redis瞭解的很透徹啊,那接下來我們再約一下時間談談JVM性能優化、高併發應用場景解決方案。
由於文章篇幅限制不能全部展示,這裏只是展示的一部分Redis相關的面試題集,一部分解析,更多的Redis面試整理解析可以看整理的《大廠Redis高頻面試75題解析文檔》,有需要的朋友麻煩幫忙轉發後私信回覆我【面試】即可獲取資料的免費領取方式!
Redis緩存
Redis實現分佈式鎖
JVM性能調優
- Java內存區域
- 垃圾回收器和內存分配策略
- JVM的執行子系統
- 編寫高效優雅Java程序
- 深入瞭解性能優化
MySQL性能優化
- 事務
- 鎖
- SQL優化原則
- JOIN的原理
- 執行計劃與執行明細
- 執行流程
- 表結構對性能的影響
- 索引
我的Spring學習筆記
- Spring類
- Spring MVC
- Spring AOP
- Spring IOC
- 事務管理
spring學習思維導圖
俗話說的好,只要功夫深,鐵杵磨成針,平時準備好,面試不用慌。
還有更多的面試刷題庫:《1000道互聯網高頻面試解析》《batj大廠面試題總結》《JAVA核心面試知識點整理》
《1000道互聯網高頻面試解析》
本篇PDF文檔包含各大互聯網公司面試高頻題,刷完基本面試沒有問題,只是面試造飛機,工作擰螺絲就得看自己啦!
《batj大廠面試題總結》
《JAVA核心面試知識點整理》
轉發+轉發+轉發