1.數據庫
- Redis服務器一般包含多個db,默認16個。
- 切換數據庫
每個redis客戶端都有自己的目標數據庫,默認為0,可以通過select 1,切換數據庫。
- 設置鍵的生存周期和過期時間
PTTL key
獲取key的有效毫秒數
TTL key
獲取key的有效時間(單位:秒)
PERSIST key
移除key的過期時間
EXPIREAT key timestamp
設置一個UNIX時間戳的過期時間
PEXPIRE key milliseconds
設置一個key的過期的毫秒數
PEXPIREAT key milliseconds-timestamp
設置一個帶毫秒的UNIX時間戳的過期時間
- 過期鍵的刪除策略
- 定時刪除:設置鍵的過期時間時,自動創建timer,讓定時器自動立即刪除。
- 惰性刪除:在獲取鍵值時,判斷是否過期,如果過期,則刪除。
- 定期刪除:每隔一段時間對數據庫做一次檢測,刪除過期鍵值
- Redis的刪除策略:惰性刪除+定期刪除
2.RDB持久化
RDB持久化是對數據庫狀態磁盤存儲。
RDB文件是一個經過壓縮的二進制文件。
通過RDB文件可以恢復數據庫狀態。
通過SAVE、BGSAVE命令可以備份數據庫
Save命令會阻塞Redis服務器進程。
BGSave會派生一個子進程進行備份,原有進程繼續提供服務。
RDB文件在還原時,服務是阻塞的。
可以在Redis配置文件中,設置BGSAVE的自動備份策略。例如:
Save 900 1 --服務器在900s內,如果有大於1次修改,觸發自動備份
Save 300 10 --服務器在300s內,如果有大於10次的修改,觸發自動備份
Save 60 10000 --服務器在60s內,如果有大於10000次的修改,觸發自動備份
Redis服務器每個100毫秒(默認)會檢測一次自動備份策略是否滿足
因為AOF的更新頻率比RDB要高,如果Redis開啟了兩個備份策略,那么AOF會先於RDB還原數據庫狀態。支持關閉AOF的時候,RDB才有效。
RDB文件結構:其中REDIS、EOF是常量
3.AOF持久化
AOF:Appent only file
原理:通過保存數據庫的寫命令來記錄數據庫狀態的。
Redis服務器會在內存中保存一個寫命令緩沖區,通過appendfsync可配置寫入AOF文件的頻率。
AOF文件還原過程
AOF重寫:AOF是通過保存寫命令來記錄數據庫狀態的。隨着時間的變化,AOF文件會越來越大,會存在很多垃圾命令。AOF重寫就是解決此問題的。AOF重寫不是對就文件的整理,而是對數據庫狀態的重新備份。
4.事件
文件事件:Redis客戶端與服務器的通訊會產生文件事件。文件事件就是服務器對socket操作的抽象。
時間事件:特定時間指定特定動作。
5.發布訂閱
發布訂閱(pub/sub)是一種消息通信模式,主要的目的是解耦消息發布者和消息訂閱者之間的耦合,這點和設計模式中的觀察者模式比較相似。
pub /sub不僅僅解決發布者和訂閱者直接代碼級別耦合也解決兩者在物理部署上的耦合。redis作為一個pub/sub server,在訂閱者和發布者之間起到了消息路由的功能
訂閱者可以通過subscribe和psubscribe命令向redis server訂閱自己感興趣的消息類型,redis將消息類型稱為通道(channel)。
當發布者通過publish命令向redis server發送特定類型的消息時
訂閱該消息類型的全部client都會收到此消息。這里消息的傳遞是多對多的。一個client可以訂閱多個 channel,也可以向多個channel發送消息
redis的pub/sub還是有點太單薄(實現才用150行代碼)。在安全,認證,可靠性這方便都沒有太多支持。
6.事物
Redis事物提供了一種將多個命令請求打包,然后一次性、按順序的執行多個命令的機制。並且在事物執行期間,服務器不會中斷事物,而去響應其他客戶端的命令請求。
事物從開始到結束經過三個階段:
- 事物開始:multi命令,將執行命令的客戶端從非事物狀態轉為事物狀態
- 命令入隊:當客戶端處於非事物狀態時,客戶端命令是被服務器立即執行的,但是客戶端處於事物狀態時,服務端收到的命令不會立即執行,而是進入一個隊列(Exec、discard、watch、multi命令除外)。
- 事物執行:當收到exec命令后,服務端會立即執行隊列中的命令。
Watch:給指定的key加鎖,只有當前客戶端可以修改,其他客戶端的修改都會導致事物不被執行(注意不是執行失敗)。
事物的原子性:Redis事物中的命令要么全部執行,不要一個都不執行,是具有原子性的。但是,沒有回滾機制,在命令列表中,即使第一個命令執行失敗了,后面命令也會被執行到。
事物的一致性:Redis通過謹慎的錯誤檢查和簡單的設計來保證事物的一致性。
入隊錯誤:命令語法錯誤,將導致事物無法執行。(2.6.5之前版本不支持)
執行錯誤:執行過程中出現錯誤的,出錯的命令不執行回滾,不影響其他命令。
服務端停機:RDB模式無影響、AOF模式無影響、不持久化模式無影響。
事物的隔離線:Redis使用單線程模式執行事務,Redis的事物總是串行執行的。
事物的耐久性:(耐久性:當一個事物執行完畢后,數據是存儲到磁盤中的)與具體的持久化策略有關系。
7.慢查詢日志
Redis慢查詢日志用於記錄執行時間超過給定值的命令請求。
Slowlog-log-slower-than:執行時間超過多少微秒,記錄日志
Slowlog-max-len:最多保存多少條慢日志。
慢日志查看:通過slowlog get命令可以獲取到
8.Monitor
redis客戶端可以通過monitor命令把自己變為監視器,通過此功能可以看到redis服務執行的命令請求。
9.數據庫復制
老版本:
新版本
從服務器離線后,SYNC命令變為PSYNC。
PSYNC具有兩種模式:完整重同步、部分重同步。完整重同步用於第一次同步的場景、部分重同步用於離線后同步的場景。
原理:從服務器每次更新后記錄偏移量,短線重新同步時,通過偏移量計算需要同步的命令。
心跳檢查
從服務器默認每秒向主服務器發送一次心跳檢測命令:replconf ack <replication_offset>.其中replication_offset是當前從服務器的偏移量。
命令主要有三個作用:
1.檢測主從服務器間的網絡狀態
2.輔助檢查min-slaves選項:當從服務器數量小於3個,或者三個從服務器的延遲值大於或者等於10秒,主服務器拒絕寫命令。
Min-slaves-to-write 3
Min-slaves-max-lag 10
3.檢測命令丟失
10.sentinal
Redis的HA官方解決方案
用途:
1.監控所有主從服務器
2.當主服務器下線后,自動把主服務器下屬的一個從服務器升級為主服務器。
11.集群
加入集群:一個Redis集群可有多個node組成。通過向一個階段發送:cluster meet <ip> <port>命令,把節點加入到集群中(需要啟用集群模式)
集群建立之后,每個node都具有一份完整的節點狀態信息。
槽指派:redis服務器通過對鍵分片的方式實現集群。整個數據庫被分為16384個槽(slot),數據庫中的每個鍵都被分配存儲到16384個槽中其中一個。集群的每個節點可以處理0到16384個槽。當16384個槽都被集群處理時,數據庫集群才處於上線狀態。
Slotnum= CRC16(key) & 16383
每個集群節點都完整了記錄了16384個槽與node直接的映射關系。可以通過命令:cluster addslots <slot>[<slot>…]為當前node添加槽。
客戶端根據Slot與Node的映射關系,處理來自於客戶端的數據請求。
從節點:可通過命令:Cluster replicate <node-id>,把一個集群中的node設置為當前服務器的主服務器。設置后,所有對node-id的寫命令都將在當前集群node中備份。
當主服務器down后,從服務器自動在從服務器中挑選一個從服務器並設置為主服務器,當down的主服務器還原后,自動設置為從服務器。