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

 粪想升或_519 发布于 2022-12-07 21:46

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

    如何保持连接?

    是连接TCP还是HTTP?

    我知道它完全是用C语言编写的.如何管理内存?

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

基本上,具有内存缓存的机器的普通vanilla实现和可以响应命令的服务器和Redis盒之间有什么区别?我也理解答案需要非常庞大,并且应该包含非常复杂的细节以便完成.但是,我正在寻找的是一些使用的一般技术,而不是所有的细微差别.

1 个回答
  • Redis文档中有大量信息可以帮助您了解它的工作原理.现在,具体回答你的问题:

    1)如何保持连接?

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

    2)连接是TCP还是HTTP?

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

    3)如何管理内存?

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

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

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

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

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

    您可以在那里找到更多信息: Redis是单线程的,那么它是如何进行并发I/O的?

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

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

    使用单线程事件循环模型

    使用针对相应用例优化的简单和简约数据结构

    提供一套精心挑选的命令,以平衡极简主义和实用性

    不断瞄准最佳原始性能

    很好地适应了现代OS机制

    提供多种持久性机制,因为"一个尺寸适合所有人"的方法只是一个梦想.

    为HA机制提供构建块(例如复制系统)

    避免堆积像煎饼这样无用的抽象层

    从而产生干净且易于理解的代码库,任何优秀的C开发人员都可以轻松应对

    2022-12-11 02:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有