欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2019年06月17日 08:46:44   作者:37丫37  
這篇文章主要給大家介紹了關(guān)于Redis如何優(yōu)雅的刪除特定前綴key的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

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

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

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

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

SCAN介紹及使用

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

SCAN cursor [MATCH pattern] [COUNT count]

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

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

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

以下是一個(gè)SCAN命令的迭代過(guò)程示例:

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 1000
1) "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命令返回的是一個(gè)包含兩個(gè)元素的數(shù)組,第一個(gè)數(shù)組元素是用于進(jìn)行下一次迭代的新游標(biāo),而第二個(gè)數(shù)組元素則是一個(gè)數(shù)組,這個(gè)數(shù)組中包含了所有被迭代的元素

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

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

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

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

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

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

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

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

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

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

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

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

import redis

def del_big_set_key(key_name):
 r = redis.StrictRedis(host='localhost', port=6379)

 # count表示每次刪除的元素?cái)?shù)量,這里每次刪除300元素
 for key in r.sscan_iter(name=key_name, count=300):
 r.srem(key_name, key)

del_big_set_key('ops-coffee')

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

import redis

def del_big_hash_key(key_name):
 r = redis.StrictRedis(host='localhost', port=6379)

 # hscan_iter獲取出來(lái)的結(jié)果是個(gè)元祖,下邊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')

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

import redis

def 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大列表的刪除可以參考上邊這個(gè)方法,通過(guò)llen判斷數(shù)量,然后ltrim移除范圍內(nèi)的元素,這里不贅述

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • python腳本實(shí)現(xiàn)Redis未授權(quán)批量提權(quán)

    python腳本實(shí)現(xiàn)Redis未授權(quán)批量提權(quán)

    這篇文章主要給大家介紹了關(guān)于利用python腳本實(shí)現(xiàn)redis未授權(quán)批量提權(quán)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • RedisDesktopManager遠(yuǎn)程連接redis的實(shí)現(xiàn)

    RedisDesktopManager遠(yuǎn)程連接redis的實(shí)現(xiàn)

    本文主要介紹了RedisDesktopManager遠(yuǎn)程連接redis的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Redis實(shí)戰(zhàn)記錄之限制操作頻率

    Redis實(shí)戰(zhàn)記錄之限制操作頻率

    這篇文章主要給大家介紹了關(guān)于Redis實(shí)戰(zhàn)記錄之限制操作頻率的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 淺談Redis主從復(fù)制以及主從復(fù)制原理

    淺談Redis主從復(fù)制以及主從復(fù)制原理

    在現(xiàn)有企業(yè)中80%公司大部分使用的是redis單機(jī)服務(wù),在實(shí)際的場(chǎng)景當(dāng)中單一節(jié)點(diǎn)的redis容易面臨風(fēng)險(xiǎn)。本文將介紹Redis主從復(fù)制以及主從復(fù)制原理。
    2021-05-05
  • Redis底層數(shù)據(jù)結(jié)構(gòu)之dict、ziplist、quicklist詳解

    Redis底層數(shù)據(jù)結(jié)構(gòu)之dict、ziplist、quicklist詳解

    本文給大家詳細(xì)介紹了Redis的底層數(shù)據(jù)結(jié)構(gòu):dict、ziplist、quicklist的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • Redis實(shí)現(xiàn)延遲任務(wù)的常見(jiàn)方案詳解

    Redis實(shí)現(xiàn)延遲任務(wù)的常見(jiàn)方案詳解

    延遲任務(wù)(Delayed?Task)是指在未來(lái)的某個(gè)時(shí)間點(diǎn),執(zhí)行相應(yīng)的任務(wù),本文為大家整理了Redis實(shí)現(xiàn)延遲任務(wù)的幾個(gè)常見(jiàn)方案,希望對(duì)大家有所幫助
    2024-04-04
  • 聊一聊Redis與MySQL雙寫(xiě)一致性如何保證

    聊一聊Redis與MySQL雙寫(xiě)一致性如何保證

    一致性就是數(shù)據(jù)保持一致,在分布式系統(tǒng)中,可以理解為多個(gè)節(jié)點(diǎn)中數(shù)據(jù)的值是一致的。本文給大家分享Redis與MySQL雙寫(xiě)一致性該如何保證,感興趣的朋友一起看看吧
    2021-06-06
  • Redis 執(zhí)行性能測(cè)試

    Redis 執(zhí)行性能測(cè)試

    這篇文章主要介紹了Redis 執(zhí)行性能測(cè)試的方法,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí)redis,感興趣的朋友可以了解下
    2020-08-08
  • redis.conf中使用requirepass不生效的原因及解決方法

    redis.conf中使用requirepass不生效的原因及解決方法

    本文主要介紹了如何啟用requirepass,以及啟用requirepass為什么不會(huì)生效,從代碼層面分析了不生效的原因,以及解決方法,需要的朋友可以參考下
    2023-07-07
  • 詳解redis集群選舉機(jī)制

    詳解redis集群選舉機(jī)制

    這篇文章主要介紹了詳解redis集群選舉機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論