平波缓进 —— 懒惰删除

一直以来我们认为 Redis 是单线程的,单线程为 Redis 带来了代码的简洁性和丰富多样的数据结构。不过Redis内部实际上并不是只有一个主线程,它还有几个异步线程专门用来处理一些耗时的操作。

Redis 为什么要懒惰删除(lazy free)?

删除指令 del 会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟。不过如果删除的 key 是一个非常大的对象,比如一个包含了千万元素的 hash,那么删除操作就会导致单线程卡顿。

Redis 为了解决这个卡顿问题,在 4.0 版本引入了 unlink 指令,它能对删除操作进行懒处理,丢给后台线程来异步回收内存。

unlink key
OK
如果有多线程的开发经验,你肯定会担心这里的线程安全问题,会不会出现多个线程同时并发修改数据结构的情况存在。

关于这点,我打个比方。可以将整个 Redis 内存里面所有有效的数据想象成一棵大树。当 unlink 指令发出时,它只是把大树中的一个树枝别断了,然后扔到旁边的火堆里焚烧 (异步线程池)。树枝离开大树的一瞬间,它就再也无法被主线程中的其它指令访问到了,因为主线程只会沿着这颗大树来访问。

flush

Redis 提供了 flushdb 和 flushall 指令,用来清空数据库,这也是极其缓慢的操作。Redis 4.0 同样给这两个指令也带来了异步化,在指令后面增加 async 参数就可以将整棵大树连根拔起,扔给后台线程慢慢焚烧。

关于 Redis 的 懒惰删除 (十三)相关推荐

  1. 【Redis】懒惰删除

    一直以来我们认为 Redis 是单线程的,单线程为 Redis 带来了代码的简洁性和丰富多样的数据结构.不过Redis内部实际上并不是只有一个主线程,它还有几个异步线程专门用来处理一些耗时的操作. R ...

  2. Redis之懒惰删除

    Redis内部有一个异步线程叫做BIO(background io),懒惰删除的内存回收就是使用这个线程异步去做的. 非异步回收 redis最开始实现懒惰删除时,并不是在异步线程里做,而是在异步线程里 ...

  3. 如履薄冰 —— Redis懒惰删除的巨大牺牲

    前言 之前我们介绍了Redis懒惰删除的特性,它是使用异步线程对已经删除的节点进行延后内存回收.但是还不够深入,所以本节我们要对异步线程逻辑处理的细节进行分析,看看Antirez是如何实现异步线程处理 ...

  4. 如履薄冰:Redis 懒惰删除的巨大牺牲

    作者 | 老钱 责编 | 胡巍巍 大家都知道 Redis 是单线程的,但是 Redis 4.0 增加了懒惰删除功能,懒惰删除需要使用异步线程对已删除的节点进行内存回收,这意味着 Redis 底层其实并 ...

  5. Redis 大键值对 Big Key 懒惰删除机制

    一.懒惰删除介绍 在删除元素数量很多的集合(set/hash/list/sortedSet)时,无论是使用DEL命令删除还是redis为了释放内存空间而进行的删除,在删除这些big key的时候,会导 ...

  6. Redis进阶-Redis的惰性删除

    文章目录 Pre del ------> unlink FLUSHDB/FLUSHALL --> FLUSHDB ASYNC/FLUSHALL ASYNC 异步队列 AOF Sync 扩展 ...

  7. Redis之惰性删除

    场景 使用del指令删除key时,redis会直接释放对象的内存,当对象很小时这个指令速度是很快的,但是如果是一个很大的对象被del时,那么删除操作就会比较耗时,造成其他指令阻塞,对客户端造成卡顿的现 ...

  8. php redis删除所有key,redis中批量删除key的方法

    Redis是一个高性能的key-value数据库.redis中可以借助Linux的xargs指令来批量删除key,也可以使用flushdb和flushall命令删除所有key. 批量删除Key Red ...

  9. 数据结构和算法分析学习笔记(三)--二叉查找树的懒惰删除(lazy deletion)

    这次的问题来自<数据结构与算法分析(C++描述)>的习题4.16,如下: -------------------------- 4.16  重做二叉查找树类以实现懒惰删除.注意,这将影响所 ...

最新文章

  1. linux doc下生成学号,linux的.doc
  2. 【Socket网络编程】15. 发送端和接收端数据大小不一致时 的分析
  3. 请求服务器 显示非法访问,访问负载均衡出现访问host非法
  4. C++字符串操作函数
  5. Ubuntu 16.04服务器安装及软件配置
  6. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
  7. 用JDBC直连方式访问SQL Server 2005详解
  8. linux ping 虚拟网卡_虚拟机中Linux系统网卡的配置
  9. 【推荐实践】“全能选手”召回表征算法实践.pdf(附下载链接)
  10. Linux下MongoDB服务安装
  11. 超级强大服务器终端,告别 XShell 打造强大的Windows 终端
  12. srs之服务搭建+OBS推流(简单记录)
  13. 互动快报读报软件绿色版 v5.061
  14. Listary——好用到哭的高效快速搜索工具
  15. Git查看本地配置信息
  16. 5g无线图传信号测试软件,不到千元的5G无线图传?小试致迅CineEye
  17. [Cocos Creator] 制作简版消消乐(三):实现方块的生成与交换
  18. 一生的读书计划——影响中国历史进程的中国名人2
  19. 程序员适当来点经济头脑
  20. java 中结束程序方法

热门文章

  1. R语言程序逻辑验证判断
  2. 易票联C#加密的方法
  3. 题材丰富 医药板块初露峥嵘
  4. 学好SEO需要掌握哪些知识要点?
  5. 基于mpvue的微信小程序全栈保姆式教程一
  6. 绕过tp路由器管理密码_tplogin.cn默认密码是什么 tplogin.cn默认密码介绍【详解】...
  7. python点阵显示数字_程序点滴001_Python模拟点阵数字
  8. 前沿丨基于深度学习的点云分割网络及点云分割数据集
  9. php 银行卡4位分隔,javascript将数字四位分隔模拟银行卡号码代码实例
  10. moviepy剪切视频spleeter视频降噪-CPUGPU