Java面試之Redis篇1

1. Redis 是什麼?都有哪些使用場景?

我們先來理解經典的CAP理論

一致性:是指從數據層面來看的一致性。

可用性:是指從系統層面的可用性。

容錯性:是指從網絡層面的的容錯性。

數據庫逐漸從關係數據庫向不同領域不同層次分化。隨着讀多寫少場景的出現,導致需要讀取數據的時間變慢,爲了提升性能,出現了數據庫緩存技術,對數據庫的讀取進行分離。web2.0時代,網民的生產力大增,存儲總量也在增加,目前還是讀多寫少模式,原有的緩存技術顯然不能滿足寫的壓力,所以,出現了分庫分表,實現讀寫分離。其中比較常用的一種緩存技術是用Redis做緩存。

Redis是什麼?

Redis是一個基於內存且支持持久化的key-value的NoSQL數據庫,其中每個key和value都是使用對象表示的,具有以以下特徵:多樣數據類型、持久化、主從同步。

和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。

在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的使用RDB快照的方式,把更新的數據寫入磁盤或者使用類似MySQL的AOF日誌方式把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。Redis支持將數據同步到多臺從數據庫上,這種特性對提高讀取性能非常有益。

Redis3.0版本允許單點故障,它沒有中心節點,各個節點地位一樣,擴展性很好,節點間的採用二進制通信,節點與客戶端採用ascII協議通信。

綜上所述,Redis可用於緩存、數據庫、消息中間件。

 

Redis 使用場景:

  • 記錄帖子點贊數、點擊數、評論數;

  • 緩存近期熱帖;

  • 緩存文章詳情信息;

  • 記錄用戶會話信息。

2. Redis 有哪些功能?

  • 數據緩存功能

  • 分佈式鎖的功能

  • 支持數據持久化

  • 支持事務

  • 支持消息隊列

3. Redis 和 memcache 有什麼區別?

  • 存儲方式不同:memcache 把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小;Redis 有部份存在硬盤上,這樣能保證數據的持久性。

  • 數據支持類型:memcache 對數據類型支持相對簡單;Redis 有複雜的數據類型。

  • 使用底層模型不同:它們之間底層實現方式,以及與客戶端之間通信的應用協議不一樣,Redis 自己構建了 vm 機制,因爲一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

  • value 值大小不同:Redis 最大可以達到 1gb;memcache 只有 1mb。

4. Redis 爲什麼是單線程的?

因爲 cpu 不是 Redis 的瓶頸,Redis 的瓶頸最有可能是機器內存或者網絡帶寬。既然單線程容易實現,而且 cpu 又不會成爲瓶頸,那就順理成章地採用單線程的方案了。

關於 Redis 的性能,官方網站也有,普通筆記本輕鬆處理每秒幾十萬的請求。

而且單線程並不代表就慢 nginx 和 nodejs 也都是高性能單線程的代表。

5. 什麼是緩存穿透?怎麼解決?

緩存穿透:指查詢一個一定不存在的數據,由於緩存是不命中時需要從數據庫查詢,查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到數據庫去查詢,造成緩存穿透。

解決方案:最簡單粗暴的方法如果一個查詢返回的數據爲空(不管是數據不存在,還是系統故障),我們就把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鐘。

6. Redis 支持的數據類型有哪些?

Redis 支持的數據類型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。

7. Redis 支持的 Java 客戶端都有哪些?

支持的 Java 客戶端有 Redisson、jedis、lettuce 等。

8. jedis 和 Redisson 有哪些區別?

  • jedis:提供了比較全面的 Redis 命令的支持。

  • Redisson:實現了分佈式和可擴展的 Java 數據結構,與 jedis 相比 Redisson 的功能相對簡單,不支持排序、事務、管道、分區等 Redis 特性。

9. 怎麼保證緩存和數據庫數據的一致性?

  • 合理設置緩存的過期時間。

  • 新增、更改、刪除數據庫操作時同步更新 Redis,可以使用事物機制來保證數據的一致性。

10. Redis 持久化有幾種方式?

Redis 的持久化有兩種方式,或者說有兩種策略:

  • RDB(Redis Database):指定的時間間隔能對你的數據進行快照存儲。

  • AOF(Append Only File):每一個收到的寫命令都通過write函數追加到文件中。

11. Redis 怎麼實現分佈式鎖?

Redis 分佈式鎖其實就是在系統裏面佔一個“坑”,其他程序也要佔“坑”的時候,佔用成功了就可以繼續執行,失敗了就只能放棄或稍後重試。

佔坑一般使用 setnx(set if not exists)指令,只允許被一個程序佔有,使用完調用 del 釋放鎖。

12. Redis 分佈式鎖有什麼缺陷?

Redis 分佈式鎖不能解決超時的問題,分佈式鎖有一個超時時間,程序的執行如果超出了鎖的超時時間就會出現問題。

13. Redis 如何做內存優化?

儘量使用 Redis 的散列表,把相關的信息放到散列表裏面存儲,而不是把每個字段單獨存儲,這樣可以有效的減少內存使用。比如將 Web 系統的用戶對象,應該放到散列表裏面再整體存儲到 Redis,而不是把用戶的姓名、年齡、密碼、郵箱等字段分別設置 key 進行存儲。

14. Redis 淘汰策略有哪些?

  • volatile-lru:從已設置過期時間的數據集(server. db[i]. expires)中挑選最近最少使用的數據淘汰。

  • volatile-ttl:從已設置過期時間的數據集(server. db[i]. expires)中挑選將要過期的數據淘汰。

  • volatile-random:從已設置過期時間的數據集(server. db[i]. expires)中任意選擇數據淘汰。

  • allkeys-lru:從數據集(server. db[i]. dict)中挑選最近最少使用的數據淘汰。

  • allkeys-random:從數據集(server. db[i]. dict)中任意選擇數據淘汰。

  • no-enviction(驅逐):禁止驅逐數據。

15. Redis 常見的性能問題有哪些?該如何解決?

  • 主服務器寫內存快照,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以主服務器最好不要寫內存快照。

  • Redis 主從複製的性能問題,爲了主從複製的速度和連接的穩定性,主從庫最好在同一個局域網內。

發佈了33 篇原創文章 · 獲贊 29 · 訪問量 4793
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章