發布與訂閱
1. 服務器狀態在pubsub_channels字典保存了所有頻道的訂閱關系:SUBSCRIBE命令負責將客戶端和被訂閱的頻道關聯到這個字典里面,而UNSUBSCRIBE命令則負責
? ? 解除客戶端和被退訂頻道之間的關聯。
2. 服務器狀態在pubsub_patterns鏈表保存了所有模式的訂閱關系:PSUBSCRIBLE命令負責將客戶端和被訂閱的模式記錄到這個鏈表中,而PUNSBUSCRIBLE命令則負
? ? 責移除客戶端和被退訂模式在鏈表中的記錄。
3. PUBLISH命令通過訪問pubsub_channels字典來向頻道的所有訂閱者發送消息,通過訪問pubsub_patterns鏈表來向所有匹配頻道的模式的訂閱者發消息。
4. PUBSUB命令的三個子命令都是通過讀取pubsub_channels字典和pubsub_patterns鏈表中的信息來實現的。
5. 鏈表統一來管理訂閱者。
?
?
事務
1. 事務提供了一種將多個命令打包,然后一次性、有序執行的機制
2. 多個命令被入隊到事務隊列中,然后按先進先出的順序執行
3. 事務在執行過程中不會被中斷,當事務隊列中的所有命令都被執行完畢之后,事務才會結束。
4. 帶有WATCH命令的事務會將客戶端和被監控的鍵在數據庫的watch_keys字典中進行關聯,當鍵被修改時,程序會將所有監視被修改鍵的客戶端的REDIS_DIRTY_CAS標志打開。
5. 只有在客戶端的REDIS_IDRTY_CAS標志未被打開時,服務器才會執行客戶端提交的事務,否則的話,服務器將拒絕執行客戶端提交的事務。
6. Redis事務總是具有ACID中的原子性、一致性和隔離性,當服務器運行在AOF持久化模式下,并且appendfsync選項值為always時,事務也具有耐久性。
7. Redis通過MULTI、EXEC、WATCH等命令來實現事務功能。事務提供了一種將多個命令請求打包,然后一次性、按順序地執行多個命令的機制,并且在事務執行期間,服務器
? ? 不會中斷事務而去執行其他客戶端請求,它會將事務中的所有命令都執行完。然后才會去處理其他客戶端的命令請求。
8. 一個事務從開始到結束通常會經歷一下三個階段:
? ? 1). 事務開始:MULTI
? ? 2). 命令入隊:
? ? 3). 事務執行:EXEC
9. 客戶端切換到事務狀態后,服務器會根據這個客戶端發來的不同命令執行不同的操作:
? ? 1). 如果發的命令為:EXEC、DISCARD 、WATCH 、MULTI 四個命令中的一個,那么服務器立即執行這個命令
? ? 2). 如果不是上面幾條命令,那么服務器并不會立即執行這個命令,而是將這個命令放入一個事務隊列中,然后向客戶端返回QUEUED回復。
10. WATCH命令是一個樂觀鎖,他可以在EXEC命令執行之前,監視任意數量的數據庫鍵,并在EXEC命令執行時,檢查被監視的鍵是否至少有一個已經被修改過了,如果是的話,服務器將拒絕執行事務。
? ? ? 并向客戶端返回代表事務執行失敗的空回復。
11. 監視機制的觸發:為被監視的鍵設置一個屬性值,當被監視的鍵被修改時,改變屬性,標記該鍵已被修改。事務執行前,檢查該屬性值。(思想)
12. Redis 不支持事務回滾機制,即使事務隊列中的某個命令在執行期間出現了錯誤,整個事務也會繼續執行下去,直到將事務隊列中的所有命令都執行完畢為止。
13. ACID :?
? ? ? 原子性(Atomicity):數據庫將事務中的多個操作當做一個整體來執行,服務器要么執行事務中所有的操作,要么就一個操作都不執行。Redis事務是原子性的,但不保證所有執行命令都成功。
? ? ? 一致性(Consistency) : 如果數據庫在執行事務之前是一致的,那么在事務執行之后,無論事務是否執行成功,數據庫也應該仍然是一致的。
? ? ? 隔離性(Isolation): 即使數據庫有多個事務并發執行,各個事務之間也不會互相影響,并且在并發狀態下執行的事務和串行執行的事務產生的結果完全相同。Redis使用單線程的方式來執行事務。
? ? ? 持久性(Durability):當一個事務執行完畢時,執行這個事務所得的結果已經被保存到永久性介質(比如磁盤)里面了,即使服務器在事務執行完畢之后停機,執行事務所得的結果也不會丟失。
?
?
慢查詢日志
1. Redis的慢查詢日志功能用于記錄執行時間超過指定時長的命令。用戶可以通過這個功能產生的日志來監控和優化查詢速度。
2. Redis服務器將所有的慢查詢日志保存在服務器狀態的slowlog鏈表中,每個鏈表節點都包含了一個slowlogEntry結構,每個slowlogEntry結構代表一個慢查詢日志。
3. 打印和刪除慢查詢日志可以通過遍歷slowlog鏈表來完成。
4. slowlog鏈表的長度就是服務器所保存慢查詢日志的數量。
5. 新的慢查詢日志會被添加到slowlog鏈表的表頭,如果日志的數量超過slowlog-max-len選項的值,那么多出來的日志會被刪除。
6. 服務器配置有兩個和慢查詢日志相關的選項:
? ? 1). slowlog-log-slower-than選項指定執行時間超過多少微秒的命令請求會被記錄到日志上。
? ? 2). slowlog-max-len選項指定服務器最多保存多少條慢查詢日志。服務器使用先進先出的方式保存多條慢查詢日志,當服務器存儲的慢查詢日志數量等于slowlog-max-len選項的值時,服務器在添加
? ? ? ? ?一條新日志前,會現將舊的一條慢查詢日志刪除。
7. 使用SLOWLOG GET 命令查看服務器所保存的慢查詢日志
8. 添加新日志:在每次執行命令之前和之后,程序都會記錄微秒格式的UNIX時間戳,這兩個時間戳之間的差就是服務器執行命令所耗費的時長,服務器根據這個時長決定是否保存這條查詢日志。
?
?
監視器:
1. 客戶端通過執行MONITOR命令,將客戶端轉換成監視器,接收并打印服務器處理每個命令請求的相關信息。
2. 當一個客戶端從普通客戶端變成監視器時,該客戶端的REDIS_MONITOR標識會被打開。
3. 服務器將所有監視器都記錄在monitors鏈表中。
4. 每次處理命令請求時,服務器都會遍歷monitors鏈表,將相關信息發送給監視器。
?