Redis为什么是单线程?为什么这么快?

2023-11-21 17:12:33 浏览数 (1)

Redis 单线程主要是指 Redis 的网络 I/O 和事件处理采用了单线程模型,而不是 Redis 本身的命令处理采用单线程模型。

1.redis启动线程,C语言源码:

主要有redis-server、持久化(rdb,aof)线程,io线程,jemalloc_bg_thd(后台内存进程管理)

io线程也是后面Redis进行io多路复用的重点

redis的单线程指的是redis-server的命令处理是单线程。

2.redis 命令处理单线程的目的

单线程的局限性:

不能有耗时操作(磁盘io等),主要影响响应性能(多命令请求,导致部分请求阻塞)

3.redis是不是io密集型还是cpu密集型

io密集型:

磁盘io,有些场景属于,比如持久化,通过fork子线程进行rdb,或者异步线程进行aof刷盘

网络io,有些场景属于,多个客户端连接,数据请求或者返回数据量较大(redis 单线程需要解决)

CPU密集型:据请求或者返回数据量较大,rehash数据迁移(数据字典表扩容的时候)。(redis 单线程需要解决)

所以redis,也得考虑解决密集型。

4.redis为什么不采用多线程

  • 避免上下文切换开销:多线程或多进程模型需要频繁地进行上下文切换,而上下文切换会带来额外的开销和时间消耗。单线程模型避免了这种开销,使得 Redis 可以更快地响应客户端的请求。
  • 避免多线程同步问题:多线程模型需要解决线程之间的同步、死锁等问题,这些问题会极大地影响程序的性能和稳定性。而单线程模型不存在这些问题,因此可以更加简单和高效地实现 Redis。
  • 充分利用 CPU 资源:虽然 Redis 是单线程的,但是它可以通过异步 I/O 操作(如 epoll)来充分利用 CPU 资源,从而提高 Redis 的性能。
  • 简化设计和实现:单线程模型使得 Redis 的设计和实现更加简单明了,减少了开发和维护的难度。
  • 丰富数据类型:由于redis丰富的数据类型,并且每个数据类型有不同的数据结构,加锁复杂,锁的颗粒不好控制

​我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞