当前位置: 首页 > 面试题库 >

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

杨选
2023-03-14
问题内容

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

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

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


问题答案:

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开发人员都可以使用


 类似资料:
  • null 基本上,具有内存缓存和可以响应命令的服务器的机器的普通香草实现和Redis盒子之间有什么区别?我也明白答案需要非常庞大,并且应该包括非常复杂的细节来完成。但是,我要找的是一些通用的技术,而不是所有的细微差别。

  • 我需要从很多客户端通过网络套接字连接到java服务器来提取数据。 有很多web套接字实现,我选择了vert。x、 我做了一个简单的演示,在那里我听json的文本帧,用jackson解析它们,然后返回响应。Json解析器对吞吐量没有显著影响。 我的总速度是每秒2.5公里,有2到10个客户。 然后我尝试使用缓冲,客户端不会等待每个响应,而是在服务器确认后发送一批消息(30k-90k),速度提高到每秒8

  • 本文向大家介绍Kafka 是如何实现高吞吐率的?相关面试题,主要包含被问及Kafka 是如何实现高吞吐率的?时的应答技巧和注意事项,需要的朋友参考一下 Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写入速度低容量大的硬盘,以此来换取更强的存储能力,但实际上,使用硬盘并没有带来过多的性能损失。kafka主要使用了以下几个方式实现了超高的吞吐率: 顺序读写; 零拷贝

  • 本文向大家介绍springboot高并发下提高吞吐量的实现,包括了springboot高并发下提高吞吐量的实现的使用技巧和注意事项,需要的朋友参考一下 公司让做一个全文检索的项目,我使用的是elasticsearch。但是对性能有很高的要求,为了解决性能问题,我简直是寝食难安。 es(elasticsearch)没有使用分布式,单台的。 开发完测试的时候,查询慢,吞吐量低。 网友们建议用异步--使

  • 我正在对ElasticSearch进行基准测试,以实现非常高的索引吞吐量。 我目前的目标是能够在几个小时内索引30亿(3,000,000,000)文档。为此,我目前有3台windows服务器机器,每台16GB内存和8个处理器。插入的文档有一个非常简单的映射,只包含少数数字非分析字段(被禁用)。 使用这个相对适中的钻机,我能够达到每秒大约120,000个索引请求(使用大桌子监控),我相信吞吐量可以进

  • 我一直在使用SpringIntegration调用RESTAPI,但是SpringIntegration默认附带的http客户端不支持连接池或可重用性,因此我定制了使用PoolighttpClientConnectionManager 但是现在Spring集成停止在我的类路径中拾取JKS文件,所以我构建了自己的SSL上下文,但是构建这个SSL上下文导致了性能的显著下降 对于100个并发线程, 使用