文章目录

  • 前言
  • lazy free
  • flush
  • 异步队列
  • AOF Sync
  • 更多异步删除点

前言

Redis 虽然是单线程的,但是其内部实际上并不是只有一个主线程,它还有几个异步线程专门用来处理一些耗时的操作。

lazy free

删除指令 del 会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟。不过如果删除的 key 是一个非常大的对象,比如一个包含了千万元素的 hash,那么删除操作就会导致单线程卡顿。
Redis 为了解决这个卡顿问题,在 4.0 版本引入了 unlink 指令,它能对删除操作进行懒处理,丢给后台线程来异步回收内存。

> unlink key
OK

如果有多线程的开发经验,你肯定会担心这里的线程安全问题,会不会出现多个线程同时并发修改数据结构的情况存在。
关于这点,可以将整个 Redis 内存里面所有有效的数据想象成一棵大树。当 unlink 指令发出时,它只是把大树中的一个树枝别断了,然后扔到旁边的火堆里焚烧(异步线程池)。树枝离开大树的一瞬间,它就再也无法被主线程中的其它指令访问到了,因为主线程只会沿着这颗大树来访问。

flush

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

> flushall async
OK

异步队列

主线程将对象的引用从「大树」中摘除后,会将这个 key 的内存回收操作包装成一个任务,塞进异步任务队列,后台线程会从这个异步队列中取任务。任务队列被主线程和异步线程同时操作,所以必须是一个线程安全的队列。

不是所有的 unlink 操作都会延后处理,如果对应 key 所占用的内存很小,延后处理就没有必要了,这时候 Redis 会将对应的 key 内存立即回收,跟 del 指令一样。

AOF Sync

在 Redis 的持久化机制中,我们讲过 AOF。Redis 需要每秒一次(可配置)同步 AOF 日志到磁盘,确保消息尽量不丢失,需要调用 sync 函数,这个操作会比较耗时,会导致主线程的效率下降,所以 Redis 也将这个操作移到异步线程来完成。执行 AOF Sync 操作的线程是一个独立的异步线程,和前面的懒惰删除线程不是一个线程,同样它也有一个属于自己的任务队列,队列里只用来存放 AOF Sync 任务。

更多异步删除点

Redis 回收内存除了del 指令和 flush 之外,还会存在于在 key 的过期、LRU 淘汰、rename 指令以及从库全量同步时接受完 rdb 文件后会立即进行的 flush 操作。Redis4.0 为这些删除点也带来了异步删除机制,打开这些点需要额外的配置选项。

  1. slave-lazy-flush从库接受完 rdb 文件后的 flush 操作
  2. lazyfree-lazy-eviction 内存达到 maxmemory 时进行淘汰
  3. lazyfree-lazy-expire key 过期删除
  4. lazyfree-lazy-server-del rename 指令删除 destKey

Redis 惰性删除相关推荐

  1. redis惰性删除 lazy free 源码剖析,干货满满

    目录 前言 数据删除场景 lazy free 概念 配置 源码剖析(版本 6.2.6) 场景一:客户端执行的显示删除/清除命令 场景二:某些指令带有的隐式删除命令 场景三:删除过期数据 场景四:内存淘 ...

  2. Redis之惰性删除

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

  3. Redis的清洁——定期删除+惰性删除+内存淘汰策略

    为什么要清洁Redis Redis是基于内存上进行数据的操作的,并非像以往我们所安装的底层数据库一样存在磁盘上的.在机子中,缓存的容量是有限的. 比较起存储在磁盘,其可存储量会小很多很多,随着程序的运 ...

  4. 为什么集群要奇数_面试系列 redis数据删除amp;集群

    redis数据删除/内存淘汰 如果我们设置一批key只能存活1小时,那么1小时之后,redis是怎么对这批数据进行删除的? 答案:定期删数+惰性删除 (1)定期删除 指的是redis默认是每隔100m ...

  5. java redis 批量删除key_Redis,就是这么朴实无华

    来自公众号:小姐姐味道作者简介:一个不允许程序员走弯路的公众号.聚焦基础架构和Linux.十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道. Redis是2009年发布的,到今天已经超过10 ...

  6. Redis淘汰删除策略

    Redis淘汰删除策略 Redis淘汰删除策略6种淘汰Key策略3种删除过期键策略定时删除惰性删除定期删除其他模块的淘汰处理RDB 快照持久化创建载入AOF 只追加持久化写入重写主从复模式下对过期键的 ...

  7. java redis 批量删除key_互联网大厂Java工程师面试指南——Redis篇

    注意一下咯:更多关于Java集合.JVM.多线程并发.spring原理.微服务.Netty 与RPC .Kafka.日记.设计模式.Java算法.数据库.Zookeeper.分布式缓存.数据结构面试解 ...

  8. 九、redis的删除机制

    redis是采用定期删除+惰性删除策略 一)redis有三种不同的删除机制 redis数据库键的过期时间都保存在过期字典中,根据系统时间和存活时间判断是否过期. 1,定时删除:实现方式,创建定时器 2 ...

  9. redis 数据删除策略和逐出算法

    数据存储和有效期# 在 redis 工作流程中,过期的数据并不需要马上就要执行删除操作.因为这些删不删除只是一种状态表示,可以异步的去处理,在不忙的时候去把这些不紧急的删除操作做了,从而保证 redi ...

最新文章

  1. php中连接两个值,php - 如何从两个表的连接中选择一个值? - SO中文参考 - www.soinside.com...
  2. csdn自带的在线编辑器如何让图片并排显示
  3. 微服务架构设计模式读书笔记
  4. linux学习作业-第七周
  5. 分享10个2012年最新发布的jQuery插件
  6. 通过MySQL自动同步刷新Redis
  7. csrss.exe系统进程介绍
  8. “耐撕”团队 2016.03.31 站立会议
  9. java+c#+json+时间_Java与C#间json日期格式互转完美解决方案
  10. Axure中继器基础教程(增行、删当前、标记、全部、规则行) Mark
  11. 韩文、日语相关 文档扫描识别 的福音
  12. hive相关的example
  13. 2018-2019 起风了,唯有努力生存
  14. Python实现八字十神的输出
  15. tp link拨号失败 服务器无响应,【求救】K2提示“等待PPP客户端连接”拨号失败...
  16. 脉冲在matlab,脉冲时间信号MATLAB表示
  17. stm32f103电子钟心得体会_STM32时钟小结
  18. 线程锁完成----2021年1月19日19:17:45
  19. 基于android的流动人口管理移动APP(ssm+uinapp+Mysql)
  20. 信息化项目该不该引入监理

热门文章

  1. 深入理解JavaScript学习笔记-第一章
  2. 前端工程师的三种级别,技术决定你能拿5K,还是15K,还是25K
  3. 计算机网络--DHCP分析实验
  4. 基于Unity的2D像素风闯关游戏Demo——SunnyLand
  5. 真香!百度网盘超级会员等级制度,等级越高,特权越多!容量,解压,转存上限,回收站保存时间,全都有!
  6. 【英语流利说】让你发音更标准的十个窍门
  7. 【学习笔记】线段树详解(全)
  8. yoloV4mosaic数据增强,同步Pascal VOC格式的XML标注信息
  9. ariang修改默认服务器,Mac小技巧之AriaNg Native配置
  10. I Want to Know