Redis模糊查詢的幾種實現(xiàn)方法
簡介
說明
本文介紹Redis模糊查詢的方法。
官網(wǎng)網(wǎng)址
https://redis.io/commands/keys/
https://redis.io/commands/scan/
Redis模糊查詢鍵的方法
Redis提供了兩種模糊查詢鍵的方法:KEYS , SCAN。推薦用SCAN,下邊會介紹。
模糊查詢的通配符
KEYS和SCAN都支持glob通配符中的三個:*,?,[]:
- *:通配任意多個字符
- ?:通配單個字符
- []:通配括號內(nèi)的某一個字符
示例
- h?llo
- 匹配 hello, hallo and hxllo
- h*llo
- 匹配 hllo、heeeello
- h[ae]llo
- 匹配 hello、hallo
- 不匹配 hillo
- h[^e]llo
- 匹配 hallo、hbllo…
- 不匹配 hello
- h[a-b]llo 匹配 hallo and hbllo
KEYS
說明
KEYS指令會一次性查出所有滿足條件的key(沒有 offset、limit 參數(shù))。keys 算法是遍歷算法,復(fù)雜度是 O(n)。
數(shù)據(jù)量大時會有問題:redis 是單線程的,操作都是原子的,如果實例中有千萬級以上的 key,這個指令就會導(dǎo)致 Redis 服務(wù)卡頓,所有讀寫 Redis 的其它的指令都會被延后甚至?xí)瑫r報錯,可能會引起緩存雪崩甚至數(shù)據(jù)庫宕機。
指令格式
KEYS pattern
pattern即key的正則表達式。
示例
先寫入一些數(shù)據(jù):
192.168.xxx.21:6379[2]> set hello 1 OK 192.168.xxx.21:6379[2]> set word 1 OK 192.168.xxx.21:6379[2]> set hellp 1 OK 192.168.xxx.21:6379[2]> set ahellog 1 OK 192.168.xxx.21:6379[2]> set hellog 1 OK
查詢:
192.168.xxx.21:6379[2]> keys * 1) "hello" 2) "hellog" 3) "hellp" 4) "word" 5) "ahellog" 192.168.xxx.21:6379[2]> keys *hell* 1) "hello" 2) "hellog" 3) "hellp" 4) "ahellog" 192.168.xxx.21:6379[2]> keys hell* 1) "hello" 2) "hellog" 3) "hellp" //知道前面的一些字母,忘記了最后一個字母 192.168.xxx.21:6379[2]> keys hell? 1) "hello" 2) "hellp" //知道前面的一些字母,忘記了最后兩個個字母 192.168.xxx.21:6379[2]> keys hell?? 1) "hellog" //知道前面四個字母,最后一個字母有可能是p t y 其中的一個 192.168.xxx.21:6379[2]> keys hell[pty] 1) "hellp" 192.168.xxx.21:6379[2]>
SCAN
說明
Redis 2.8版本引入,目標(biāo)是解決keys命令的一些問題,特點:
- 復(fù)雜度O(n),通過游標(biāo)分步進行的,不會阻塞線程;
- 提供 limit 參數(shù),可以設(shè)置每次返回結(jié)果的數(shù)據(jù)量,limit只是對增量式迭代命令的hint,返回的結(jié)果可多可少;
- 支持模式匹配功能;
- 服務(wù)器不需要為游標(biāo)保存狀態(tài),游標(biāo)的唯一狀態(tài)就是 scan 返回給客戶端的游標(biāo)整數(shù);
- 返回的結(jié)果可能會有重復(fù),需要客戶端去重復(fù);
- 無法提供完整的快照遍歷,即遍歷過程中若有數(shù)據(jù)修改,改動后的數(shù)據(jù)可能遍歷不到;每次返回的數(shù)據(jù)條數(shù)不一定,極度依賴內(nèi)部實現(xiàn);
- 單次返回的結(jié)果是空的并不意味著遍歷結(jié)束,而要看返回的游標(biāo)值是否為零
SCAN不是從第一維數(shù)組的第 0 位一直遍歷到末尾,而是采用高位進位加法來遍歷。之所以使用這樣特殊的方式進行遍歷,是考慮到字典的擴容和縮容時避免槽位的遍歷重復(fù)和遺漏。
高位進位法從左邊加,進位往右邊移動,同普通加法正好相反。但是最終它們都會遍歷所有的槽位并且沒有重復(fù)。
指令格式
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
- cursor
- 游標(biāo),當(dāng)次遍歷的起始位置
- pattern
- 與Keys命令中的patterns相同,支持通配符匹配
- count
- 返回數(shù)據(jù)條數(shù)。默認(rèn)為10
- 如果MATCH選項沒有指定,則返回條數(shù)可能大于等于這個數(shù)。因為Redis對全局哈希表的每個哈希槽進行遍歷,一旦發(fā)現(xiàn)拿到的元素個數(shù)大于了count,就停止遍歷。若一個桶里有多個元素,這時返回的元素就有可能多于count一點了。
- type:
- Redis 6.0 支持的參數(shù),指定返回Key的類型,類型可選值與 TYPE命令相同:string, list, set, zset, hash and stream。
第一次遍歷時,cursor 值為 0,然后將返回結(jié)果中第一個整數(shù)值作為下一次遍歷的 cursor。一直遍歷到返回的 cursor 值為 0 時結(jié)束。
示例
192.168.xxx.21:6379[2]> keys * 1) "hello" 2) "hellog" 3) "hellp" 4) "word" 5) "ahellog" 192.168.xxx.21:6379[2]> scan 0 match *ll* count 2 1) "5" 2) 1) "hellp" 2) "hello" 192.168.xxx.21:6379[2]> scan 5 match *ll* count 2 1) "0" 2) 1) "hellog" 2) "ahellog" 192.168.xxx.21:6379[2]>
到此這篇關(guān)于Redis模糊查詢的幾種實現(xiàn)方法的文章就介紹到這了,更多相關(guān)Redis模糊查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機自啟動
Redis是一種鍵值對數(shù)據(jù)庫,也稱為內(nèi)存數(shù)據(jù)庫,因為它可以將數(shù)據(jù)存儲在內(nèi)存中,而不是在磁盤上,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機自啟動的相關(guān)資料,需要的朋友可以參考下2024-01-01
基于Redis實現(xiàn)短信驗證碼登錄項目示例(附源碼)
手機登錄驗證在很多網(wǎng)頁上都得到使用,本文主要介紹了基于Redis實現(xiàn)短信驗證碼登錄項目示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
如何自定義redis工具jar包供其他SpringBoot項目直接使用
這篇文章主要介紹了如何自定義redis工具jar包供其他SpringBoot項目直接使用,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
redis cluster集群模式下實現(xiàn)批量可重入鎖
本文主要介紹了使用redis cluster集群版所遇到的問題解決方案及redis可重入鎖是否會有死鎖的問題等,具有一定的參考價值,感興趣的可以了解一下2024-02-02
Redis Subscribe timeout 報錯的問題解決
最近系統(tǒng)偶爾報出org.redisson.client.RedisTimeoutException: Subscribe timeout: (7500ms)的錯誤,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
Window下對Redis進行開啟與關(guān)閉的操作方法
這篇文章主要介紹了Window下對Redis進行開啟與關(guān)閉的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11

