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

时间:2014-12-03 09:38:52

标签: redis cassandra memcached

我知道这是一个非常通用的问题。但是,我想了解哪些主要的架构决策允许Redis(或像MemCached,Cassandra这样的缓存)以惊人的性能限制工作。

  1. 如何保持连接?
  2. 是连接TCP还是HTTP?
  3. 我知道它完全是用C语言编写的。如何管理内存?
  4. 有什么同步技术可以实现高吞吐量 竞争读/写?
  5. 基本上,具有内存缓存的机器的普通vanilla实现与可以响应命令的服务器和Redis盒之间有什么区别?我也理解答案需要非常庞大,并且应该包含非常复杂的细节以便完成。但是,我正在寻找的是一些使用的一般技术,而不是所有的细微差别。

1 个答案:

答案 0 :(得分:7)

Redis文档中有大量信息可用于了解其工作原理。现在,专门回答你的问题:

1)如何维护连接?

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

2)连接是TCP还是HTTP?

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

3)如何管理内存?

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

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

在通用分配器之上已经实现了许多optimized data structures以减少内存占用。

4)尽管存在竞争性读/写,但用于实现高吞吐量的同步技术是什么?

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

您可以在那里找到更多信息: Redis is single-threaded, then how does it do concurrent I/O?

具有内存缓存的机器的普通vanilla实现和可以响应命令的服务器和Redis框之间有什么区别?

没有区别。 Redis是一个简单的vanilla实现,具有内存缓存和服务器,可以响应命令。但这是一个正确的实施:

  • 使用单线程事件循环模型
  • 使用针对相应用例优化的简单和简约数据结构
  • 提供一套精心挑选的命令,以平衡极简主义和实用性
  • 不断瞄准最佳原始表现
  • 很好地适应了现代操作系统机制
  • 提供多种持久性机制,因为"一个大小适合所有"方法只是一个梦想。
  • 提供HA机制的构建块(例如复制系统)
  • 避免堆积无用的抽象层,如煎饼
  • 产生了一个干净且易于理解的代码库,任何优秀的C开发人员都可以轻松使用