目录
基于内存
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 好在哪里
说点什么
您将是第一位评论人!