03.03 Java開發崗面試寶典:分佈式相關問答詳解

今天千鋒廣州Java小編就給大家分享一些就業面試寶典之分佈式相關問題,一起來看看吧!

Java開發崗面試寶典:分佈式相關問答詳解

1.Redis和Memcache的區別?

1、存儲方式 Memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。 Redis有部份存在硬盤上,redis可以持久化其數據

2、數據支持類型 memcached所有的值均是簡單的字符串,redis作為其替代者,支持更為豐富的數據類型 ,提供list,set,zset,hash等數據結構的存儲

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

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

5、redis的速度比memcached快很多

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

2.使用Redis有哪些好處?

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

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

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

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

3.什麼是redis持久化?rdb和aof的比較?

持久化就是把內存的數據寫到磁盤中去,防止服務宕機了內存數據丟失。

比較:

1、aof文件比rdb更新頻率高,優先使用aof還原數據。

2、aof比rdb更安全也更大

3、rdb性能比aof好

4、如果兩個都配了優先加載AOF

4.Redis最適合的場景?

(1)、會話緩存(Session Cache)

最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。

(2)、全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺。回到一致性問題,即使重啟了Redis實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。

再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。

此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

(3)、隊列

Reids在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平臺來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。

(4),排行榜/計數器

Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執行即可:

(5)、發佈/訂閱

最後(但肯定不是最不重要的)是Redis的發佈/訂閱功能。發佈/訂閱的使用場景確實非常多。我已看見人們在社交網絡連接中使用,還可作為基於發佈/訂閱的腳本觸發器,甚至用Redis的發佈/訂閱功能來建立聊天系統!

5.redis哈希槽的概念?

Redis 集群沒有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 個哈希槽,每個 key 通過 CRC16 校驗後對 16384 取模來決定放置哪個槽,集群的每個節點負責一部分 hash 槽。

6.怎麼理解Redis事務?

事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行,事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。

7.redis的淘汰策略有哪些?

noeviction:返回錯誤當內存限制達到並且客戶端嘗試執行會讓更多內存被使用的命令(大部分的寫入指令,但DEL和幾個例外)

allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數據有空間存放。

volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限於在過期集合的鍵,使得新添加的數據有空間存放。

allkeys-random: 回收隨機的鍵使得新添加的數據有空間存放。

volatile-random: 回收隨機的鍵使得新添加的數據有空間存放,但僅限於在過期集合的鍵。

volatile-ttl: 回收在過期集合的鍵,並且優先回收存活時間(TTL)較短的鍵,使得新添加的數據有空間存放。

8.redis有哪些數據結構?

String、List、Set、Zset(Sorted Set)、hash

9.redis 緩存穿透、緩存雪崩、緩存擊穿?

緩存穿透:無效ID,在redis緩存中查不到,去查詢DB,造成DB壓力增大。

解決方法:

1、解決方法1:布隆過濾器,提供一個很大的Bit-Map,提供多個hash函數,分別對查詢參數值【比如UUID】,進行求hash,然後分別對多個hash結果,在對應位置對比是否全為1或者某個位置為0,一旦有一個位置標識為0,表示本次查詢UUID,不存在於緩存,再去查詢DB.起到一個再過濾的效果。

2、解決方法2:把無效的ID,也在redis緩存起來,並設置一個很短的超時時間。

緩存雪崩:緩存同一時間批量失效,導致大量的訪問直接訪問DB

解決方法:

在做緩存時候,就做固定失效時間+隨機時間段,保證所有的緩存不會同一時間失效

緩存擊穿:在緩存失效的時候,會有高併發訪問失效的緩存【熱點數據】

解決方法:

最簡單的解決方法,就是將熱點數據設置永不超時!

第二個解決方法:對訪問的Key加上互斥鎖,請求的Key如果不存在,則加鎖,去數據庫取,新請求過來,如果相同KEy,則暫停10s再去緩存取值;如果Key不同,則直接去緩存取!

10.redis如何實現高併發?

redis通過一主多從,主節點負責寫,從節點負責讀,讀寫分離,從而實現高併發。


分享到:


相關文章: