随笔 - 214  文章 - 0 评论 - 11 阅读 - 20万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

【懒惰删除】
Redis内部利用单线程处理了绝大部分指令,但对于一些耗时的操作,还有几个异步线程在做支撑。对于大部分key来说,del指令非常快,但如果key的value是一个很大的对象,那么del就会造成卡顿,所以Redis4.0引入了unlink指令,可以对删除操作进行懒处理,即不立即进行删除操作,而是交给一个异步线程处理并回收内存。

当执行unlink指令后,主线程不会再访问这个key,交给异步线程处理。
【flush】
Redis中的flushdb和flushall指令是极其缓慢的动作,Redis4.0后,在这两个指令后增加async操作,整个key集合即交给后台线程慢慢处理。
【异步队列-LazyFree】
主线程将对象的引用从key结构中摘除后,会将这个key的内存回收操作包装成一个任务,塞进异步任务队列中,后台线程会从这个异步队列中取任务。任务队列被主线程和异步线程同时操作,所以必须保证这个队列的线程安全。
如果key所占用的内存很小,延后处理就没有必要了,此时Redis会直接回收。
【异步队列-AOF Sync】
Redis每1秒需要将AOF日志存到磁盘,确保尽量不丢消息,这个操作是比较耗时的,所以Redis也将这个操作移到异步线程来完成。执行AOF Sync操作的线程是一个独立的异步线程,和前面的LazyFree线程不一样,同样也有一个属于自己的任务队列,队列里只存放AOF Sync任务。
【更多的异步删除处理】
除了del指令和flush操作之外,Redis在key过期,LRU淘汰,rename指令过程也会实施回收内存。此外,还有一种特殊的flush操作,其发生于正在进行全量同步的从节点中,在接受完整的rdb文件后,也需要将当前的内存一次性清空,以加载整个rdb文件的内容到内存。
打开这些点需要额外进行设置:
slave-lazy-flush:从节点接收完rdb后的flush操作
lazyfree-lazy-eviction:内存达到maxmemory时进行淘汰
lazyfree-lazy-expire key:过期删除
lazyfree-lazy-server-del rename:指令删除destKey

 
posted on   长江同学  阅读(577)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示