6月成功定級阿里P7,多虧啃完了這上百頁的Java高頻核心面試寶典

 

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核心面試知識點整理》

 

轉發+轉發+轉發 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章