redis中multi與pipeline介紹分析

2022-05-17 01:27:56 字數 1134 閱讀 8125

由於對redis快取中資料有批量操作,例如預熱快取資料,或者在列表頁批量去獲取快取資料,在使用了multi批量提交事務後,發現redis壓力高居不下,而使用了pipeline之後壓力回落了平常,也因為這個案例,特在此寫個分析與筆記。

標記乙個事務塊的開始。 事務塊內的多條命令會按照先後順序被放進乙個佇列當中,最後由 exec 命令原子性(atomic)地執行。

我用php擴充套件調起redis服務,執行,**如下:

$redis = new redis();

$redis->connect('127.0.0.1',6379);

$handle = $redis->multi();

$handle->incr('a');

$handle->incr('b');

$handle->exec();

複製**

redis客戶端與服務端建立連線後,multi標記事務開始,之後每次執行,服務端返回queued佇列標誌。檢視redis原始碼src/multi.c檔案:

void queuemulticommand(client *c) 

複製**

在上述原始碼中可以看到redis服務端每次會把事務塊中的命令儲存到記憶體中,上述簡介已經解釋過最後通過exec命令執行,再看下面示例圖的返回結果可以了解到redis服務端一次性返回所有命令執行返回結果。

客戶端將執行的命令寫入到緩衝中,最後由exec命令一次性傳送給redis執行返回。

同樣,用相關**呼叫redis抓包;

$redis = new redis();

$redis->connect('127.0.0.1',6379);

$handle = $redis->pipeline();

$handle->incr('a');

$handle->incr('b');

$handle->exec();

複製**

繼續用wireshark抓包,如下圖所示

這上面的簡要分析一下,pipeline管道操作是需要客戶端與服務端的支援,客戶端將命令寫入緩衝,最後再通過exec命令傳送給服務端,服務端通過命令拆分,逐個執行返回結果。

Redis 事務 Multi和CAS 的實現

redis也有事務的功能,但是這個事務可能跟mysql之類的rdbms不同。官網上的 transactions 介紹了redis中的事務。redis中使用multi和exec命令設定事務邊界,discard在multi命令提交後可丟棄事務。另外watch命令可以實現cas操作。redis中的事務歸納...

Python中pip安裝與使用

操作環境 其實你在安裝python的時候,pip就隨同一起安裝了。一般情況下,可以直接使用,如果不能使用,基本上就是沒有新增環境變數而已。新增下環境變數就可以正常使用了。說明 1代表你的使用者名稱 不過在python的一些老版本中,的確有沒有自帶安裝的,我們就需要自己安裝了,不過安裝也挺簡單的pyt...

linux下安裝pip與pip安裝

在執行指令碼的時候,說有庫找不到 pip安裝的時候說不認識pip 安裝pip 使用指令碼安裝和公升級pip 執行指令碼python3 get pip.py 檢視版本pip v 如果pip v,出現notfound,把pip加到環境變數 執行pip install 再次執行指令碼提示的是找不到下乙個第...