Redis 学习笔记四:Redis 并发很多的请求时候如何变得很快的呢?
Redis 学习笔记四:Redis 并发很多的请求时候如何变得很快的呢?
作者:Grey
原文地址:
博客园:Redis学习笔记四:Redis 并发很多的请求时候如何变得很快的呢?
CSDN:Redis 学习笔记四:Redis 并发很多的请求时候如何变得很快的呢?
原因
-
内存操作
-
使用IO多路复用
-
非CPU密集型任务,Redis的瓶颈在于内存和网络带宽。
我怎么提高多核CPU的利用率?
CPU不太可能是Redis的瓶颈,一般内存和网络才有可能是。 例如使用Redis的管道(pipelining)在liunx系统上运行可以达到500K的RPS(requests per second) ,因此,如果您的应用程序主要使用O(N) 或者O(log(N)) 的命令,他们几乎不需要使用什么CPU。
然而,为了最大限度的使用CPU,可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的,
所以,如果你想使用多个CPU,你可以考虑一下分片(shard) 。。
在Redis的客户端类库里面,比如RB(Ruby的客户端)和Predis(最常用的PHP客户端之一),能够使用一致性哈希(consistent hashing)来处理多个Redis实例。
摘自Redis.cn FAQ:http://www.redis.cn/topics/faq.html
-
单线程的优势
- 避免上下文切换引起的 CPU 消耗
- 没有了访问共享资源加锁的性能损耗
- 没有了线程销毁和创建的性能消耗
-
多线程优化
Redis在处理客户端的请求时,包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。但如果严格来讲从Redis4.0之后并不是单线程,除了主线程外,它也有后台线程在处理一些较为缓慢的操作,例如清理脏数据、无用连接的释放、大 key 的删除等等。
Redis 4.0之后,Redis引入了lazyfree的机制,提供了unlink、flushall aysc、flushdb async等命令和lazyfree-lazy-eviction、lazyfree-lazy-expire等机制来异步释放内存,它主要是为了解决在释放大内存数据导致整个redis阻塞的性能问题。
Redis 6.0,Redis又引入了多线程来完成请求数据的协议解析,进一步提升性能。它主要是解决高并发场景下,单线程解析请求数据协议带来的压力。请求数据的协议解析由多线程完成之后,后面的请求处理阶段依旧还是单线程排队处理,见Redis 6.0 新特性-多线程连环13问!
参考资料
本文来自博客园,作者:Grey Zeng,转载请注明原文链接:https://www.cnblogs.com/greyzeng/p/14750105.html