最近在了解redis的scan命令,scan就相當於分段遍歷,遍歷過程**現rehash也能保證scan不重複和不遺漏,這兩天了解這部分的原理,順便記錄一下。參考於redisscan迭代器遍歷操作原理(二)
先說順序遍歷的問題,也就是按0,1,2,3……的順序,用例子說明,當遍歷完槽2的時候,返回下乙個遍歷的槽為3,槽2被rehash,一部分資料被挪到槽10,value(2) = value_rehash(2) 並 value_rehash(10),value函式就是返回某個槽裡的值,當遍歷到槽10的時候,此時的槽10已經是rehash之後的結果,取到的值與rehash之前的槽2取到的結果有部分重複。這是擴容的情況,縮容也是類似的情況,會出現漏掉key的情況。
為了避免這些情況,redis採用了高位進製的方式,高位進製和地位進製類似,不會出現漏掉某個元素,遍歷完槽2的時候(010),返回下乙個遍歷元素6(110),此時rehash,槽2(二進位制0010)的元素被 部分挪到槽10(二進位制1010),用高位進製遞增的方式0110(十進位制6)是不會遞增到1010(十進位制10)的,也就之後的遞增都會跳過槽10,就避免了重複元素,縮容也是類似的。
這只是我的粗略理解順便記錄一下,因為一開始理解這部分的時候看不懂在說什麼,具體的redis為什麼rehash後槽2的元素被挪到槽10而不是槽11或者其他槽,還需要再去看一下,也許是因為為了配對高位進製的方式
理解redis中的scan
redis在2.8版本提供了scan相關命令用來遍歷集合中的元素。和keys,smembers命令遍歷大集合場景下會阻塞redis一定時間不同,scan命令每次遍歷只會返回一定數量集合元素和當前的遍歷位置的游標,時間非常短,不會阻塞redis,遍歷大集合時對其他業務影響較小。缺點是通過多次呼叫sca...
redis的scan的使用
scan cursor match pattern count count scan 命令呼叫完後每次會返回2個元素,第乙個是下一次迭代的cursor,第一次cursor會設定為0,當最後一次scan 返回的cursor等於0時,表示整個scan遍歷結束了,第二個返回的是list,乙個匹配的key的...
Redis查詢指令 SCAN
目錄 1 keys鍵命令缺點 2 引入scan命令 3 scan使用 4 更多scan指令 5 允許中途停止迭代 6 迭代什麼時候終結 7 時間複雜度 redis 提供了乙個簡單暴力的指令 keys 用來列出所有滿足特定正則字串規則的key。keys指令使用非常簡單,提供乙個簡單的正則字串即可,但是...