redis6的多线程解决了什么问题
redis6的多线程解决了什么问题
一、单线程redis的问题
- 只能使用单个的CPU核,无法发挥当前多核CPU的优势
- 如果要删除的键过大,会导致服务端阻塞好几秒
- QPS很难再提高
针对这些问题,redis在4.0的版本引入了Lazy Free;在6.0的版本引入了多线程IO,逐步向多线程过度。
二、单线程的原理
1.事件驱动
redis服务端是一个事件驱动的程序,服务端需要处理下面两类的事件:
文件事件
Redis基于Reactor模式开发了自己的I/O事件处理器,也就是文件事件处理器,Redis在I/O事件处理上,采用了I/O多路复用技术,同时监听多个套接字,并为套接字关联不同的事件处理函数,通过一个线程实现了多客户端并发处理。
时间事件
2.Lazy Free
同步删除很简单,只要把key和value删除,如果有内层引用,则进行递归删除,这里不做介绍。下面看下异步删除,Redis在回收对象时,会先计算回收收益,只有回收收益在超过一定值时,采用封装成Job加入到异步处理队列中,否则直接同步回收,这样效率更高。回收收益计算也很简单,比如String
类型,回收收益值就是1,而Set
类型,回收收益就是集合中元素个数。
Lazy Free
线程专门用于大键的回收,同时,也去掉了聚合类型的共享对象,这为多线程带来可能,Redis也不负众望,在6.0版本实现了多线程I/O
。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!