最全Redis49題詳細答案:線程設計+哨兵+複製+事務+集群+持久化等

最全Redis49題詳細答案:線程設計+哨兵+複製+事務+集群+持久化等

繼續Java最全面試題答案系列篇,之前分享了mysql、spring、多線程等最全答案,文末有相關獲取方式哦~

Redis支持哪幾種數據類型?

支持多種類型的數據結構

1.string:最基本的數據類型,二進制安全的字符串,最大512M。

2.list:按照添加順序保持順序的字符串列表。

3.set:無序的字符串集合,不存在重複的元素。

4.sorted set:已排序的字符串集合。

5.hash:key-value對的一種集合。

最全Redis49題詳細答案:線程設計+哨兵+複製+事務+集群+持久化等

Redis主要有哪些功能?

1.哨兵(Sentinel)和複製(Replication)

Redis服務器毫無徵兆的罷工是個麻煩事,如何保證備份的機器是原始服務器的完整備份呢?這時候就需要哨兵和複製。

Sentinel可以管理多個Redis服務器,它提供了監控,提醒以及自動的故障轉移的功能,Replication則是負責讓一個Redis服務器可以配備多個備份的服務器。

Redis也是利用這兩個功能來保證Redis的高可用的

2.事務

很多情況下我們需要一次執行不止一個命令,而且需要其同時成功或者失敗。redis對事務的支持也是源自於這部分需求,即支持一次性按順序執行多個命令的能力,並保證其原子性。

3.LUA腳本

在事務的基礎上,如果我們需要在服務端一次性的執行更復雜的操作(包含一些邏輯判斷),則lua就可以排上用場了

4.持久化

redis的持久化指的是redis會把內存的中的數據寫入到硬盤中,在redis重新啟動的時候加載這些數據,從而最大限度的降低緩存丟失帶來的影響。

5.集群(Cluster)

單臺服務器資源的總是有上限的,CPU資源和IO資源我們可以通過主從複製,進行讀寫分離,把一部分CPU和IO的壓力轉移到從服務器上,這也有點類似mysql數據庫的主從同步。

在Redis官方的分佈式方案出來之前,有twemproxy和codis兩種方案,這兩個方案總體上來說都是依賴proxy來進行分佈式的,下面的內容有具體集群方案詳解。

Redis是單進程單線程的?

Redis是單進程單線程的,Redis利用隊列技術將併發訪問變為串行訪問,消除了傳統數據庫串行控制的開銷。

Redis為什麼是單線程的?

多線程處理會涉及到鎖,而且多線程處理會涉及到線程切換而消耗CPU。因為CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器內存或者網絡帶寬。單線程無法發揮多核CPU性能,不過可以通過在單機開多個Redis實例來解決。

其它開源軟件採用的模型

Nginx:多進程單線程模型

Memcached:單進程多線程模型

使用Redis的優勢?

1.速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)

2. 支持豐富數據類型,支持string,list,set,sorted set,hash

3.支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

4. 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

Redis單點吞吐量

單點TPS達到8萬/秒,QPS達到10萬/秒,補充下TPS和QPS的概念

1.QPS: 應用系統每秒鐘最大能接受的用戶訪問量

每秒鐘處理完請求的次數,注意這裡是處理完,具體是指發出請求到服務器處理完成功返回結果。可以理解在server中有個counter,每處理一個請求加1,1秒後counter=QPS。

2.TPS: 每秒鐘最大能處理的請求數

每秒鐘處理完的事務次數,一個應用系統1s能完成多少事務處理,一個事務在分佈式處理中,可能會對應多個請求,對於衡量單個接口服務的處理能力,用QPS比較合理。

Redis相比memcached有哪些優勢?

1.memcached所有的值均是簡單的字符串,Redis作為其替代者,支持更為豐富的數據類型

2.Redis的速度比memcached快很多

3.Redis可以持久化其數據

4.Redis支持數據的備份,即master-slave模式的數據備份。

Redis有哪幾種數據淘汰策略?

在Redis中,允許用戶設置最大使用內存大小server.maxmemory,當Redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。

1.volatile-lru:從已設置過期的數據集中挑選最近最少使用的淘汰

2.volatile-ttr:從已設置過期的數據集中挑選將要過期的數據淘汰

3.volatile-random:從已設置過期的數據集中任意挑選數據淘汰

4.allkeys-lru:從數據集中挑選最近最少使用的數據淘汰

5.allkeys-random:從數據集中任意挑選數據淘汰

6.noenviction:禁止淘汰數據

redis淘汰數據時還會同步到aof

Redis集群方案應該怎麼做?都有哪些方案?

1.twemproxy

2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 節點數量改變情況下,舊節點數據可恢復到新hash節點。

3.Redis cluster3.0自帶的集,特點在於他的分佈式算法不是一致性hash,而是hash槽的概念,以及自身支持節點設置從節點。

具體請查看

Redis讀寫分離模型

通過增加Slave DB的數量,讀的性能可以線性增長。為了避免Master DB的單點故障,集群一般都會採用兩臺Master DB做雙機熱備,所以整個集群的讀和寫的可用性都非常高。

讀寫分離架構的缺陷在於,不管是Master還是Slave,每個節點都必須保存完整的數據,如果在數據量很大的情況下,集群的擴展能力還是受限於單個節點的存儲能力,而且對於Write-intensive類型的應用,讀寫分離架構並不適合。

Redis數據分片模型

為了解決讀寫分離模型的缺陷,可以將數據分片模型應用進來。

可以將每個節點看成都是獨立的master,然後通過業務實現數據分片。

結合上面兩種模型,可以將每個master設計成由一個master和多個slave組成的模型。

Redis提供了哪幾種持久化方式?

1. Redis主要提供了兩種持久化機制:RDB和AOF;

2.RDB

默認開啟,會按照配置的指定時間將內存中的數據快照到磁盤中,創建一個dump.rdb文件,Redis啟動時再恢復到內存中。

Redis會單獨創建fork()一個子進程,將當前父進程的數據庫數據複製到子進程的內存中,然後由子進程寫入到臨時文件中,持久化的過程結束了,再用這個臨時文件替換上次的快照文件,然後子進程退出,內存釋放。

需要注意的是,每次快照持久化都會將主進程的數據庫數據複製一遍,導致內存開銷加倍,若此時內存不足,則會阻塞服務器運行,直到複製結束釋放內存;都會將內存數據完整寫入磁盤一次,所以如果數據量大的話,而且寫操作頻繁,必然會引起大量的磁盤I/O操作,嚴重影響性能,並且最後一次持久化後的數據可能會丟失;

3.AOF

以日誌的形式記錄每個寫操作(讀操作不記錄),只需追加文件但不可以改寫文件,Redis啟動時會根據日誌從頭到尾全部執行一遍以完成數據的恢復工作。包括flushDB也會執行。

主要有兩種方式觸發:有寫操作就寫、每秒定時寫(也會丟數據)。

因為AOF採用追加的方式,所以文件會越來越大,針對這個問題,新增了重寫機制,就是當日志文件大到一定程度的時候,會fork出一條新進程來遍歷進程內存中的數據,每條記錄對應一條set語句,寫到臨時文件中,然後再替換到舊的日誌文件(類似rdb的操作方式)。默認觸發是當aof文件大小是上次重寫後大小的一倍且文件大於64M時觸發。

當兩種方式同時開啟時,數據恢復Redis會優先選擇AOF恢復。一般情況下,只要使用默認開啟的RDB即可,因為相對於AOF,RDB便於進行數據庫備份,並且恢復數據集的速度也要快很多。

開啟持久化緩存機制,對性能會有一定的影響,特別是當設置的內存滿了的時候,更是下降到幾百reqs/s。所以如果只是用來做緩存的話,可以關掉持久化。

Redis常見性能問題和解決方案?

(1) Master最好不要做任何持久化工作,如RDB內存快照和AOF日誌文件

(2) 如果數據比較重要,某個Slave開啟AOF備份數據,策略設置為每秒同步一次

(3) 為了主從複製的速度和連接的穩定性,Master和Slave最好在同一個局域網內

(4) 儘量避免在壓力很大的主庫上增加從庫

(5) 主從複製不要用圖狀結構,用單向鏈表結構更為穩定,即:Master

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

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

Redisson、Jedis、lettuce等等,官方推薦使用Redisson。

Redis哈希槽的概念?

Redis集群沒有使用一致性hash,而是引入了哈希槽的概念,當需要在 Redis 集群中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。

Redis集群最大節點個數是多少?

Redis集群預分好16384個桶(哈希槽)

Redis集群的主從複製模型是怎樣的?

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

Redis集群會有寫操作丟失嗎?為什麼?

Redis並不能保證數據的強一致性,這意味這在實際中集群在特定的條件下可能會丟失寫操作。

Redis集群之間是如何複製的?

異步複製

Redis如何做內存優化?

儘可能使用散列表(hashes),散列表(是說散列表裡面存儲的數少)使用的內存非常小,所以你應該儘可能的將你的數據模型抽象到一個散列表裡面。比如你的web系統中有一個用戶對象,不要為這個用戶的名稱,姓氏,郵箱,密碼設置單獨的key,而是應該把這個用戶的所有信息存儲到一張散列表裡面.

Redis回收進程如何工作的?

一個客戶端運行了新的命令,添加了新的數據。

Redi檢查內存使用情況,如果大於maxmemory的限制, 則根據設定好的策略進行回收。

Redis回收使用的是什麼算法?

LRU算法

Redis有哪些適合的場景?

1)Session共享(單點登錄)

2)頁面緩存

3)隊列

4)排行榜/計數器

5)發佈/訂閱

詳情可以參考


以上就是最全Redis詳細答案總結,以下最新總結的最全2018阿里集團高級Java必考題範圍和答案,包含必考的:MySQL(最全60題)、Spring(最全71題)、多線程、JVM等的答案,用於參考~


最全阿里高級Java必考題與答案

最全Redis49題詳細答案:線程設計+哨兵+複製+事務+集群+持久化等

答案獲取方式

無套路,發送關鍵詞 【阿里】即可獲得詳細答案鏈接!

最全Redis49題詳細答案:線程設計+哨兵+複製+事務+集群+持久化等


分享到:


相關文章: