我知道这是一个非常通用的问题。但是,我想了解哪些主要的架构决策允许Redis(或像MemCached,Cassandra这样的缓存)以惊人的性能限制工作。
基本上,具有内存缓存的机器的普通vanilla实现与可以响应命令的服务器和Redis盒之间有什么区别?我也理解答案需要非常庞大,并且应该包含非常复杂的细节以便完成。但是,我正在寻找的是一些使用的一般技术,而不是所有的细微差别。
答案 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实现,具有内存缓存和服务器,可以响应命令。但这是一个正确的实施: