Redis 单线程模型分析
Redis 采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。
题外话,服务端编程的3大性能杀手:
1、大量线程导致的线程切换开销。
2、各种锁。
3、非必要的内存拷贝。
不过,因为一般的内存操作都是简单存取操作,线程占用时间相对较短,主要问题在io上,因此, redis 这种模型是合适的,但是如果某一个线程出现问题导致线程占用很长时间,那么 reids 的 单线程 模型效率可想而知。
总体来说快速的原因如下:
- 绝大部分请求是纯粹的内存操作(非常快速)
- 采用单线程,避免了不必要的上下文切换和竞争条件
- 非阻塞IO
内部实现采用epoll
,采用了epoll
+ 自己实现的简单的事件框架。epoll
中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在 IO
上浪费一点时间 。
这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis
为特殊的场景选择了合适的技术方案。
关于线程安全问题
redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个 redis 操作的复合操作来说,依然需要锁,而且有可能是分布式锁。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/107.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。