婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Redis如何優雅的刪除特定前綴key

Redis如何優雅的刪除特定前綴key

熱門標簽:廊坊外呼系統在哪買 四川穩定外呼系統軟件 一個地圖標注多少錢 臺灣電銷 地圖標注工廠入駐 南京手機外呼系統廠家 b2b外呼系統 400電話辦理的口碑 高碑店市地圖標注app

前言

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

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

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

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

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

所以我們在生產環境中應當避免使用上邊的方法,那有什么優雅的方法來解決呢?SCAN!

SCAN介紹及使用

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

SCAN cursor [MATCH pattern] [COUNT count]

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

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

COUNT:  COUNT選項的作用就是讓用戶告知迭代命令,在每次迭代中應該從數據集里返回多少元素,COUNT只是對增量式迭代命令的一種提示,并不代表真正返回的數量,例如你COUNT設置為2有可能會返回3個元素,但返回的元素數據會與COUNT設置的正相關,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 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命令返回的是一個包含兩個元素的數組,第一個數組元素是用于進行下一次迭代的新游標,而第二個數組元素則是一個數組,這個數組中包含了所有被迭代的元素

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

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

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

在第二次調用SCAN命令時,命令返回了游標0,這表示迭代已經結束,整個數據集已經被完整遍歷過了

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

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

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

其他幾種數據結構的優雅刪除

類似的SCAN命令,對于Redis不同的數據類型還有另外幾個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的參數,例如上邊的ops-coffee

對于一個大的set key,借助sscan使用下邊的代碼可以實現優雅的批量刪除:

import redis

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

 # count表示每次刪除的元素數量,這里每次刪除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使用下邊的代碼實現優雅的刪除:

import redis

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

 # hscan_iter獲取出來的結果是個元祖,下邊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')

對于大的有序集合的刪除就比較簡單了,直接根據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大列表的刪除可以參考上邊這個方法,通過llen判斷數量,然后ltrim移除范圍內的元素,這里不贅述

至此對于Redis的五中數據結構大key的優雅刪除就全部實現了,生產環境擇優使用~

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Redis Cluster 字段模糊匹配及刪除
  • 詳解如何清理redis集群的所有數據
  • Redis批量刪除KEY的方法
  • Redis獲取某個前綴的key腳本實例
  • redis集群實現清理前綴相同的key

標簽:河源 拉薩 甘南 伊春 畢節 泰州 定州 南寧

巨人網絡通訊聲明:本文標題《Redis如何優雅的刪除特定前綴key》,本文關鍵詞  Redis,如何,優雅,的,刪除,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis如何優雅的刪除特定前綴key》相關的同類信息!
  • 本頁收集關于Redis如何優雅的刪除特定前綴key的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 敦煌市| 武川县| 旬邑县| 遂宁市| 保德县| 饶阳县| 鄯善县| 唐河县| 加查县| 阿拉善右旗| 揭阳市| 万宁市| 桓仁| 罗江县| 漯河市| 巴马| 靖远县| 明光市| 灵丘县| 会昌县| 闻喜县| 都兰县| 阿瓦提县| 依安县| 定陶县| 大丰市| 库车县| 安龙县| 大化| 衡阳市| 吴旗县| 张家界市| 陵川县| 巴楚县| 嘉祥县| 乌兰浩特市| 边坝县| 柯坪县| 甘南县| 浦北县| 屯留县|