主頁 > 知識(shí)庫 > Redis獲取某個(gè)前綴的key腳本實(shí)例

Redis獲取某個(gè)前綴的key腳本實(shí)例

熱門標(biāo)簽:玄武湖地圖標(biāo)注 地圖標(biāo)注如何即時(shí)生效 最簡(jiǎn)單的百度地圖標(biāo)注 百度商家地圖標(biāo)注怎么做 西藏教育智能外呼系統(tǒng)價(jià)格 太原營(yíng)銷外呼系統(tǒng) 竹間科技AI電銷機(jī)器人 地圖標(biāo)注費(fèi)用 小紅書怎么地圖標(biāo)注店

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開始遍歷,到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):

  • 無法提供完整的快照遍歷,也就是中間如果有數(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) 
#掃描匹配值,通過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à)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • Redis如何優(yōu)雅的刪除特定前綴key
  • Redis Cluster 字段模糊匹配及刪除
  • 詳解如何清理redis集群的所有數(shù)據(jù)
  • Redis批量刪除KEY的方法
  • redis集群實(shí)現(xiàn)清理前綴相同的key

標(biāo)簽:林芝 澳門 贛州 唐山 揚(yáng)州 香港 景德鎮(zhèn) 廣東

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis獲取某個(gè)前綴的key腳本實(shí)例》,本文關(guān)鍵詞  Redis,獲取,某個(gè),前綴,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis獲取某個(gè)前綴的key腳本實(shí)例》相關(guān)的同類信息!
  • 本頁收集關(guān)于Redis獲取某個(gè)前綴的key腳本實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章