0


Redis单线程设计的,但为什么这么快

1、为什么是单线程设计?

对于 redis 来说单线程的设计能够保证性能,多线程在设计和实现上会带来更多的复杂度。但是使用单线程的方式确实无法很好发挥多核 CPU 的性能,可以通过在单机开多个 Redis 实例来完善。

2. 从Redis的性能方面分析

Redis的性能非常之高,每秒可以承受10W+的QPS,主要取决于以下几个方面:

  • Redis大部分操作在内存完成
  • 采用IO多路复用机制
  • 非CPU密集型任务
  • 单线程的优势

纯内存操作

Redis 是基于内存的数据库,那不可避免的就要与磁盘数据库做对比。对于磁盘数据库来说,是需要将数据读取到内存里的,这个过程会受到磁盘 I/O 的限制。

而对于内存数据库来说,本身数据就存在于内存里,也就没有了这方面的开销。

采用IO多路复用机制

  • I/O :网络 I/O
  • 多路:多个 TCP 连接
  • 复用:共用一个线程或进程

生产环境中的使用,通常是多个客户端连接 Redis,然后各自发送命令至 Redis 服务器,最后服务端处理这些请求返回结果。

应对大量的请求,Redis 中使用 I/O 多路复用程序同时监听多个套接字,并将这些事件推送到一个队列里,然后逐个被执行。最终将结果返回给客户端。

非CPU密集型任务

采用单线程的缺点很明显,无法使用多核CPU。Redis作者提到,由于Redis的大部分操作并不是CPU密集型任务,而Redis的瓶颈在于内存和网络带宽。

在高并发请求下,Redis需要更多的内存和更高的网络带宽,否则瓶颈很容易出现在内存不够用和网络延迟等待的情况。

单线程的优点

  • 避免多线程上下文切换导致的性能损耗
  • 避免多线程访问共享资源加锁导致的性能损耗

3. 为什么不采用多进程或多线程处理?

  • ①多线程处理可能涉及到锁
  • ②多线程处理会涉及到线程切换而消耗 CPU

4. 单线程处理的劣势

  • ①耗时的命令会导致并发的下降,不只是读并发,写并发也会下降
  • ②无法发挥多核 CPU 性能,不过可以通过在单机开多个 Redis 实例来完善

5. Redis存在线程安全问题吗

Redis 采用了线程封闭的方式,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个 Redis 操作(即多个 Redis 操作命令)的复合操作来说,依然需要锁,而且有可能是分布式锁。

标签: redis 数据库 java

本文转载自: https://blog.csdn.net/m0_67942533/article/details/126480451
版权归原作者 崇令 所有, 如有侵权,请联系我们删除。

“Redis单线程设计的,但为什么这么快”的评论:

还没有评论