1.Redis簡介
- Redis是一個高性能的key-value內存數據庫,支持持久化,可將數據保存在磁盤,重啓時加載;
- Redis是單線程模型,所有操作都是原子性的。單個操作是原子性的,多個操作也支持事務;
- Redis單機支持多個數據庫,每個數據庫的數據是隔離的。數據庫從0開始的遞增數字命名,默認支持16個數據庫。集羣沒有數據庫的概念;
2.Redis數據類型
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(sorted set有序集合)
3.Redis發佈訂閱
- 一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息;
- 一個隊列可以被多個消費者同時訂閱,當有消息到達時,會將該消息依次發送給每個訂閱者;
- 特性
- 可靠性
- 不可靠發佈者發佈消息,如沒有訂閱者或者訂閱者中途掉線,消息將丟失;
- 實時性
- 實時性高
- 持久性
- 是針對於整個redis緩存的內容持久化;
- 隊列監控
- 監控比較困難
- 可靠性
- 特點
- 輕量級,低延遲,高併發,低可靠性;
- 適用於對可靠性要求不高的異步交互場景;
4.Redis事務
- Redis事務可一次執行多個命令:
- 在EXEC前把操作放入隊列緩存;
- 在EXEC後執行事務,任意命令執行失敗,其餘的命令依然被執行;
- 在事務執行中,不能插入其它操作;
- 批量指令非原子化操作,某條指令失敗不會回滾已做指令,也不會取消後續指令
- 事務執過程:
- multi: 開始事務;
- 命令入隊;
- exec: 執行事務;
- 相關命令:
- watch key1 key2 … : 監視一或多個key(類似樂觀鎖);
- multi: 事務開始;
- exec: 執行事務;
- discard : 取消事務(放棄事務塊中的所有命令);
- unwatch : 取消watch對所有key的監控;
- 說明
- 若在事務隊列中存在命令性錯誤,則所有命令都不會執行;
- 若在事務隊列中存在語法性錯誤,則其他正確命令會被執行,錯誤命令拋出異常;
- watch類似於樂觀鎖,在事務提交時,果watch監控的任何KEY的值被更改,則事務隊列將不會被執行;
- EXEC執行事務後,無論事務是否成功, WARCH的監控都會取消;
5.Redis集羣
- 主從模式
- 一個主redis服務器,多個從服務器。在master節點寫入數據後,同步到slave節點,實現數據的備份,並且可以在slave節點進行查詢,實現讀寫分離;
- 優點
- 數據備份
- 讀寫分離
- 高可靠性
- slave節點下線不影響讀取其他slave節點和寫master節點,啓動後可恢復數據;
- master節點下線,不影響讀slave節點,可手動切換到其它master節點;
- 缺點
- master節點下線,需要手動切換master節點,不能自動切換;
- 每個節點都保存全量數據,對每個節點的資源要求較高,且不易擴展;
- 哨兵(sentinel)模式
- 一個或多個Sentinel實例組成的Sentinel系統監視任意多個redis主服務器和下屬的所有從服務器,在被監視的主服務器下線時,自動將下屬的某個從服務器升級爲新的主服務器;
- 優點
- 數據備份
- 讀寫分離
- 高可靠性
- master節點下線,Sentinel會自動推舉其它slave節點爲master節點,不影響系統運行;
- 易維護
- 相對於集羣模式,需要的服務器數量較少,易於維護,適用於數據量一般的場景;
- 缺點
- 每個節點都保存全量數據,對每個節點的資源要求較高,且不易擴展;
- 集羣(cluster)模式
- 採用去中心化的思想,使用hash slot方式將16348個hash slot覆蓋到所有節點上,每個節點保存一部分數據;
- 取值時先獲取到對key對應的hash slot,然後找到他的hash slot所在節點,由當前訪問節點從hash slot所在節點取數據;
- 優點
- 負載均衡
- 每個節點保存部分數據,易擴展
- 高可靠性
- 缺點
- 難維護
- 一般至少需要三主三從架構,相對於哨兵模式難於維護,適用於數據量比較大的場景
- 難維護