Redis獲取某個(gè)前綴的key腳本實(shí)例
1.背景
在平時(shí)的維護(hù)中,經(jīng)常會(huì)遇到要統(tǒng)計(jì)某個(gè)前綴的key有多少,在請(qǐng)求比較多的redis中,keys * 會(huì)直接導(dǎo)致阻塞。
可以采用scan的方式進(jìn)行增量迭代,查詢使用pipeline減少交互,提高效率。
2.scan命令的優(yōu)缺點(diǎn)
SCAN命令的有SCAN,SSCAN,HSCAN,ZSCAN。
SCAN的話就是遍歷所有的keys
其他的SCAN命令的話是SCAN選中的集合。
SCAN命令是增量的循環(huán),每次調(diào)用只會(huì)返回一小部分的元素。所以不會(huì)有KEYS命令的坑。
SCAN命令返回的是一個(gè)游標(biāo),從0開(kāi)始遍歷,到0結(jié)束遍歷。
scan 0 1) "655" 2) 1) "test1" 2) "test2"
返回值一個(gè)array,一個(gè)是下次循環(huán)的cursorId,一個(gè)是元素?cái)?shù)組。SCAN命令不能保證每次返回的值都是有序的,另外同一個(gè)key有可能返回多次,不做區(qū)分,需要應(yīng)用程序去處理。
另外SCAN命令可以指定COUNT,默認(rèn)是10。但是這個(gè)并不是指定多少,就能返回多少,這只是一個(gè)提示,并不能保證一定返回這么多條。
優(yōu)點(diǎn):
- 提供鍵空間的遍歷操作,支持游標(biāo),復(fù)雜度O(1), 整體遍歷一遍只需要O(N);
- 提供結(jié)果模式匹配;
- 支持一次返回的數(shù)據(jù)條數(shù)設(shè)置,但僅僅是個(gè)hints,有時(shí)候返回的會(huì)多;
- 弱狀態(tài),所有狀態(tài)只需要客戶端需要維護(hù)一個(gè)游標(biāo);
缺點(diǎn):
- 無(wú)法提供完整的快照遍歷,也就是中間如果有數(shù)據(jù)修改,可能有些涉及改動(dòng)的數(shù)據(jù)遍歷不到;
- 每次返回的數(shù)據(jù)條數(shù)不一定,極度依賴內(nèi)部實(shí)現(xiàn);
- 返回的數(shù)據(jù)可能有重復(fù),應(yīng)用層必須能夠處理重入邏輯;
3. python腳本的實(shí)現(xiàn)
python中有一個(gè)封裝的函數(shù)scan_iter--查看所有元素--迭代器
腳本內(nèi)容:
#!/usr/bin/env python # -*- coding: UTF-8 -*- #作用:統(tǒng)計(jì)某個(gè)前綴key的個(gè)數(shù),并將其輸入到文件 #使用方法:python scan_redis.py apus* 100 __author__ = "lcl" import sys import redis import os pool=redis.ConnectionPool(host='192.168.225.128',port=6379,db=0) r = redis.StrictRedis(connection_pool=pool) #掃描匹配值,通過(guò)sys.argv傳參 match = sys.argv[1] #每次匹配數(shù)量 count = sys.argv[2] #print match #print count #總數(shù)量 total = 0 #掃描到的key輸出到文件 path = os.getcwd() #掃描到的key輸出的文件 txt = path+"/keys.txt" f = open(txt,"w") for key in r.scan_iter(match = match,count = count): # f.write("%s %s" % (key,"\n")) f.write(key+"\n") total = total+1 f.close print "匹配: %s 的數(shù)量為:%d " % (match,total)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
redis 替代php文件存儲(chǔ)session的實(shí)例
這篇文章主要介紹了redis 替代php文件存儲(chǔ)session的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家掌握這樣的方法,需要的朋友可以參考下2017-10-10Spark刪除redis千萬(wàn)級(jí)別set集合數(shù)據(jù)實(shí)現(xiàn)分析
這篇文章主要為大家介紹了Spark刪除redis千萬(wàn)級(jí)別set集合數(shù)據(jù)實(shí)現(xiàn)過(guò)程分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06redis如何設(shè)置database個(gè)數(shù)
這篇文章主要介紹了redis如何設(shè)置database個(gè)數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解
這篇文章主要給大家介紹了關(guān)于redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10redission分布式鎖防止重復(fù)初始化問(wèn)題
這篇文章主要介紹了redission分布式鎖防止重復(fù)初始化問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Redis動(dòng)態(tài)字符串SDS的實(shí)現(xiàn)
SDS在Redis中是實(shí)現(xiàn)字符串對(duì)象的工具,本文主要介紹了Redis動(dòng)態(tài)字符串SDS的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11