Redis模糊查詢的幾種實(shí)現(xiàn)方法
簡(jiǎn)介
說(shuō)明
本文介紹Redis模糊查詢的方法。
官網(wǎng)網(wǎng)址
https://redis.io/commands/keys/
https://redis.io/commands/scan/
Redis模糊查詢鍵的方法
Redis提供了兩種模糊查詢鍵的方法:KEYS , SCAN。推薦用SCAN,下邊會(huì)介紹。
模糊查詢的通配符
KEYS和SCAN都支持glob通配符中的三個(gè):*,?,[]:
- *:通配任意多個(gè)字符
- ?:通配單個(gè)字符
- []:通配括號(hào)內(nèi)的某一個(gè)字符
示例
- 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
說(shuō)明
KEYS指令會(huì)一次性查出所有滿足條件的key(沒(méi)有 offset、limit 參數(shù))。keys 算法是遍歷算法,復(fù)雜度是 O(n)。
數(shù)據(jù)量大時(shí)會(huì)有問(wèn)題:redis 是單線程的,操作都是原子的,如果實(shí)例中有千萬(wàn)級(jí)以上的 key,這個(gè)指令就會(huì)導(dǎo)致 Redis 服務(wù)卡頓,所有讀寫 Redis 的其它的指令都會(huì)被延后甚至?xí)瑫r(shí)報(bào)錯(cuò),可能會(huì)引起緩存雪崩甚至數(shù)據(jù)庫(kù)宕機(jī)。
指令格式
KEYS pattern
pattern即key的正則表達(dá)式。
示例
先寫入一些數(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" //知道前面的一些字母,忘記了最后一個(gè)字母 192.168.xxx.21:6379[2]> keys hell? 1) "hello" 2) "hellp" //知道前面的一些字母,忘記了最后兩個(gè)個(gè)字母 192.168.xxx.21:6379[2]> keys hell?? 1) "hellog" //知道前面四個(gè)字母,最后一個(gè)字母有可能是p t y 其中的一個(gè) 192.168.xxx.21:6379[2]> keys hell[pty] 1) "hellp" 192.168.xxx.21:6379[2]>
SCAN
說(shuō)明
Redis 2.8版本引入,目標(biāo)是解決keys命令的一些問(wèn)題,特點(diǎn):
- 復(fù)雜度O(n),通過(guò)游標(biāo)分步進(jìn)行的,不會(huì)阻塞線程;
- 提供 limit 參數(shù),可以設(shè)置每次返回結(jié)果的數(shù)據(jù)量,limit只是對(duì)增量式迭代命令的hint,返回的結(jié)果可多可少;
- 支持模式匹配功能;
- 服務(wù)器不需要為游標(biāo)保存狀態(tài),游標(biāo)的唯一狀態(tài)就是 scan 返回給客戶端的游標(biāo)整數(shù);
- 返回的結(jié)果可能會(huì)有重復(fù),需要客戶端去重復(fù);
- 無(wú)法提供完整的快照遍歷,即遍歷過(guò)程中若有數(shù)據(jù)修改,改動(dòng)后的數(shù)據(jù)可能遍歷不到;每次返回的數(shù)據(jù)條數(shù)不一定,極度依賴內(nèi)部實(shí)現(xiàn);
- 單次返回的結(jié)果是空的并不意味著遍歷結(jié)束,而要看返回的游標(biāo)值是否為零
SCAN不是從第一維數(shù)組的第 0 位一直遍歷到末尾,而是采用高位進(jìn)位加法來(lái)遍歷。之所以使用這樣特殊的方式進(jìn)行遍歷,是考慮到字典的擴(kuò)容和縮容時(shí)避免槽位的遍歷重復(fù)和遺漏。
高位進(jìn)位法從左邊加,進(jìn)位往右邊移動(dòng),同普通加法正好相反。但是最終它們都會(huì)遍歷所有的槽位并且沒(méi)有重復(fù)。
指令格式
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
- cursor
- 游標(biāo),當(dāng)次遍歷的起始位置
- pattern
- 與Keys命令中的patterns相同,支持通配符匹配
- count
- 返回?cái)?shù)據(jù)條數(shù)。默認(rèn)為10
- 如果MATCH選項(xiàng)沒(méi)有指定,則返回條數(shù)可能大于等于這個(gè)數(shù)。因?yàn)镽edis對(duì)全局哈希表的每個(gè)哈希槽進(jìn)行遍歷,一旦發(fā)現(xiàn)拿到的元素個(gè)數(shù)大于了count,就停止遍歷。若一個(gè)桶里有多個(gè)元素,這時(shí)返回的元素就有可能多于count一點(diǎn)了。
- type:
- Redis 6.0 支持的參數(shù),指定返回Key的類型,類型可選值與 TYPE命令相同:string, list, set, zset, hash and stream。
第一次遍歷時(shí),cursor 值為 0,然后將返回結(jié)果中第一個(gè)整數(shù)值作為下一次遍歷的 cursor。一直遍歷到返回的 cursor 值為 0 時(shí)結(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模糊查詢的幾種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Redis模糊查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
完美解決linux上啟動(dòng)redis后配置文件未生效的問(wèn)題
今天小編就為大家分享一篇完美解決linux上啟動(dòng)redis后配置文件未生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05詳解Redis在SpringBoot工程中的綜合應(yīng)用
這篇文章主要介紹了Redis在SpringBoot工程中的綜合應(yīng)用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10window手動(dòng)操作清理redis緩存的技巧總結(jié)
在本篇文章中小編給大家分享了關(guān)于window環(huán)境手動(dòng)操作清理redis緩存的方法和技巧,有興趣的朋友們可以跟著學(xué)習(xí)下。2019-07-07Redis?RESP?協(xié)議實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了Redis?RESP?協(xié)議實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09redis解決高并發(fā)看門狗策略的實(shí)現(xiàn)
本文主要介紹了redis解決高并發(fā)看門狗策略的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02