Redis真的是单线程吗?

Redis真的是单线程吗?

4.0版本前

如果是单线程,那么server对于各个client的请求基于epoll模型将client连接accept以及对请求数据进行解析+处理请求,这一整个过程由于是内存级的,可以通畅进行。

但,对于数据从内存落到磁盘当中呢?磁盘IO的速度相较于内存而言实在太慢,如果交由主线程定时触发持久化保存的操作,那么server就会过一阵卡一下,给client的体验很不好。但实际上用起来却不会因为这个问题导致没有这个client是不是阻塞,这是为什么?

因为既使在早期的Redis4.0版本前,Redis也有两个后台线程close_file负责异步关闭大文件fd,以及AOF_fsync负责AOF的异步刷盘。(注:这里的异步指的是相对于主线程而言,对于这两个后台线程,仍然是同步的)

4.0版本后,6.0版本前

而在4.0版本后,6.0版本前,由于惰性删除和定期删除机制,导致如果是主线程去释放一大块的哈希表内存,则会导致主线程在这一段较长的时间内无法去处理client新来的请求,因此引入了lazy_free线程,其负责异步惰性释放大块的内存空间。(注:这里的异步指的也是相对于主线程而言,对于lazy_free后台线程,仍然是同步的)

6.0版本

而在6.0版本后,由于互联网发展使得流量越来越大,因此为了提高效率,是用的是单reactor+线程池模型,主线程仍然是负责通过epoll对client进行accept,只是对于这些conn发来的请求,主线程将其交给全局共享数组,而后IO线程对全局共享数组进行协议的解析并将解析后的内容写回全局共享数组,主线程从数组中获取请求内容并处理进而生成响应而后将响应写回共享数组,IO线程将响应进行向客户端的发送。

但需要注意的是:无论哪个版本,Redis从来都是单线程进行真正意义上的对请求进行处理。(避开对锁的竞争带来的消耗)

总结

由此我们可以看到,事物的发展从来不是一直不变的,为了迎合业务的需求,技术需要不断进行迭代升级以适配业务场景的需要,毕竟,一切都是为了业务。

相关推荐
广州灵眸科技有限公司5 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手8 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学8 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
二宝哥9 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
oradh10 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898611 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD11 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo11 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
TlSfoward12 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记12 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘