小编典典

Redis如何实现高吞吐量和性能?

redis

我知道这是一个非常笼统的问题。但是,我想了解使Redis(或诸如MemCached,Cassandra之类的缓存)在惊人的性能极限下工作的主要架构决策是什么。

  1. 如何维护连接?
  2. 连接是TCP还是HTTP?
  3. 我知道它完全用C编写。如何管理内存?
  4. 尽管存在竞争的读/写,但用于实现高吞吐量的同步技术有哪些?

基本上,具有内存高速缓存的计算机和可以响应命令的服务器的普通香草实现和Redis框之间有什么区别?我也理解答案必须非常庞大,并且应该包含非常复杂的细节才能完成。但是,我要寻找的是一些通用技术,而不是所有细微差别。


阅读 1022

收藏
2020-06-20

共1个答案

小编典典

Redis文档中包含大量信息,以了解其工作原理。现在,专门回答您的问题:

1)如何维护连接?

使用ae事件循环(由Redis作者设计)来维护和管理连接。所有网络I / O操作都是无阻塞的。您可以将ae作为使用平台的最佳网络I /
O多路分解机制(Linux的epoll,BSD的kqueue等)的简约实现,就像libevent,libev,libuv等一样。

2)连接是TCP还是HTTP?

使用Redis协议的TCP连接,TCP是一种简单的telnet兼容,面向文本的协议,支持二进制数据。该协议通常比HTTP更有效。

3)如何管理内存?

依赖于通用内存分配器来管理内存。在某些平台上,这实际上是系统内存分配器。在其他一些平台(包括Linux)上,选择了jemalloc,因为它在CPU消耗,并发支持,碎片和内存占用量之间提供了很好的平衡。jemalloc源代码是Redis发行版的一部分。

与其他产品(例如memcached)相反,Redis中没有实现平板分配器。

在通用分配器之上已实现了许多优化的数据结构,以减少内存占用量。

4)尽管存在竞争的读/写,但用于实现高吞吐量的同步技术有哪些?

Redis是一个单线程事件循环,因此由于所有命令都已序列化,因此无需进行同步。现在,一些线程也出于内部目的在后台运行。在极少数情况下,它们访问由主线程管理的数据,使用经典的pthread同步原语(例如mutex)。但是,代表多个客户端连接进行的100%的数据访问不需要任何同步。

具有内存高速缓存的计算机和可以响应命令的服务器的纯香草实现和Redis框之间有什么区别?

没有区别。Redis是一台普通的原始实现,具有内存缓存和可以响应命令的服务器。但这是正确完成的实现:

  • 使用单线程事件循环模型
  • 使用针对其相应用例进行了优化的简单和简约的数据结构
  • 提供一组精心选择的命令,以平衡简约和实用性
  • 不断追求最佳原始效果
  • 非常适合现代操作系统机制
  • 提供多种持久性机制,因为“一个大小就能满足所有人”的方法只是一个梦想。
  • 提供高可用性机制的构建块(例如复制系统)
  • 避免堆积煎饼等无用的抽象层
  • 产生了清晰易懂的代码库,任何优秀的C开发人员都可以使用
2020-06-20