Redis 文档中有大量信息可以帮助您了解其工作原理。现在,具体回答您的问题:
1)如何维持连接?
使用 ae 事件循环(由 Redis 作者设计)来维护和管理连接。所有网络 I/O 操作都是非阻塞的。您可以将 ae 视为使用平台最佳网络 I/O 多路分解机制(Linux 的 epoll、BSD 的 kqueue 等)的简约实现,就像 libevent、libev、libuv 等一样...
2) 连接是 TCP 还是 HTTP?
连接是使用 Redis 协议的 TCP,这是一个简单的 telnet 兼容、面向文本的协议protocol http://redis.io/topics/protocol支持二进制数据。该协议通常比 HTTP 更有效。
3)内存是如何管理的?
内存是通过通用内存分配器来管理的。在某些平台上,这实际上是系统内存分配器。在其他一些平台(包括 Linux)上,选择了 jemalloc,因为它在 CPU 消耗、并发支持、碎片和内存占用之间提供了良好的平衡。 jemalloc 源代码是 Redis 发行版的一部分。
与其他产品(例如memcached)相反,Redis 中没有实现slab 分配器。
一些优化的数据结构 http://redis.io/topics/memory-optimization已在通用分配器之上实现,以减少内存占用。
4) 尽管存在竞争读/写,但仍可使用哪些同步技术来实现高吞吐量?
Redis 是一个单线程事件循环,因此不需要进行同步,因为所有命令都是序列化的。现在,一些线程也出于内部目的在后台运行。在极少数情况下,它们访问由主线程管理的数据,使用经典的 pthread 同步原语(例如互斥体)。但代表多个客户端连接进行的 100% 数据访问不需要任何同步。
您可以在那里找到更多信息:Redis是单线程的,那么它是如何进行并发I/O的呢? https://stackoverflow.com/questions/10489298/redis-is-single-threaded-then-how-does-it-do-concurrent-i-o/10495458#10495458
具有内存缓存的机器的普通实现与可以响应命令的服务器和 Redis 盒之间有什么区别?
没有区别。 Redis 是一个普通的机器实现,具有内存缓存和可以响应命令的服务器。但这是一个正确的实现:
- 使用单线程事件循环模型
- 使用针对相应用例优化的简单且简约的数据结构
- 提供一组精心挑选的命令来平衡极简主义和实用性
- 不断追求最佳原始性能
- 很好地适应现代操作系统机制
- 提供多种持久性机制,因为“一刀切”的方法只是一个梦想。
- 为 HA 机制(例如复制系统)提供构建块
- 避免像煎饼一样堆叠无用的抽象层
- 产生一个干净且易于理解的代码库,任何优秀的 C 开发人员都可以轻松使用