redis---第四部分 獨立功能的實現
1 發佈與訂閱
# 發佈與訂閱
Redis的發佈與訂閱功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令組成
## 頻道的訂閱與退訂
Redis將所有頻道的訂閱關係都保存在服務器狀態的pubsub_channels字典裏面,資格字典的鍵是某個被訂閱的頻道,而鍵的值則是一個鏈表,鏈表裏面記錄了所有訂閱這個頻道的客戶端
## 模式的訂閱與退訂
1 頻道的訂閱與退訂
訂閱頻道
退訂頻道
2 模式的訂閱與退訂
訂閱模式
退訂模式
3 發送消息
將消息發送給頻道訂閱者
將消息發送給模式訂閱者
4 查看訂閱信息
PUBSUB CHANNELS
PUBSUB NUMSUB
PUBSUB NUMPAT
訂閱模式和頻道到底有什麼區別
2 事務
Redis通過MULTI、EXEC、WATCH等命令來實現事務功能。
一個事務從開始到結束通常會經歷以下三個階段:
1. 事務開始
2. 命令入隊
3. 事務執行
1 事務的實現
1事務開始
MULTI
2 命令入隊
3 事務隊列
4 執行事務
EXEC
2 WATCH命令的實現
## WATCH命令的實現
WATCH命令是一個樂觀鎖,它可以在EXEC命令執行之前,監視任意數量的數據庫鍵,並在EXEC命令執行時,檢查被監視的鍵是否至少有一個已經被修改過了,如果是的話,服務器將拒絕執行事務,並向客戶端返回代表事務執行失敗的空回覆
當服務器接收到一個客戶端發來的EXEC命令時,服務器會根據這個客戶端是否打開了`REDIS_DIRTY_CAS`標識來決定是否執行事務。
1 使用WATCH命令監視數據庫鍵
2 監視機制的觸發
3 判斷事務是否安全
4 一個完整的WATCH事務執行過程
3 事務的ACID性質
原子性
一致性
隔離性
耐久性
3 Lua腳本
1 創建並修改Lua環境
創建Lua環境
載入函數庫
創建redis 全局表格
使用Redis自制的隨機函數來替換Lua原有的隨機函數
創建排序輔助函數
創建redis.pcall 函數的錯誤報告輔助函數
保護Lua的全局環境
將Lua環境保存到服務器狀態的lua屬性裏面
2 Lua環境協作組件
僞客戶端
lua_scripts字典
3 EVAL命令的實現
定義腳本數據
將腳本保存到lua_scripts字典
執行腳本函數
4 EVALSHA命令的實現
5 腳本管理命令的實現
SCRIPT FLUSH
SCRIPT EXISTS
SCRIPT LOAD
SCRIPT KILL
6 腳本複製
複製EVAL命令、SCRIPT FLUSH命令和SCRIPT LOAD命令
EVAL SCRIPT FLUSH SCRIPT LOAD
複製EVALSHA命令
4 排序
1 SORT<key> 命令的實現
2 ALPHA選項的實現
3 ASC選項和DESC選項的實現
4 BY選項的實現
5 帶有ALPHA選項的BY選項的實現
6 LIMIT選項的實現
7 GET選項的實現
8 STORE選項的實現
9 多個選項的執行順序
# 排序
Redis的`SORT`命令可以對列表鍵、集合鍵或者有序集合鍵的值進行排序
`SORT`命令的最簡單執行形式爲:`SORT <key>`
```c
// 用於保存被排序值及其權重的結構
typedef struct _redisSortObject {
// 被排序鍵的值
robj *obj;
// 權重
union {
// 排序數字值時使用
double score;
// 排序字符串時使用
robj *cmpobj;
} u;
} redisSortObject;
```
5 二進制數組
1 位數組的表示
2 GETBIT命令的實現
3 SETBIT命令的實現
4 BITCOUNT命令的實現
二進制位統計算法 遍歷算法
二進制位統計算法 查表算法
二進制位統計算法 variable-precision SWAR算法
二進制位統計算法 Redis算法
5 BITOP 命令的實現
# 二進制位數組
Redis提供了SETBIT、GETBIT、BITCOUNT、BITOP四個命令用於處理二進制數組
## 位數組的表示
Redis使用字符串對象來表示位數組,因爲字符串對象使用的SDS數據結構是二進制安全的,所以程序可以直接使用SDS結構來保存位數組,並使用SDS結構的操作函數來處理位數組。
## BITCOUNT命令的實現
### 二進制位統計算法(1):遍歷算法
遍歷算法雖然實現起來簡單,但效率非常低,因爲這個算法在每次循環中只能檢查一個二進制位的值是否爲1,所以檢查操作執行的次數將與位數組包含的二進制位的數量成正比
### 二進制位統計算法(2):查表算法
查表法是一種比遍歷算法更好的統計方法,但受限於查表法帶來的內存壓力,以及緩存不命中可能帶來的影響,我們只能考慮創建鍵長爲8位或者鍵長爲16位的表,而這兩種錶帶來的效率提升,對於處理非常長的位數組來說任然遠遠不夠。
### 二進制位統計算法(3):variable-precision SWAR算法
### 二進制位統計算法(4):Redis的實現
`BITCOUNT`命令的實現用到了查表和`variable precision SWAR`兩種算法:
如果未處理的二進制位的數量小於128位,那麼程序使用查表算法來計算二進制位的漢明重量
6 慢查詢日誌
# 慢查詢日誌
Redis的慢查詢日誌功能用於記錄執行時間超過給定時長的命令請求,用戶可以通過這個功能產生的日誌來監視和優化查詢速度
1 慢查詢記錄的保存
2 慢查詢日誌的閱覽和刪除
3 添加新日誌
7 監視器
1成爲監視器
2 向監視器發送命令信息
。