Scan的使用方式以及Spring redis的坑

2022-07-07 19:06:16 字數 1441 閱讀 4589

springredistemplate針對這個scan進行了封裝,示例使用(針對最新庫spring-data-redis-1.8.1.release):

setexecute = redistemplate.execute(new rediscallback>()

return binarykeys;

}});

注意cursor一定不能關閉,在之前的版本中,這裡cursor需要手動關閉,但是從1.8.0開始,不能手動關閉!否則會報異常。

scanoptions有兩個引數,乙個是match,另乙個是count,分別對應scan命令的兩個引數。

scan命令原始碼:

/* handle the case of a hash table. */

ht = null;

if (o == null) else if (o->type == redis_set && o->encoding == redis_encoding_ht) else if (o->type == redis_hash && o->encoding == redis_encoding_ht) else if (o->type == redis_zset && o->encoding == redis_encoding_skiplist)

//由於redis的ziplist, intset等型別資料量挺少,所以可用一次返回的。下面的else if 做這個事情。全部返回乙個key 。

if (ht) while (cursor && listlength(keys) < count);     } else if (o->type == redis_set) else if (o->type == redis_hash || o->type == redis_zset)

cursor = 0;

} else

1可以看出,redis的scan操作由於其整體的資料設計,無法提供特別準的scan操作,僅僅是乙個「can 『 t guarantee , just do my best」的實現:

提供鍵空間的遍歷操作,支援游標,複雜度o(1), 整體遍歷一遍只需要o(n);

提供結果模式匹配;

支援一次返回的資料條數設定,但僅僅是個hints,有時候返回的會多;

弱狀態,所有狀態只需要客戶端需要維護乙個游標;

無法提供完整的快照遍歷,也就是中間如果有資料修改,可能有些涉及改動的資料遍歷不到;

每次返回的資料條數不一定,極度依賴內部實現;

返回的資料可能有重複,應用層必須能夠處理重入邏輯;上面的示例**中,redistemplate.execute方法是個set,相當於已經對於返回的key去重

count是每次掃瞄的key個數,並不是結果集個數。count要根據掃瞄資料量大小而定,scan雖然無鎖,但是也不能保證在超過百萬資料量級別搜尋效率;count不能太小,網路互動會變多,count要盡可能的大。在搜尋結果集1萬以內,建議直接設定為與所蒐集大小相同

redis的scan的使用

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

Theano中scan函式的使用

theano作為深度學習領域乙個經典的python庫,可以先定義數學表示式再進行運算,開創了符號計算的先河。最近在科研過程中用到了其中的scan 函式,雖然以前也學過這個框架,但是tensorflow永久了,感覺就把一些知識點忘記了,於是想到了寫筆記的重要性,故在這裡記錄下來,以備隨時回頭翻看。在學...

Redis中的Scan命令的使用

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