最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis如何高效刪除大key

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

大key的刪除問題

大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í)間過長(zhǎng)就會(huì)阻塞其他命令,容易引起雪崩。

解決方案

不可靠方案:

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

可靠方案:

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

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

思路:

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

示例:

  • 刪除大 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è)別場(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改名,使客戶端無法使用原key,然后使用批量小步刪除。

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

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

相關(guān)文章

  • Redis緩存與數(shù)據(jù)庫(kù)一致性的完整指南

    Redis緩存與數(shù)據(jù)庫(kù)一致性的完整指南

    某金融平臺(tái)因緩存數(shù)據(jù)不一致導(dǎo)致用戶余額錯(cuò)亂,損失千萬!文中將用銀行對(duì)賬比喻+實(shí)戰(zhàn)代碼,揭秘6大解決方案,讓你的數(shù)據(jù)毫秒級(jí)同步,所以本文給大家詳細(xì)介紹了Redis緩存與數(shù)據(jù)庫(kù)一致性的完整指南,需要的朋友可以參考下
    2025-09-09
  • 深度剖析Redis字符串操作指南從入門到實(shí)戰(zhàn)應(yīng)用

    深度剖析Redis字符串操作指南從入門到實(shí)戰(zhàn)應(yīng)用

    Redis字符串類型二進(jìn)制安全,支持文本、數(shù)字、二進(jìn)制等數(shù)據(jù),涵蓋基礎(chǔ)操作、數(shù)字計(jì)算、過期管理及分布式鎖等應(yīng)用,結(jié)合優(yōu)化策略提升系統(tǒng)性能,本文給大家介紹Redis字符串操作指南,感興趣的朋友一起看看吧
    2025-07-07
  • Redis分布式鎖實(shí)例分析講解

    Redis分布式鎖實(shí)例分析講解

    分布式鎖是控制分布式系統(tǒng)不同進(jìn)程共同訪問共享資源的一種鎖的實(shí)現(xiàn)。如果不同的系統(tǒng)或同一個(gè)系統(tǒng)的不同主機(jī)之間共享了某個(gè)臨界資源,往往需要互斥來防止彼此干擾,以保證一致性
    2022-12-12
  • 深入理解redis刪除策略和淘汰策略

    深入理解redis刪除策略和淘汰策略

    每隔一段時(shí)間就掃描一定數(shù)據(jù)的設(shè)置了過期時(shí)間的key,并清除其中已過期的keys,本文主要介紹了深入理解redis刪除策略和淘汰策略,感興趣的可以了解一下
    2024-08-08
  • Redis底層數(shù)據(jù)結(jié)構(gòu)SkipList的實(shí)現(xiàn)

    Redis底層數(shù)據(jù)結(jié)構(gòu)SkipList的實(shí)現(xiàn)

    本文主要介紹了Redis底層數(shù)據(jù)結(jié)構(gòu)SkipList的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Redis中的數(shù)據(jù)一致性問題以及解決方案

    Redis中的數(shù)據(jù)一致性問題以及解決方案

    這篇文章主要介紹了Redis中的數(shù)據(jù)一致性問題以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Redis配置日志實(shí)現(xiàn)過程

    Redis配置日志實(shí)現(xiàn)過程

    本文介紹了如何在Redis中配置日志文件, 找到并配置文件,找到logfile項(xiàng)并填入日志路徑,建立日志文件夾,并保存配置文件.注意帶配置文件啟動(dòng)且指定日志等級(jí). 此外還提供了些注意事項(xiàng)
    2026-05-05
  • Redis Sorted Set 跳表的實(shí)現(xiàn)示例

    Redis Sorted Set 跳表的實(shí)現(xiàn)示例

    本文詳細(xì)解析了Redis中SortedSet跳表的實(shí)現(xiàn)原理,闡述了跳表的基本概念、結(jié)構(gòu)及其在SortedSet中的應(yīng)用,同時(shí)也指出了跳表在實(shí)際使用中的優(yōu)勢(shì)和局限,可以更好地運(yùn)用Redis的SortedSet,優(yōu)化高并發(fā)環(huán)境中的數(shù)據(jù)查詢與操作,感興趣的可以了解一下
    2024-10-10
  • 使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜功能

    使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜功能

    排行榜功能是一個(gè)很普遍的需求。使用 Redis 中有序集合的特性來實(shí)現(xiàn)排行榜是又好又快的選擇。接下來通過本文給大家介紹使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜功能,需要的朋友可以參考下
    2021-07-07
  • Redis集群的實(shí)現(xiàn)全過程

    Redis集群的實(shí)現(xiàn)全過程

    Redis集群的實(shí)現(xiàn)方案主要有客戶端分片、代理模式和Cluster模式,其中,Cluster模式是Redis官方推薦的實(shí)現(xiàn)方案,它具有高可用性、高性能和自動(dòng)分片等優(yōu)點(diǎn)
    2024-12-12

最新評(píng)論

乌审旗| 赤壁市| 兰州市| 崇州市| 社会| 浠水县| 安多县| 阳原县| 承德市| 昌平区| 唐山市| 区。| 乐平市| 桂林市| 吴旗县| 康马县| 东安县| 合作市| 宜良县| 全椒县| 封丘县| 山东| 勐海县| 石林| 新野县| 上虞市| 拉孜县| 红桥区| 睢宁县| 将乐县| 织金县| 敦化市| 额尔古纳市| 樟树市| 渝中区| 武川县| 林周县| 夹江县| 定陶县| 鸡西市| 海伦市|