jedis中rpop函式操作刪除的簡要分析

2022-08-20 13:51:15 字數 1310 閱讀 4094

學習使人進步,為了提公升效能,保證ha,運維想把redis也弄成redis集群,陪他玩的任務自然就落在了最近有點閒的我的身上。在測試過程中需要模擬很多場景,其中乙個場景是:使用者使用rpop讀取list資訊時,未傳輸結束的時候,主redis突然發生問題,進入重連。這條資料是否會被刪除?或是刪除一部分?亦或者是完全沒有刪除操作?這引起我的思考。

如果在傳輸過程中突然redis異常,redis不會進行刪除操作。rpop將value值作為乙個整體,不會作為位元組流邊刪邊傳。具體流程見下文。

private void redisclustertesr()  catch (jedisconnectionexception e)  catch (jedisdataexception e) 

system.out.println();

// 獲取儲存的資料並輸出

long size = jedis.llen(name);

listlist = new arraylist<>();

// 迴圈進行rpop,丟擲每個

for (int i = 0; i < size; i++) catch (jedisconnectionexception e) catch (jedisconnectionexception e1) }}

}system.out.println("finish,size: "+list.size());

system.out.println(arrays.tostring(list.toarray()));

}

在其中第28行,即string str = jedis.rpop(name);處增加斷點

正常執行(resume,idea快捷鍵f9)一至兩項後,選擇step into 按鈕檢視下層實現**(idea快捷鍵f7)。

觀察**,總結流程

ps:基本就是這樣,若傳輸時網路異常,沒有傳輸完成,將丟擲io異常(可能被上層捕獲並轉換為jedisconnectionexception,這裡沒有注意)。不會傳送確認並刪除請求。

這個問題雖然解決了,但jedis和redis對我而言依舊神秘,我編寫的測試資料為30執行緒*2000w條資料,共6億條資料,每條資料5k,在不到30s便擠爆了32g伺服器的50g硬碟,且停止執行的原因是磁碟不足,而不是記憶體不足。

redis的高效率超出了我的想象,不是乙個簡簡單單的『小工具』。有機會一定要讀一下他的源**,一定有所收穫。

jedis原始碼

jedis操作redis中的key(封裝)

還有一篇文章封裝了一些 操作redis中的list 還有一篇文章封裝了一些 操作redis中的set 還有一篇文章封裝了一些 操作redis中的hash package me.ele.redis import redis.clients.jedis.jedis 操作redis中的key author...

python中基本函式操作

python中利用關鍵字def來專門定義函式 主要應用如下 格式 def 函式名稱 函式的執行過程 return 執行的結果def case print 這是乙個案例 return從上面的的格式可以看出乙個函式的定義其實就是表示的乙個行為,一種功能 函式的核心就是運算資料 所有函式需要處理運算資料,...

openCV中矩陣操作函式

add 矩陣加法,a b的更高階形式,支援mask scaleadd 矩陣加法,乙個帶有縮放因子dst i scale src1 i src2 i addweighted 矩陣加法,兩個帶有縮放因子dst i saturate src1 i alpha src2 i beta gamma subtr...