Welcome everyone

redis 好在哪里

redis 汪明鑫 821浏览 0评论

基于内存

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模型可以参考下面的博客

 

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上产生的事件进行分发处理

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

 

 

 

 

 

 

 

转载请注明:汪明鑫的个人博客 » redis 好在哪里

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz