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

Redis如何高效刪除大key

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

大key的刪除問題

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

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

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

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

解決方案

不可靠方案:

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

可靠方案:

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

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

思路:

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

示例:

  • 刪除大 Hashes

步驟:

(1)key改名,相當(dāng)于邏輯上把這個(gè)key刪除了,任何redis命令都訪問不到這個(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,用來拯救 del 刪大key的困境。

UNLINK 工作思路:

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

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

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

總結(jié)

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

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

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

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

相關(guān)文章

  • Redisson之lock()和tryLock()的區(qū)別及說明

    Redisson之lock()和tryLock()的區(qū)別及說明

    這篇文章主要介紹了Redisson之lock()和tryLock()的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Redis序列化存儲(chǔ)及日期格式的問題處理

    Redis序列化存儲(chǔ)及日期格式的問題處理

    這篇文章主要介紹了Redis序列化存儲(chǔ)及其日期格式的問題處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Redis實(shí)現(xiàn)分布式Session管理的機(jī)制詳解

    Redis實(shí)現(xiàn)分布式Session管理的機(jī)制詳解

    這篇文章主要介紹了Redis實(shí)現(xiàn)分布式Session管理的機(jī)制詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 嵌入式Redis服務(wù)器在Spring Boot測試中的使用教程

    嵌入式Redis服務(wù)器在Spring Boot測試中的使用教程

    這篇文章主要介紹了嵌入式Redis服務(wù)器在Spring Boot測試中的使用,本文通過實(shí)例代碼場景分析給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • 淺談Redis緩存擊穿、緩存穿透、緩存雪崩的解決方案

    淺談Redis緩存擊穿、緩存穿透、緩存雪崩的解決方案

    這篇文章主要介紹了淺談Redis緩存擊穿、緩存穿透、緩存雪崩的解決方案,緩存是分布式系統(tǒng)中的重要組件,主要解決在高并發(fā)、大數(shù)據(jù)場景下,熱點(diǎn)數(shù)據(jù)訪問的性能問題,需要的朋友可以參考下
    2023-03-03
  • redistemplate下opsForHash操作示例

    redistemplate下opsForHash操作示例

    這篇文章主要為大家介紹了redistemplate下opsForHash操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • redis擊穿現(xiàn)象如何防止

    redis擊穿現(xiàn)象如何防止

    本文主要介紹了redis擊穿現(xiàn)象如何防止,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Redis哨兵模式實(shí)現(xiàn)一主二從三哨兵

    Redis哨兵模式實(shí)現(xiàn)一主二從三哨兵

    本文主要介紹了Redis哨兵模式實(shí)現(xiàn)一主二從三哨兵,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 在CenOS系統(tǒng)下安裝和配置Redis數(shù)據(jù)庫的教程

    在CenOS系統(tǒng)下安裝和配置Redis數(shù)據(jù)庫的教程

    這篇文章主要介紹了在CenOS系統(tǒng)下安裝和配置Redis數(shù)據(jù)庫的教程,Redis是一個(gè)可基于內(nèi)存的高性能NoSQL數(shù)據(jù)庫,需要的朋友可以參考下
    2015-11-11
  • 如何自定義redis工具jar包供其他SpringBoot項(xiàng)目直接使用

    如何自定義redis工具jar包供其他SpringBoot項(xiàng)目直接使用

    這篇文章主要介紹了如何自定義redis工具jar包供其他SpringBoot項(xiàng)目直接使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評論