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从来都是单线程进行真正意义上的对请求进行处理。(避开对锁的竞争带来的消耗)

总结

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

相关推荐
栗子~~6 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
隔窗听雨眠6 小时前
多活部署、CDN加速与边缘缓存全链路优化实战
缓存
星星也在雾里7 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
未若君雅裁7 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
雨辰AI8 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20249 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有9 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao9 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_748839499 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录9 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能