一个键值数据库包括了访问框架、索引模块、操作模块、和存储模块四部分 。
image.png

image.png

哈希表的冲突问题 和rehash可能带来的操作阻塞

redis并不是单线程,但是一般称redis为单线程高性能。 持久化、异步删除、集群数据同步等都是由额外的线程执行的。

高性能IO模型:为什么单线程Redis能这么快?

为什么用单线程? 为什么单线程能这么快?

为什么采用单线程? 先了解多线程的开销

多线程的开销

多线程增加系统吞吐率,增加系统扩展性。降低了系统代码的易调试性和可维护性。为了避免这些问题,Redis直接采用了单线程模式。

单线程Redis为什么这么快?

  1. Redis大部分操作在内存中完成,采用高效数据结构,比如哈希和调表。
  2. Redis采用多路复用机制,使其在网络IO操作中能并发处理大量的客户请求,实现高吞吐率。

网络模型 监听 连接 读取 写。 连接(accept)和读(recv)可能会堵塞。但是socket网络模型本身支持非阻塞模式。

基于多路复用的高性能I/O模型

Linux中的I/O多路复用机制是指一个线程处理多个IO流。
Redis只运行单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字。
image.png
Redis网络框架调用epoll机制,Redis线程不会阻塞在某一个特定的监听或已连接套接字上。Redis同事和多个客户端连接并处理请求,从而提升并发性。

为了在请求到达时能通知到Redis线程,select/epoll提供了基于事件的回调机制,即针对不同事件的发生,调用相应的处理函数。

Redis真的只有单线程么? 为什么用单线程? 单线程为什呢这么快?
**
Redis单线程是指它对网络IO和数据读写的操作采用了一个县城。而采用单线程的一个核心原因是避开多线程开发的并发控制问题。

image.png