redis-单线程架构

Posted arctic_fox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis-单线程架构相关的知识,希望对你有一定的参考价值。

单线程模型:

  redis中的数据结构并不全是简单的kv还有list、hash等复杂的结构这些结构很可能会进行细粒度的操作,比如在很长的列表偶棉添加一个元素,在hash当中或者删除一个对象这样的一个操作就会添加很多的锁,导致同步的开销大大增加,redis权衡之后选择使用单线程,突出自己功能的灵活性在单线程基础上任何原子操作都可以无代价的实现,多复杂的数据结构都可以轻松运用

  Redis客户端对服务端的每次调用都经历了发送命令、执行命令、返回结果三个过程,其中执行命令阶段,由于redis是单线程来处理命令的,所以每一条到达服务端的命令不会立即执行,所有的命令都会进入一个队列中,然后逐个被执行,并且多个客户端发送的命令的执行顺序是不确定的,但是可以确定的是不会有两个命令被同时执行,不会产生并发问题,这就是redis的单线程基本模型

  单线程模型每秒万级别处理能力的原因:

    1 纯内存访问,数据存放在内存中,内存的响应时间大约是100ns,这是redis每秒万级别访问的重要基础

    2 非阻塞I/O,redis采用epoll作为I/O多路复用技术的实现,再加上redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为了时间,不在I/O上浪费过多的时间

    3 单线程避免了线程切换和竞态产生的消耗

    4 redis采用单线程模型,每条命令执行如果占用大量时间,会造成其他线程的阻塞,对于redis这种高性能服务是致命的,所以redis是面向高速执行的数据

Redis常见问题:

Redis为什么是单线程的?

  因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽,既然单线程容易实现,而且CPU不会成为瓶颈,那就顺便成章的采用单线程的方案

如果万一CPU成为你的Redis瓶颈了,或者,你就是不想让服务器其他核闲置,那怎么办?

  那也很简单,你多起几个Redis进程就好了。Redis是keyvalue数据库,又不是关系数据库,数据之间没有约束。只要客户端分清哪些key放在哪个Redis进程上就可以了。redis-cluster可以帮你做的更好

 

以上是关于redis-单线程架构的主要内容,如果未能解决你的问题,请参考以下文章

redis-单线程架构

API的理解和使用——单线程架构

Redis单线程架构以及工作方式

单线程的 Redis 为什么这么快?

高并发架构系列:Redis为什么是单线程及高并发快的3大原因详解

令仔学Redis----单线程架构