Redis多线程原理详解

本文深入探讨Redis的单线程实现及多线程模型,分析Redis如何在单线程中处理文件事件和时间事件,以及多线程在接收请求、解析参数和响应客户端时的应用。同时,解释了Redis如何在多线程环境下实现无锁操作,以及其特有的任务分发机制避免了线程同步的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章为你解答以下问题:

  • 0:redis单线程的实现流程是怎样的?
  • 1:redis哪些地方用到了多线程,哪些地方是单线程?
  • 2:redis多线程是怎么实现的?
  • 3:redis多线程是怎么做到无锁的?

C/C++ Linux服务器开发高级架构学习视频点击:C/C++Linux服务器开发高级架构/Linux后台架构师

网路io底层epoll,单线程redi,多线程memcached,多进程Nginx

0:redis单线程的实现流程是怎样的?

Redis一开始是单线程模型,在一个线程中要同时处理两种事件:文件事件和时间事件

文件事件主要是网络I/O的读写,请求的接收和回复

时间事件就是单次/多次执行的定时器,如主从复制、定时删除过期数据、字典rehash等

redis所有核心功能都是跑在主线程中的,像aof文件落盘操作是在子线程中执行的,那么在高并发情况下它是怎么做到高性能的呢?

由于这两种事件在同一个线程中执行,就会出现互相影响的问题,如时间事件到了还在等待/执行文件事件,或者文件事件已经就绪却在执行时间事件,这就是单线程的缺点,所以在实现上要将这些影响降到最低。那么redis是怎么实现的呢?

定时执行的时间事件保存在一个链表中,由于链表中任务没有按照执行时间排序,所以每次需要扫描单链表,找到最近需要执行的任务,时间复杂度是O(N),redis敢这么实现就是因为这个链表很短,大部分定时任务都是在serverCron方法中被调用。从现在开始到最近需要执行的任务的开始时间,时长定位T,这段时间就是属于文件事件的处理时间,以epoll为例,执行epoll_wait最多等待的时长为T,如果有就绪任务epoll会返回所有就绪的网络任务,存在一个数组中,这时我们知道了所有就绪的socket和对应的事件(读、写、错误、挂断),然后就可以接收数据,解析,执行对应的命令函数。

如果最近要执行的定时任务时间已经过了,那么epoll就不会阻塞,直接返回已经就绪的网络事件,即不等待。

总之单线程,定时事件和网络事件还是会互相影响的,正在处理定时事件网络任

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值