面試集錦(一)redis與nginx

zhusir發表於2018-08-21

redis的概念

redis是一個基於記憶體的key-value的nosql資料庫

redis的資料結構及應用場景

(1)string: key-value形式,用作會話快取及全頁快取

(2)hash:字典

(3)list: 列表,實現訊息佇列

(4)set:集合,利用唯一性可以用於排序,可以資料持久化

(5)sorted set: 有序集合,用於實現優先佇列,給每條訊息加上唯一的序號,可以用作排行榜和計數器

redis分散式鎖

原生實現

(1)setnx命令,返回1則獲得鎖

(2)如果為0,則使用get命令獲得鎖的超時時間,當超時時間小於當前時間時,說明已經過期,再使用getset命令加鎖即可

(3)鎖是由某個程式加的,必須由哪個程式釋放,如果不釋放會死鎖。(最壞的情況就是超時自動刪除key)

分散式

redission實現,其中的lock方法已經避免了死鎖

解鎖:使用del命令

會出現的問題:在分散式情況下,A程式獲取到鎖,在超時時間內沒有完成,導致鎖自動釋放了,此時B程式獲得鎖,然後釋放就會出現B將A的釋放

解決辦法:在解鎖的時候判斷鎖是不是自己加的,所以在加鎖的時候需要傳遞一個引數value,將此引數作為key的value,解鎖時只要對比value是否相等就行了。

在設定redis叢集並設定master/slave情況下可以避免一個redis down後所有鎖失效的情況

jedis和redission的區別

(1)兩個都是redis的客戶端,是redis的實現框架

(2)jedis呼叫的都是redis暴露的api,所以支援的方法多

(3)redission進行了封裝,方法較少,多用於分散式環境,解決了分散式鎖的問題

(4)redission是執行緒安全的,jedis是不安全的

redis分散式與主從配置

主從同步

1.master為主,slave為從,一般只有一個master

2.Master可讀可寫,Slaver只讀不寫

3.當master掛掉時,可以通過slave of no one命令將Slaver升級為Master,手動方式

4.可以通過sentinel哨兵模式監控Master,當Master掛掉時自動選舉Slaver變為Master,其它Slaver自動重連新的 Master

5.Master寫入後立即返回,幾乎同時將寫入非同步同步到各個Slaver,所以基本上延遲可以忽略

哨兵模式

哨兵的作用就是監控redis主、從資料庫是否正常執行,主出現故障自動將從資料庫轉換為主資料庫。(哨兵是一個單獨的程式)

    新的主剛被選出來,老的主恢復,這時老的主會變為新的從

    新的主被選出來一會一會老的主才回復,不會變為新主的從節點,而是一個獨立的節點。(當然可以通過哨兵的配置檔案修改為從節點)

其實sentinel也應該做成叢集,防止sentinel掛掉。

叢集

一個 redis 叢集包含 16384 個雜湊槽(hash slot),資料庫中的每個資料都屬於這16384個雜湊槽中的一個。叢集使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽。叢集中的每一個節點負責處理一部分雜湊槽。(這裡可採用一致性hash演算法。)

叢集至少需要3主3從,且每個例項使用不同的配置檔案,主從不用配置,叢集會自己選。當1個主故障,大家會給對應的從投票,把從立為主,若沒有從資料庫可以恢復則redis叢集就down了

nginx

1.用作反向代理伺服器,服務請求到nginx,由nginx負責轉發到內部伺服器

2.負載均衡伺服器,叢集環境下修改配置環境即可

    方法:輪詢,ip hash,權重,隨機,最小連線數

3.用作http伺服器,指向靜態資源(如檔案伺服器)




相關文章