麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > Redis > 正文

Redis如何優(yōu)雅的刪除特定前綴key

2020-10-28 21:30:08
字體:
供稿:網(wǎng)友

前言

還在用keys命令模糊匹配刪除數(shù)據(jù)嗎?這就是一顆隨時爆炸的炸彈!

Redis中沒有批量刪除特定前綴key的指令,但我們往往需要根據(jù)前綴來刪除,那么究竟該怎么做呢?可能你一通搜索后會得到下邊的答案

redis-cli --raw keys "ops-coffee-*" | xargs redis-cli del

直接在linux下通過redis的keys命令匹配到所有的key,然后調(diào)用系統(tǒng)命令xargs來刪除,看似非常完美,實則風(fēng)險巨大

因為Redis的單線程服務(wù)模式,命令keys會阻塞正常的業(yè)務(wù)請求,如果你一次keys匹配的數(shù)量過多或者在del的時候遇到大key,都會直接導(dǎo)致業(yè)務(wù)的不可用,甚至造成redis宕機的風(fēng)險

所以我們在生產(chǎn)環(huán)境中應(yīng)當(dāng)避免使用上邊的方法,那有什么優(yōu)雅的方法來解決呢?SCAN!

SCAN介紹及使用

Redis從2.8版本開始支持scan命令,SCAN命令的基本用法如下:

SCAN cursor [MATCH pattern] [COUNT count]

cursor: 游標,SCAN命令是一個基于游標的迭代器,SCAN命令每次被調(diào)用之后,都會向用戶返回一個新的游標,用戶在下次迭代時需要使用這個新游標作為SCAN命令的游標參數(shù),以此來延續(xù)之前的迭代過程,直到服務(wù)器向用戶返回值為0的游標時,一次完整的遍歷過程就結(jié)束了

MATCH: 匹配規(guī)則,例如遍歷以ops-coffee-開頭的所有key可以寫成ops-coffee-*,中間包含-coffee-的可以寫成*-coffee-*

COUNT:  COUNT選項的作用就是讓用戶告知迭代命令,在每次迭代中應(yīng)該從數(shù)據(jù)集里返回多少元素,COUNT只是對增量式迭代命令的一種提示,并不代表真正返回的數(shù)量,例如你COUNT設(shè)置為2有可能會返回3個元素,但返回的元素數(shù)據(jù)會與COUNT設(shè)置的正相關(guān),COUNT的默認值是10

以下是一個SCAN命令的迭代過程示例:

127.0.0.1:6379> scan 0 MATCH ops-coffee-* 1) "38"2) 1) "ops-coffee-25" 2) "ops-coffee-19" 3) "ops-coffee-29" 4) "ops-coffee-10" 5) "ops-coffee-23" 6) "ops-coffee-5" 7) "ops-coffee-14" 8) "ops-coffee-16" 9) "ops-coffee-11" 10) "ops-coffee-15" 11) "ops-coffee-7" 12) "ops-coffee-1"127.0.0.1:6379> scan 38 MATCH ops-coffee-* COUNT 10001) "0"2) 1) "ops-coffee-13" 2) "ops-coffee-9" 3) "ops-coffee-21" 4) "ops-coffee-6" 5) "ops-coffee-30" 6) "ops-coffee-20" 7) "ops-coffee-2" 8) "ops-coffee-12" 9) "ops-coffee-28" 10) "ops-coffee-3" 11) "ops-coffee-26" 12) "ops-coffee-4" 13) "ops-coffee-31" 14) "ops-coffee-8" 15) "ops-coffee-22" 16) "ops-coffee-27" 17) "ops-coffee-18" 18) "ops-coffee-24" 19) "ops-coffee-17"

SCAN命令返回的是一個包含兩個元素的數(shù)組,第一個數(shù)組元素是用于進行下一次迭代的新游標,而第二個數(shù)組元素則是一個數(shù)組,這個數(shù)組中包含了所有被迭代的元素

上面這個例子的意思是掃描所有前綴為ops-coffee-的key

第一次迭代使用0作為游標,表示開始一次新的迭代,同時使用了MATCH匹配前綴為ops-coffee-的key,返回了游標值38以及遍歷到的數(shù)據(jù)

第二次迭代使用的是第一次迭代時返回的游標,也即是命令回復(fù)第一個元素的值38,同時通過將COUNT選項的參數(shù)設(shè)置為1000,強制命令為本次迭代掃描更多元素

在第二次調(diào)用SCAN命令時,命令返回了游標0,這表示迭代已經(jīng)結(jié)束,整個數(shù)據(jù)集已經(jīng)被完整遍歷過了

KEYS命令的時間復(fù)雜度為O(n),而SCAN命令會將遍歷操作分解成m次時間復(fù)雜度為O(1)的操作來執(zhí)行,從而解決使用keys命令遍歷大量數(shù)據(jù)而導(dǎo)致服務(wù)器阻塞的情況,使用下邊的指令可以達到優(yōu)雅刪除的目的:

redis-cli --scan --pattern "ops-coffee-*" | xargs -L 2000 redis-cli del

其中xargs -L指令表示xargs一次讀取的行數(shù),也就是每次刪除的key數(shù)量,一次讀取太多xargs會報錯

其他幾種數(shù)據(jù)結(jié)構(gòu)的優(yōu)雅刪除

類似的SCAN命令,對于Redis不同的數(shù)據(jù)類型還有另外幾個SSCAN、HSCAN和ZSCAN,使用方法類似:

> sscan ops-coffee 0 MATCH v1*1) "7"2) 1) "v15" 2) "v13" 3) "v12" 4) "v10" 5) "v14" 6) "v1"

與SCAN命令不同的是這幾個命令需要多加一個key的參數(shù),例如上邊的ops-coffee

對于一個大的set key,借助sscan使用下邊的代碼可以實現(xiàn)優(yōu)雅的批量刪除:

import redisdef del_big_set_key(key_name): r = redis.StrictRedis(host='localhost', port=6379) # count表示每次刪除的元素數(shù)量,這里每次刪除300元素 for key in r.sscan_iter(name=key_name, count=300): r.srem(key_name, key)del_big_set_key('ops-coffee')

對于一個大的hash key,則可借助hscan使用下邊的代碼實現(xiàn)優(yōu)雅的刪除:

import redisdef del_big_hash_key(key_name): r = redis.StrictRedis(host='localhost', port=6379) # hscan_iter獲取出來的結(jié)果是個元祖,下邊hdel刪除用key[0]取到key for key in r.hscan_iter(name=key_name, count=300): r.hdel(key_name, key[0])del_big_hash_key('ops-coffee')

對于大的有序集合的刪除就比較簡單了,直接根據(jù)zremrangebyrank排行范圍刪除

import redisdef del_big_sort_key(key_name): r = redis.StrictRedis(host='localhost', port=6379) while r.zcard(key_name) > 0: # 判斷集合中是否有元素,如有有則刪除排行0-99的元素 r.zremrangebyrank(key_name, 0, 99)del_big_sort_key('ops-coffee')

big list大列表的刪除可以參考上邊這個方法,通過llen判斷數(shù)量,然后ltrim移除范圍內(nèi)的元素,這里不贅述

至此對于Redis的五中數(shù)據(jù)結(jié)構(gòu)大key的優(yōu)雅刪除就全部實現(xiàn)了,生產(chǎn)環(huán)境擇優(yōu)使用~

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产乱色精品成人免费视频 | 国产精品视频一区二区三区综合 | hd性videos意大利复古 | 黄网站在线观 | av在线网站观看 | 毛片视 | 久久久成人精品视频 | 精品国产一区二区三区在线观看 | 日韩黄色片免费看 | 精品一区二区三区中文字幕老牛 | 天天黄色片| 国产一区视频在线免费观看 | 欧美日韩免费在线观看视频 | 国产精品九九久久一区hh | 海角在线观看91一区二区 | 把娇妻调教成暴露狂 | 天天夜夜草 | 成人在线视频在线观看 | 黄色大片在线免费看 | 亚洲一区二区三区在线免费观看 | av免费在线播放 | 国产99久久久国产精品下药 | 亚洲最新无码中文字幕久久 | 亚洲五码在线观看视频 | 艹男人的日日夜夜 | 日韩黄色片在线观看 | 毛片免费视频网站 | 国产午夜亚洲精品 | 久久国产精品电影 | 免费黄色在线观看网站 | 国产精品成人一区二区三区吃奶 | xp123精品视频| 精品国产观看 | 男女做性免费网站 | 91av大片| 国产欧美在线观看不卡一 | 369看片你懂的小视频在线观看 | 久草在线高清视频 | 亚洲激情91 | 国产一级淫片a级aaa | 99国内精品视频 |