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

2024-05-11

我知道这是一个非常普遍的问题。但是,我想了解允许 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,这是一个简单的 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 开发人员都可以轻松使用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis是如何实现高吞吐量和高性能的? 的相关文章

  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • 设计 Cassandra 数据模型的最佳实践是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 以及需要避免哪些陷阱 您有任何交易中断吗 例如 我听说导出 导入 Cassandra 数据非常困难 这让我想知道这是否会妨碍将生产数据
  • 使用 Cassandra 进行单元版本控制

    我的应用程序使用 AbstractFactory 作为 DAO 层 因此一旦实现了 HBase DAO 系列 创建 Cassandra DAO 系列并从多个角度查看差异对我来说将是非常好的 不管怎样 试图做到这一点 我看到 Cassandr
  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续
  • Cassandra CQL v3.0 和复合类型

    我正在浏览以下文档CQLv3 0 http www datastax com docs 1 1 references cql index 我们是否应该在更新中指定复合键并选择 a b 1 以防万一comparator or key vali
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • 使用redis进行树形数据结构

    我需要为基于树的键值开发一个缓存系统 与Windows注册表编辑器非常相似 其中缓存键是字符串 表示树中到值的路径 可以是原始类型 int string bool double 等 或子树本身 例如 key root x y z w val
  • Redis 队列工作程序在 utcparse 中崩溃

    我正在尝试按照以下教程获得基本的 rq 工作 https blog miguelgrinberg com post the flask mega tutorial part xxii background jobs https blog m
  • 如何使用 Redis 自动删除与模式匹配的键

    在我的 Redis DB 中 我有很多prefix
  • 当 Jedis 与 Spring Data 一起使用时,为什么数据会以奇怪的键存储在 Redis 中?

    我将 Spring Data Redis 与 Jedis 一起使用 我正在尝试存储带有密钥的哈希值vc list id 我能够成功插入到redis 但是 当我使用 redis cli 检查密钥时 我没有看到密钥vc 501381 相反我看到
  • 如何配置Lettuce Redis集群异步连接池

    我正在配置我的生菜重新分配池 当我按照官方文档配置时 连接池无法正常初始化 无法获取连接 官方文档指出 RedisClusterClient clusterClient RedisClusterClient create RedisURI
  • Cassandra cqlsh - 如何显示时间戳列的微秒/毫秒?

    我正在插入带有时间戳列的 Cassandra 表 我的数据具有微秒精度 因此时间数据字符串如下所示 2015 02 16T18 00 03 234 00 00 但是 在 cqlsh 中 当我运行选择查询时 微秒数据不会显示 我只能看到精确到
  • 超出 Redis 连接/缓冲区大小限制

    在对我们的应用程序服务器进行压力测试时 我们从 Redis 中得到以下异常 ServiceStack Redis RedisException 无法连接到 redis host 6379 处的 redis 实例 gt System Net
  • Cassandra 数据建模:时间戳作为分区键

    我需要能够返回在指定时间间隔内执行操作的所有用户 Cassandra 中的表定义如下 create table t timestamp from timestamp to user text PRIMARY KEY from to user
  • 使用pip安装pylibmc时出错

    您好 当我尝试使用 pip 在 OSX Lion 上安装 pylibmc 时 出现以下错误 pylibmcmodule h 42 10 fatal error libmemcached memcached h file not found
  • Cassandra 允许过滤

    我有一个如下表 CREATE TABLE test day int id varchar start int action varchar PRIMARY KEY day start id 我想运行这个查询 Select from test
  • MVC 框架中的缓存策略?

    我编写了自己的小型 PHP MVC 框架 现在正在探索 PHP MVC 框架中的缓存策略 我正在考虑可以缓存什么 在哪里以及如何缓存 我的框架是简单的MVC框架 我有前端控制器 它启动应用程序 注册类自动加载 设置 php 运行时指令 最后

随机推荐