Redis Scan 命令
文章目錄
- 1. Scan 命令的基本用法
- 1.1 Scan 命令的輸入值
- 1.2 Scan 命令的返回值
- 2. Scan 命令與 Keys 命令比較
- 2.1 Keys 命令的缺點(diǎn)
- 2.2 Scan 命令的優(yōu)點(diǎn)
- 3. Scan 命令的限制
- 3.1 有限保證原則
- 3.2 返回的結(jié)果有可能會(huì)重復(fù)
1. Scan 命令的基本用法
Scan 命令是一個(gè)基于游標(biāo)的迭代器:Scan 命令每次被調(diào)用之后,都會(huì)向用戶返回一個(gè)新的游標(biāo),用戶在下次迭代時(shí)需要使用這個(gè)新游標(biāo)作為 Scan 命令的游標(biāo)參數(shù),以此來延續(xù)之前的迭代過程。
當(dāng) Scan 命令的游標(biāo)參數(shù)被設(shè)置為 0 時(shí),服務(wù)器將開始一次新的迭代,而當(dāng)服務(wù)器向用戶返回值為 0 的 游標(biāo)時(shí),表示迭代已經(jīng)結(jié)束。1.1 Scan 命令的輸入值
Scan 命令的語法為:
SCAN cursor [MATCH pattern] [COUNT count] (The default COUNT value is 10)舉例:當(dāng)需要查找以 keyA 開頭的 key 值時(shí),可以使用如下命令進(jìn)行開始:
SCAN 0 match keyA* count 20注意,上面的 0 代表第一次遍歷,20 是限定服務(wù)器單次遍歷的字典槽位數(shù)量。
1.2 Scan 命令的返回值
Scan 命令的返回值是一個(gè)包含兩個(gè)元素的數(shù)組,第一個(gè)數(shù)組元素是用于下一次迭代的新游標(biāo),而第二個(gè)數(shù)組元素則是一個(gè)數(shù)組,這個(gè)數(shù)組中包含了所有被迭代的元素。
以 0 作為游標(biāo)開始一次新的迭代,一直調(diào)用 Scan 命令,直到命令返回游標(biāo) 0,這個(gè)過程稱之為一次完整遍歷。2. Scan 命令與 Keys 命令比較
2.1 Keys 命令的缺點(diǎn)
- 沒有限制返回結(jié)果的參數(shù)。由于 Keys 命令只能一次性獲取所有符合匹配規(guī)則的 key,所以沒辦法限制返回的結(jié)果數(shù)量。
- keys 命令是遍歷來實(shí)現(xiàn)的,時(shí)間復(fù)雜度是 O(N)。
所以結(jié)合以上兩個(gè)缺點(diǎn),再加上 Redis 是 單線程 的這個(gè)性質(zhì),在結(jié)果集數(shù)量非常大時(shí),會(huì)造成 Redis 進(jìn)程被阻塞,導(dǎo)致 Redis 服務(wù)卡頓。
2.2 Scan 命令的優(yōu)點(diǎn)
- Scan 命令提供了 limit 參數(shù), 可以限制返回的結(jié)果數(shù)量。
- Scan 命令時(shí)間復(fù)雜度也為 O(N),但是它是分次進(jìn)行的,即不會(huì)阻塞進(jìn)程。
所以結(jié)合以上兩個(gè)優(yōu)點(diǎn), Scan 命令不會(huì)導(dǎo)致 Redis 服務(wù)卡頓。
3. Scan 命令的限制
3.1 有限保證原則
Scan 命令可以保證:
從完整遍歷開始直到完整遍歷結(jié)束期間,一直存在于數(shù)據(jù)集內(nèi)的所有元素都會(huì)被完整遍歷返回,但是同一個(gè)元素可能會(huì)被返回多次。如果一個(gè)元素是在遍歷過程中被添加到數(shù)據(jù)集或者從數(shù)據(jù)集中被刪除,那么這個(gè)元素可能被返回,也可能不被返回。3.2 返回的結(jié)果有可能會(huì)重復(fù)
Scan 命令每次返回的結(jié)果有可能會(huì)重復(fù),所以要在應(yīng)用層進(jìn)行去重處理。
總結(jié)
以上是生活随笔為你收集整理的Redis Scan 命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中循环结构分有,python
- 下一篇: mysql数据库rp集群_MySQL集群