所有分类
  • 所有分类
  • 未分类

Redis原理-为什么性能高,速度快?

简介

本文介绍为什么Redis速度很快,性能很高。

本技术也是Java后端面试中经常问到的问题。

Redis为什么速度很快

  1. 数据存放在内存中
    1. 内存的读写速度是磁盘(数据库)的一百倍左右。
  2. 用C语言实现
    1. C语言更底层, 执行速度相对会更快。
  3. 使用了多路复用
    1. Redis是单线程的,但内部使用了IO多路复用提高性能。
  4. 作者对代码的精打细磨
    1. 曾经有人评价Redis是少有的集性能和优雅于一身的开源代码。

Redis单线程的优缺点

单进程单线程优势

  1. 没有多线程竞争锁的性能消耗。
  2. 没有多线程导致的切换而消耗CPU。

单进程单线程弊端

无法发挥多核CPU性能。不过可以通过在单机开多个Redis实例来完善;

 //CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽

为什么单线程还这么快?

概述

Redis是单线程的,它的网络IO和命令的执行(键值对读写)是由一个线程来完成的。但Redis的其他操作提高了性能:

  1. Redis的其他功能是由其他线程来执行的,比如持久化、异步删除、集群数据同步等。
  2. I/O多路复用(非阻塞I/O)
    1. Redis采用epoll做为I/O多路复用技术的实现,Redis将epoll进行了封装,它自身的事件处理模型将epoll中的连接、读写、关闭都转换为了事件,不在I/O上浪费过多的时间。

IO多路复用

简介

Redis 采用网络IO多路复用技术来保证多连接时的高吞吐量。

多路:指的是多个网络连接,复用:指的是复用一个线程。采用多路I/O复用技术可以让单个线程处理多个连接请求(文件句柄)。一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,交出CPU。

多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术,Redis使用的epoll(Netty也是用的这个)。

Redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:

  1. 多个 socket
  2. IO 多路复用程序
  3. 文件事件分派器
  4. 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

处理流程 

多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

来看客户端与 redis 的一次通信过程

Redis6的多线程

在 Redis 中,单线程的性能瓶颈主要在网络IO操作上。如果要对一些大的键值对进行删除操作的话,短时间内是删不完的,对于单线程来说就会阻塞后边的操作。

Redis6.0的多线程:将网络数据读写和协议解析用多线程的方式来处理,对于命令执行来说,仍然使用单线程操作。也就是说,Redis6.0的多线程是为了解决其网络IO的瓶颈。

4

评论2

请先

  1. redis后来改成多线程了,希望补充
    褪墨 2024-05-22 0
    • 已更新。Redis6是在网络IO方面启用多线程,命令执行依然是单线程。
      自学精灵 2024-05-22 1
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录