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

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 的一次通信过程

3

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录