redis的scan的使用

2021-10-06 21:35:30 字數 1436 閱讀 5603

scan cursor [match pattern]

[count count]

scan 命令呼叫完後每次會返回2個元素,第乙個是下一次迭代的cursor,第一次cursor會設定為0,當最後一次scan 返回的cursor等於0時,表示整個scan遍歷結束了,第二個返回的是list,乙個匹配的key的陣列。

cursor::我們知道redis是key:value形式的,所以在外層的資料結構,很容易讓我們聯想到hashmap類似的資料介面,hashmap最基本的形式是採用陣列加鍊表的形式進行存貯的,而cursor就是最外的一維陣列的索引,第一次使用scan,cursor設定為0, 第二cursor設定成第一次返回cursor的值,如果cursor返回是0,表示迭代完畢。

match pattern:pattern支援redis的萬用字元,例如 * 表示匹配任意個字元,?匹配乙個字元

count:表示查詢多少個陣列元素,把匹配的結果,加入到返回的結果集中,count預設是10,可以根據實際需求自由的調整。

jedis jedis =

newjedis

("127.0.0.1"

,6379);

for(

int i =

0;i<

20000

;i++

)for

(int i =

20000

;i<

40000

;i++

) string cursor =

"0";

scanparams params =

newscanparams()

; params.

count

(1000);

params.

match

("*20200606*");

int count =0;

do cursor = result.

getstringcursor()

;}while

(!cursor.

equals

("0"))

; system.out.

println

("total size is "

+ count)

;

hscan ,sscan,zscan 都是類似,只是需要指定特定的key,迭代的是相關的內部的元素。

scan命令從開始到結束乙個完整的迭代,可能會返回重複的元素,(如果hash表縮容的話),scan命令相對於keys命令不會阻塞redis伺服器,如果要查某些部分字元匹配的key,用scan是很合適的。但是scan返回的不一定是此刻返回的所有匹配的結果,可能多,也可能少,因為整個資料可能在不斷的變化,而唯一有狀態的是cursor。

Redis中的Scan命令的使用

redis中有乙個經典的問題,在巨大的資料量的情況下,做類似於查詢符合某種規則的key的資訊,這裡就有兩種方式,一是keys命令,簡單粗暴,由於redis單執行緒這一特性,keys命令是以阻塞的方式執行的,keys是以遍歷的方式實現的複雜度是 o n redis庫中的key越多,查詢實現代價越大,產...

Redis的Scan粗略理解

最近在了解redis的scan命令,scan就相當於分段遍歷,遍歷過程 現rehash也能保證scan不重複和不遺漏,這兩天了解這部分的原理,順便記錄一下。參考於redisscan迭代器遍歷操作原理 二 先說順序遍歷的問題,也就是按0,1,2,3 的順序,用例子說明,當遍歷完槽2的時候,返回下乙個遍...

理解redis中的scan

redis在2.8版本提供了scan相關命令用來遍歷集合中的元素。和keys,smembers命令遍歷大集合場景下會阻塞redis一定時間不同,scan命令每次遍歷只會返回一定數量集合元素和當前的遍歷位置的游標,時間非常短,不會阻塞redis,遍歷大集合時對其他業務影響較小。缺點是通過多次呼叫sca...