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伺服器,指向靜態資源(如檔案伺服器)