redis---第四部分 獨立功能的實現

                           redis---第四部分 獨立功能的實現

1 發佈與訂閱

2 事務

3 Lua腳本

4 排序

5 二進制數組

6 慢查詢日誌

7 監視器


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 向監視器發送命令信息

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章