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...