IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码

Redis 高效删除大key,Redis批量删除key,Redis删除大量key,Redis面试题

IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码

一、大key的删除问题

大key(bigkey)是指 key 的 value 是个庞然大物,例如 Hashes, Sorted Sets, Lists, Sets,日积月累之后,会变得非常大,可能几十上百MB,甚至到GB。

如果对这类大key直接使用 del 命令进行删除,会导致长时间阻塞,甚至崩溃。

因为 del 命令在删除集合类型数据时,时间复杂度为 O(M),M 是集合中元素的个数。

Redis 是单线程的,单个命令执行时间过长就会阻塞其他命令,容易引起雪崩。

二、解决方案

可靠方案:

  • 渐进式删除
  • UNLINK (4.0版本以后)

1. 渐进式删除

思路:

分批删除,通过 scan 命令遍历大key,每次取得少部分元素,对其删除,然后再获取和删除下一批元素。

示例:

  • 删除大 Hashes

步骤:

(1)key改名,相当于逻辑上把这个key删除了,任何redis命令都访问不到这个key了

(2)小步多批次的删除

伪代码:

# key改名
newkey = "gc:hashes:" + redis.INCR( "gc:index" )
redis.RENAME("my.hash.key", newkey)

# 每次取出100个元素删除
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个成员
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 推出了一个重要命令 UNLINK,用来拯救 del 删大key的困境。

UNLINK 工作思路:

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

(2)后台线程执行真正的释放空间的操作。

UNLINK 基本可以替代 del,但个别场景还是需要 del 的,例如在空间占用积累速度特别快的时候就不适合使用UNLINK,因为 UNLINK 不是立即释放空间。

三、总结

  • 使用 del 删除大key可能会造成长时间阻塞,甚至崩溃。
  • 可以使用渐进式删除,对 Hashes, Sorted Sets, Lists, Sets 分别处理,思路相同,先逻辑删除,对key改名,使客户端无法使用原key,然后使用批量小步删除。
  • 4.0版本以后可以使用 UNLINK 命令,后台线程释放空间。

文章永久链接:https://tech.souyunku.com/?p=11794


Warning: A non-numeric value encountered in /data/wangzhan/tech.souyunku.com.wp/wp-content/themes/dux/functions-theme.php on line 1154
赞(62) 打赏



未经允许不得转载:搜云库技术团队 » Redis 高效删除大key,Redis批量删除key,Redis删除大量key,Redis面试题

IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码
IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码

评论 抢沙发

大前端WP主题 更专业 更方便

联系我们联系我们

觉得文章有用就打赏一下文章作者

微信扫一扫打赏

微信扫一扫打赏


Fatal error: Uncaught Exception: Cache directory not writable. Comet Cache needs this directory please: `/data/wangzhan/tech.souyunku.com.wp/wp-content/cache/comet-cache/cache/https/tech-souyunku-com/index.q`. Set permissions to `755` or higher; `777` might be needed in some cases. in /data/wangzhan/tech.souyunku.com.wp/wp-content/plugins/comet-cache/src/includes/traits/Ac/ObUtils.php:367 Stack trace: #0 [internal function]: WebSharks\CometCache\Classes\AdvancedCache->outputBufferCallbackHandler() #1 /data/wangzhan/tech.souyunku.com.wp/wp-includes/functions.php(5109): ob_end_flush() #2 /data/wangzhan/tech.souyunku.com.wp/wp-includes/class-wp-hook.php(303): wp_ob_end_flush_all() #3 /data/wangzhan/tech.souyunku.com.wp/wp-includes/class-wp-hook.php(327): WP_Hook->apply_filters() #4 /data/wangzhan/tech.souyunku.com.wp/wp-includes/plugin.php(470): WP_Hook->do_action() #5 /data/wangzhan/tech.souyunku.com.wp/wp-includes/load.php(1097): do_action() #6 [internal function]: shutdown_action_hook() #7 {main} thrown in /data/wangzhan/tech.souyunku.com.wp/wp-content/plugins/comet-cache/src/includes/traits/Ac/ObUtils.php on line 367