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

Redis如何高效刪除大key

 更新時(shí)間:2024年04月03日 15:55:20   作者:3333333_  
這篇文章主要介紹了Redis如何高效刪除大key問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

大key的刪除問(wèn)題

大key(bigkey)是指 key 的 value 是個(gè)龐然大物,例如 Hashes, Sorted Sets, Lists, Sets,日積月累之后,會(huì)變得非常大,可能幾十上百M(fèi)B,甚至到GB。

如果對(duì)這類大key直接使用 del 命令進(jìn)行刪除,會(huì)導(dǎo)致長(zhǎng)時(shí)間阻塞,甚至崩潰。

因?yàn)?del 命令在刪除集合類型數(shù)據(jù)時(shí),時(shí)間復(fù)雜度為 O(M),M 是集合中元素的個(gè)數(shù)。

Redis 是單線程的,單個(gè)命令執(zhí)行時(shí)間過(guò)長(zhǎng)就會(huì)阻塞其他命令,容易引起雪崩。

解決方案

不可靠方案:

  • 空閑時(shí)間刪除,如凌晨3-4點(diǎn)刪除

可靠方案:

  • 漸進(jìn)式刪除
  • UNLINK (4.0版本以后)

1.漸進(jìn)式刪除

思路:

分批刪除,通過(guò) scan 命令遍歷大key,每次取得少部分元素,對(duì)其刪除,然后再獲取和刪除下一批元素。

示例:

  • 刪除大 Hashes

步驟:

(1)key改名,相當(dāng)于邏輯上把這個(gè)key刪除了,任何redis命令都訪問(wèn)不到這個(gè)key了

(2)小步多批次的刪除

偽代碼:

# key改名
newkey = "gc:hashes:" + redis.INCR( "gc:index" )
redis.RENAME("my.hash.key", newkey)
 
# 每次取出100個(gè)元素刪除
cursor = 0
loop
  cursor, hash_keys = redis.HSCAN(newkey, cursor, "COUNT", 100)
  if hash_keys count > 0
    redis.HDEL(newkey, hash_keys)
  end
  if cursor == 0
    break
  end
end
  • 刪除大 Lists

偽代碼:

# key改名
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.list.key", newkey)
 
# 刪除
while redis.LLEN(newkey) > 0
  redis.LTRIM(newkey, 0, -99)
end
  • 刪除大 Sets

偽代碼:

# key改名
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.set.key", newkey)
 
# 每次刪除100個(gè)成員
cursor = 0
loop
  cursor, members = redis.SSCAN(newkey, cursor, "COUNT", 100)
  if size of members > 0
    redis.SREM(newkey, members)
  end
  if cursor == 0
    break
  end
end
  • 刪除大 Sorted Sets

偽代碼:

# key改名
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.zset.key", newkey)
 
# 刪除
while redis.ZCARD(newkey) > 0
  redis.ZREMRANGEBYRANK(newkey, 0, 99)
end

2.UNLINK

Redis 4.0 推出了一個(gè)重要命令 UNLINK,用來(lái)拯救 del 刪大key的困境。

UNLINK 工作思路:

(1)在所有命名空間中把 key 刪掉,立即返回,不阻塞。

(2)后臺(tái)線程執(zhí)行真正的釋放空間的操作。

UNLINK 基本可以替代 del,但個(gè)別場(chǎng)景還是需要 del 的,例如在空間占用積累速度特別快的時(shí)候就不適合使用UNLINK,因?yàn)?UNLINK 不是立即釋放空間。

總結(jié)

使用 del 刪除大key可能會(huì)造成長(zhǎng)時(shí)間阻塞,甚至崩潰。

可以使用漸進(jìn)式刪除,對(duì) Hashes, Sorted Sets, Lists, Sets 分別處理,思路相同,先邏輯刪除,對(duì)key改名,使客戶端無(wú)法使用原key,然后使用批量小步刪除。

4.0版本以后可以使用 UNLINK 命令,后臺(tái)線程釋放空間。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • Redis優(yōu)雅地實(shí)現(xiàn)延遲隊(duì)列的方法分享

    Redis優(yōu)雅地實(shí)現(xiàn)延遲隊(duì)列的方法分享

    Redisson是Redis服務(wù)器上的分布式可伸縮Java數(shù)據(jù)結(jié)構(gòu),這篇文中主要為大家介紹了Redisson實(shí)現(xiàn)的優(yōu)雅的延遲隊(duì)列的方法,需要的可以參考一下
    2023-02-02
  • Redis與數(shù)據(jù)庫(kù)數(shù)據(jù)一致性的原因及解決方案

    Redis與數(shù)據(jù)庫(kù)數(shù)據(jù)一致性的原因及解決方案

    Redis作為一種高效的鍵值對(duì)存儲(chǔ)系統(tǒng),常用于緩存數(shù)據(jù)庫(kù)減少IO操作,下面這篇文章主要介紹了Redis與數(shù)據(jù)庫(kù)數(shù)據(jù)一致性的原因及解決方案,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Redis中三種特殊數(shù)據(jù)類型命令詳解

    Redis中三種特殊數(shù)據(jù)類型命令詳解

    Geospatial是地理位置類型,我們可以用來(lái)查詢附近的人、計(jì)算兩人之間的距離等,這篇文章主要介紹了Redis中三種特殊數(shù)據(jù)類型命令詳解,需要的朋友可以參考下
    2024-05-05
  • Redis未授權(quán)訪問(wèn)配合SSH key文件利用詳解

    Redis未授權(quán)訪問(wèn)配合SSH key文件利用詳解

    這篇文章主要給大家介紹了關(guān)于Redis未授權(quán)訪問(wèn)配合SSH key文件利用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Redis?腳本和連接命令示例詳解

    Redis?腳本和連接命令示例詳解

    Redis腳本是一種可以實(shí)現(xiàn)復(fù)雜任務(wù)的腳本語(yǔ)言,可以用來(lái)快速履行復(fù)雜任務(wù),靈活處理數(shù)據(jù)管理和管理復(fù)雜的利用場(chǎng)景,這篇文章主要介紹了Redis?腳本和連接命令,需要的朋友可以參考下
    2023-09-09
  • 利用redis實(shí)現(xiàn)排行榜的小秘訣

    利用redis實(shí)現(xiàn)排行榜的小秘訣

    這篇文章主要給大家介紹了關(guān)于如何利用redis實(shí)現(xiàn)排行榜的小秘訣,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Redis緩存問(wèn)題與緩存更新機(jī)制詳解

    Redis緩存問(wèn)題與緩存更新機(jī)制詳解

    本文主要介紹了緩存問(wèn)題及其解決方案,包括緩存穿透、緩存擊穿、緩存雪崩等問(wèn)題的成因以及相應(yīng)的預(yù)防和解決方法,同時(shí),還詳細(xì)探討了緩存更新機(jī)制,包括不同情況下的緩存更新策略和內(nèi)存淘汰機(jī)制,并對(duì)比了它們的優(yōu)缺點(diǎn)
    2025-01-01
  • Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用

    Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用

    這篇文章主要為大家介紹了Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Redis緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性的問(wèn)題解決

    Redis緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性的問(wèn)題解決

    隨業(yè)務(wù)增長(zhǎng),直接操作數(shù)據(jù)庫(kù)性能下降,引入緩存提高讀性能常見(jiàn),但緩存和數(shù)據(jù)庫(kù)的雙寫(xiě)操作會(huì)引發(fā)數(shù)據(jù)不一致問(wèn)題,本文討論幾種常用同步策略,感興趣的可以了解一下
    2024-09-09
  • Redis server 主從復(fù)制配置實(shí)現(xiàn)

    Redis server 主從復(fù)制配置實(shí)現(xiàn)

    從復(fù)制是指將一個(gè)Redis服務(wù)器的數(shù)據(jù)復(fù)制到其他Redis服務(wù)器的過(guò)程,本文主要介紹了Redis server 主從復(fù)制配置實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評(píng)論