Redis - Redis为什么这么快?

1. Redis为什么这么快?

  1. 数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
  2. 基于内存实现,读写速度快;
  3. Redis 是单线程的,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
  4. 使用IO多路复用模型:Redis 利用 epoll 来实现IO多路复用,可以处理并发的连接,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器;
  5. 简单的自定义协议:rest协议(Redis客户端与Redis服务器通讯的协议)。

1.1 高效的数据结构

Redis的底层数据结构一共有六种,分别是:

  • 简单动态字符串(SDS)
  • hash表(散列表/字典)
  • 链表
  • 跳表
  • 整型数组
  • 压缩列表

Redis - Redis为什么这么快?_第1张图片

1.2 基于内存

内存直接由 CPU 控制,也就是 CPU 内部集成的内存控制器,所以说内存是直接与 CPU 对接,享受与 CPU 通信的最优带宽。

Redis 将数据存储在内存中,读写操作不会因为磁盘的 IO 速度限制。

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

在计算机的世界中,CPU的速度是远大于内存的速度的,同时内存的速度也是远大于硬盘的速度。Redis 的操作都是基于内存的,绝大部分请求是纯粹的内存操作,非常迅速。
Redis - Redis为什么这么快?_第2张图片

1.3 单线程

Redis 是单线程的,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。

Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,即一个线程处理所有网络请求,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。

1.4 IO多路复用程序

Redis 利用 epoll 来实现IO多路复用,可以处理并发的连接,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。
Redis - Redis为什么这么快?_第3张图片
非阻塞 IO 内部实现采用 epoll,采用了 epoll + 自己实现的简单的事件框架。epoll 中的读、写、关闭、连接都转化成了事件,然后利用 epoll 的多路复用特性,绝不在 IO 上浪费一点时间。

1.5 Redis的自定义协议

Redis客户端使用RESP(Redis的序列化协议)协议与Redis的服务器端进行通信。 它实现简单,解析快速并且人类可读。

RESP 支持以下数据类型:简单字符串、错误、整数、批量字符串和数组。

RESP 在 Redis 中用作请求-响应协议的方式如下:

  • 客户端将命令作为批量字符串的 RESP 数组发送到 Redis 服务器。
  • 服务器根据命令实现以其中一种 RESP 类型进行回复。

在 RESP 中,某些数据的类型取决于第一个字节:

  • 对于简单字符串,回复的第一个字节是“+”
  • 对于错误,回复的第一个字节是“-”
  • 对于整数,回复的第一个字节是“:”
  • 对于批量字符串,回复的第一个字节是“$”
  • 对于数组,回复的第一个字节是“*”

此外,RESP 能够使用稍后指定的批量字符串或数组的特殊变体来表示 Null 值。在 RESP 中,协议的不同部分总是以“\r\n”(CRLF)终止。

2. Redis的一些常见问题

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

  1. 多线程处理可能涉及到锁。
  2. 多线程处理会涉及到线程切换而消耗 CPU。

2.2 单线程处理的缺点?

  1. 耗时的命令会导致并发的下降,不只是读并发,写并发也会下降。

如:keys 全量遍历键,用来列出所有满足特定正则字符串规则的key,当redis数据量比较大时, 性能比较差,要避免使用

Redis - Redis为什么这么快?_第4张图片

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

2.3 Redis 不存在线程安全问题?

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

2.4 高性能的服务器一定是多线程的?多线程一定比单线程效率高?

Redis将所有的数据全部放在内存中,使用单线程去操作效率比较高,对于多线程,CPU 会有上下文切换,这种操作耗时,对于内存系统来说,没有上下文切换,效率相对是高的。

Redis使用单进程的模式来处理客户端的请求,对大部分事件的响应都是通过 epoll 函数的加强封装,Redis 的实际处理速度依靠主进程的执行效率,epoll 可以显著提高程序在大量并发连接中系统的 CPU 利用率

你可能感兴趣的:(Redis,redis,java,分布式)