redis 好在哪里

基于内存

redis是nosql(not only sql)的一种

redis是基于内存的,除了redis的持久化无须与磁盘打交道

基于内存的当然比基于磁盘要快,这也是redis 快的原因

 

丰富的数据结构

redis内置了丰富的数据结构,

string,list,hash,set,sortedset

这些基本都能满足日常的使用了

这些数据结构和我们平时见的数组、链表、hash表不太一样,

是各种基础数据结构的组装变异,感觉学起来还是很费劲的,

sortedset 底层更是有跳跃表这样牛逼的结构

 

redis是单线程的

redis是多线程的嘛?

redis是单线程为什么还这么快呢

 

redis 是单线程的,单线程反而减少了多线程上下文切换的不必要的开销

单线程不用考虑锁

 

IO多路复用

说实话这一块到现在也整的不是多明白。。。

是一种非阻塞IO

redis本来就是单线程的,你再搞个阻塞io,每次和磁盘交互都是阻塞式,那redis还能快到哪里

因此就把io方式作为一个优化点,采取io多路复用

 

“多路”指的是多个网络连接,“复用”指的是复用同一个线程。

采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求,加上基于内存使得redis支持比较高的并发量和吞吐量

io模型可以参考下面的博客

http://xinyeshuaiqi.cn/2019/01/24/io%e6%a8%a1%e5%9e%8b/

 

redis使用的是reactor模式,通过「事件驱动和事件处理器」来完成对多个socket的非阻塞处理

redis默认的是epoll,并没有用select

 

客户端连接请求redis server,seletor读到server socket上的连接事件,并把事件压入事件队列,根据队列先入先出,再把事件给到事件分派器

做一个转发分派,一个事件对应到一个事件处理器,eventHandler/eventListener,比如连接请求事件就打到连接应答(事件)处理器

这时会触发连接应答处理器的操作,创建和客户端连接的socket

 

 

client和redis server建立 socket连接后

客户端 set key value

selector监听到socket 的 read event 事件

到对应的命令请求(事件)处理器,读出socket中的key,value,存入内存

 

然后redis 把针对客户端当前请求的返回数据准备好,把socket置为 write event(可写事件)

再到命令回复(事件)处理器

就会把redis要返回数据写入socket

 

简化版大致是这样的流程把。。。

上图画的selector可能不对

估计很多地方写的会有问题

selector会一直轮询socket,然后对socket上产生的事件进行分发处理

感觉核心在于通过事件驱动来解藕操作,变阻塞为非阻塞

 

 

 

 

 

 

 

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部