Loading

Redis 学习笔记四:Redis 并发很多的请求时候如何变得很快的呢?

Redis 学习笔记四:Redis 并发很多的请求时候如何变得很快的呢?

作者:Grey

原文地址:

博客园:Redis学习笔记四:Redis 并发很多的请求时候如何变得很快的呢?

CSDN:Redis 学习笔记四: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问!

参考资料

为什么Redis单线程还这么快?

redis单线程为什么执行速度这么快

Redis.cn FAQ

Why is redis so fast?

posted @ 2021-05-13 14:46  Grey Zeng  阅读(302)  评论(0编辑  收藏  举报