Redis如何從海量key中查詢出某一固定前綴的key
常問問題
假如redis里有一億個(gè)key,其中有10萬個(gè)key是以某個(gè)固定的已知的前綴開頭的,如何將他們?nèi)空页鰜恚?/p>
留意細(xì)節(jié)
摸清數(shù)據(jù)規(guī)模(數(shù)據(jù)量是多大?根據(jù)實(shí)際場景去作答),問清楚邊界。
給出答案
1.用keys指令找出指定模式的key列表
- 缺點(diǎn):一次性需要返回所有的key,如果可以的數(shù)量過大,會(huì)使服務(wù)器卡頓,對(duì)于內(nèi)存的消耗和redis服務(wù)器都是隱患。
2.用scan指令
- 無阻塞地提取出指定前綴的key列表,scan每次執(zhí)行都只會(huì)返回少量元素,所以可以用于生產(chǎn)環(huán)境,不會(huì)出現(xiàn)像keys命令帶來的可能會(huì)阻塞服務(wù)器問題。
SCAN cursor [MATCH pattern] [COUNT count]
1.scan指令是一個(gè)基于游標(biāo)的迭代器
命令每次被調(diào)用都需要上一次調(diào)用返回的游標(biāo)作為該次調(diào)用的游標(biāo)參數(shù)(cursor),以此來延續(xù)之前的迭代過程。
2.當(dāng)scan指令的游標(biāo)參數(shù)cursor設(shè)置為0時(shí)
- 服務(wù)器將開始一次新的迭代,而當(dāng)服務(wù)器向用戶返回值為0的游標(biāo)時(shí),就表示迭代已經(jīng)結(jié)束。
- 以0作為游標(biāo)開始新一次的迭代,一直調(diào)用游標(biāo)指令直到游標(biāo)返回0,我們稱這個(gè)過程為一次完整的遍歷。
3.scan增量式迭代
- 并不保證每次執(zhí)行都會(huì)返回某個(gè)給定數(shù)量的元素,甚至可能會(huì)返回0個(gè)元素,但只要命令返回的游標(biāo)不是0,應(yīng)用程序就不應(yīng)該將程序視為結(jié)束。
- 命令返回的元素?cái)?shù)量總是符合一定規(guī)則的,對(duì)于一個(gè)大數(shù)據(jù)集來說,增量式迭代命令每次最多可能會(huì)返回?cái)?shù)十個(gè)元素,而對(duì)于一個(gè)足夠小的數(shù)據(jù)級(jí)來說,可能會(huì)一次迭代返回所有的key。
- 類似于keys指令,scan可以通過給定match參數(shù)的方式,傳入要查找鍵位的模糊匹配方式,讓命令只返回和給定的模式相匹配的元素。
4.對(duì)于增量式迭代命令
- 是沒有辦法保證每次迭代所返回的元素?cái)?shù)量的,可以使用count選項(xiàng),對(duì)命令的行為進(jìn)行一定程度上的調(diào)整。
- count選項(xiàng)的作用,就是讓用戶告知迭代命令,在每次迭代中應(yīng)該從數(shù)據(jù)集里返回多少元素。
- 使用count選項(xiàng)對(duì)于增量式迭代命令相當(dāng)于是一種提示,大多數(shù)情況下這種提示都是比較有效的控制了返回的數(shù)量的,但count選項(xiàng)并不能嚴(yán)格地控制返回的數(shù)量,只能是一個(gè)大致的約束,并非每次迭代都會(huì)返回count數(shù)量的元素,用戶可以在每次迭代根據(jù)自己的需要隨意改變count值,只要將上次迭代返回的游標(biāo)用在下次迭代即可。
127.0.0.1:6379> scan 0 match k1* count 10 1) "11009983" 2) 1) "k15183267" 2) "k18983203" 3) "k14348902" 127.0.0.1:6379> scan 11009983 match k1* count 10 1)"23902345" 2) 1) "k17203743" 2) "k18324732" 3) "k11028343" 4) "k11143424" 5) "k12304823" 127.0.0.1:6379> scan 23902345 match k1* count 10 1) "24080390" 2) 1) "k12438294" 2) "k18392744" 3) "k14320420" 4) "k11043243"
使用SCAN指令獲取到的結(jié)果可能會(huì)重復(fù),后端可以用hashSet收集結(jié)果,以達(dá)到去重的效果。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Redis控制表單重復(fù)提交和控制接口訪問頻率方式
這篇文章主要介紹了使用Redis控制表單重復(fù)提交和控制接口訪問頻率方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Redis中Zset類型常用命令的實(shí)現(xiàn)
Zset是Redis的一種有序集合數(shù)據(jù)類型,Zset通過壓縮列表和跳躍表兩種底層編碼方式支持小數(shù)據(jù)集和大數(shù)據(jù)集,支持多種操作,包括添加、查詢、刪除元素以及集合運(yùn)算等,具有不同的時(shí)間復(fù)雜度,感興趣的可以了解一下2024-10-10
React Antd Cascader組件地區(qū)選擇方式
文章介紹了在表單中實(shí)現(xiàn)地區(qū)選擇功能,使用Cascader組件動(dòng)態(tài)加載數(shù)據(jù),需通過loadData和遞歸處理實(shí)現(xiàn)增刪改查,存儲(chǔ)和回顯需完整id數(shù)組以支持多級(jí)地區(qū)展示,強(qiáng)調(diào)后端設(shè)計(jì)對(duì)數(shù)據(jù)關(guān)聯(lián)(id/pid)的重要性2025-08-08
Redis五大基本數(shù)據(jù)類型及對(duì)應(yīng)使用場景總結(jié)
Redis有五種基本數(shù)據(jù)類型,分別是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted?Set),這些基本數(shù)據(jù)類型使得Redis具備了豐富的數(shù)據(jù)結(jié)構(gòu)和功能,適用于各種不同的應(yīng)用場景,本文就給大家詳細(xì)的介紹一下這五大類型2023-08-08
Redis存儲(chǔ)的列表分頁和檢索的實(shí)現(xiàn)方法
在 Redis 中,列表(List)是一種有序的數(shù)據(jù)結(jié)構(gòu),通常用于存儲(chǔ)一系列元素,由于列表是有序的,可以通過索引來訪問元素,因此可以很方便地實(shí)現(xiàn)分頁和檢索功能,以下是 Redis 列表的分頁和檢索的實(shí)現(xiàn)方法,需要的朋友可以參考下2025-02-02
Redis實(shí)現(xiàn)未讀消息計(jì)數(shù)的示例代碼
本文介紹了合伙人系統(tǒng)中產(chǎn)品分配流程及其未讀計(jì)數(shù)的實(shí)現(xiàn)方案,通過Redis工具類,實(shí)現(xiàn)了未讀計(jì)數(shù)的新增、查詢和重置功能,感興趣的可以了解一下2025-12-12

