写过一篇 发表于 2025-4-15 02:06:38

Redis:线程模子

单线程模子

https://i-blog.csdnimg.cn/img_convert/e04d7f7e1af8dc184e4d7f0498b950cf.png
Redis 自诞生以来,一直以高性能著称。很多人好奇,Redis 为什么早期接纳单线程模子,它真的比多线程还快吗? 着实,Redis 的“快”并不在于并发线程,而在于其团体架构计划极致简朴高效,重要体现在:

[*] 基于内存(最重要的缘故起因),性能瓶颈不在 CPU:Redis 的数据全部存储在内存中,访问不涉及磁盘 I/O,CPU 在大多数环境下并不是瓶颈,因此不必要多线程分摊盘算压力。
[*] 数据存取非常快:

[*] Redis 存储在内存中,读写速度靠近极限;
[*] 不必要频仍的上下文切换、内核态与用户态的转换;
[*] 执行服从高,每个请求处置惩罚成本低。

[*] 制止多线程带来的复杂性:

[*] 单线程模子可以制止加锁、解锁、死锁等多线程并发问题;
[*] 无需线程上下文切换,节省 CPU 时间;
[*] 更容易实现和维护。

[*] 多路复用机制:Redis 利用了基于变乱驱动的 epoll(Linux)实现的I/O 多路复用模子,可以或许高效地处置惩罚大量客户端连接请求。
[*] 高效数据结构:非常适合内存操作的高效数据结构:SDS(简朴动态字符串),ziplist,listpack,quicklist,跳表 skiplist; 这些结构可以保证极快的插入、查询、遍历服从。
引入多线程的缘故起因

随着 Redis 用户量剧增、业务规模扩大,Redis 面临了一些新的挑战,也就是Redis的性能瓶颈:
网络 I/O,当连接数剧增(特别是高并发大请求的场景),网络数据的读取/写入成为瓶颈:


[*] 固然命令执行依然快速;
[*] 但主线程必要耗费大量时间在“读 socket、写 socket、解析协议”上。
为了解决网络瓶颈问题,Redis 从 6.0 开始引入 I/O 多线程机制:


[*]仍然保存主线程执行命令的模子;
[*]引入多个后台 I/O 线程负责读写 socket 数据;
[*]实现真正意义上的读写分离、I/O 解耦。
I/O 线程只做纯粹的网络数据传输,不涉及数据结构修改,不会产生线程安全问题,也不会粉碎原有的单线程执行语义。
无法充实利用多核资源:多核时代,单线程只能用一个 CPU 核心,处置惩罚海量并发请求时本领不足。
三个核心后台线程

Redis 除了主线程之外,还有 3 个重要的后台线程,称为 BIO(Background I/O)线程,用于异步处置惩罚阻塞或耗时使命:
https://i-blog.csdnimg.cn/img_convert/e8e79aa05448b5d035c444c41307d125.png
释放内存线程


[*]异步释放内存:Redis 执行删除、镌汰数据操作时,释放内存线程在后台异步释放内存,制止主线程卡顿,尤其处置惩罚大量数据删除时,能分散内存释放压力,保证体系并发处置惩罚本领。
[*]内存碎片整理:定期检查内存,整理碎片,归并不连续空闲内存块,进步内存利用率,降低内存分配失败概率,增强服务器稳定性。
AOF 刷盘线程


[*]日记重写:AOF 文件随时间和写操作增多会变大,AOF 重写线程在后台重写,依据数据库状态将键值对操作重记为命令,天生更小 AOF 文件,缩短服务器启动和数据规复时间。
[*]数据同等性保证:重写时对数据库快照,记载开始状态,依据重写期间命令更新快照,归并更新后快照和命令记载成新 AOF 文件,确保数据同等性。
处置惩罚关闭文件线程


[*]大对象释放:删除或过期大对象时,Redis 将其放入待释放队列,由线程在后台逐步释放,制止主线程长时间阻塞,提升体系团体可用性。
[*]资源合理利用:根据体系负载和内存利用环境,合理安排大对象释放时间和频率,业务高峰期减慢释放,低谷期加速释放。
BIO 线程功能AOF 刷盘线程在 everysec 策略下,每秒由后台线程执行 fsync 持久化释放内存线程删除大 key 或触发过期镌汰时,为制止阻塞主线程,异步执行处置惩罚关闭文件线程在 AOF 重写、RDB 持久化竣事后,异步关闭文件形貌符,释放资源 三个或多个 I/O 线程

Redis 在 6.0 之后支持配置多少个 I/O 线程,用于处置惩罚网络读取和写入:
类型形貌读线程从客户端连接读取请求数据、解析协议写线程将主线程处置惩罚完的响应结果写回客户端默认配置默认只开启“写多线程”,读仍然由主线程处置惩罚 配置方式(redis.conf):
io-threads 4               # 开启 4 个 I/O 线程(建议2-8之间)
io-threads-do-reads yes      # 启用读请求的多线程处理(默认关闭)
注意:即便开启多线程,命令解析和执行仍然是由 主线程 完成!
   参考资料:小林coding

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Redis:线程模子