caching - 为什么redis不使用Direct IO?

标签 caching redis buffer

由于redis是一个大缓冲区,内核不需要为redis缓存缓冲区。



为什么不使用Direct IO?

最佳答案

直接 I/O 不是一个好的选择,原因如下:

  • 对于 AOF,我们需要将写入操作与 fsync 操作分离,因为它们可能不在同一线程中发生。当您使用直接 IO 时,您不能这样做。

  • 对于 AOF 重写和 RDB,使用 stdio(缓冲 IO),因为写入了很多小对象。我不认为你可以将 O_DIRECT 与 stdio 一起使用( O_DIRECT 有附加约束......)。要使用直接 IO,我们必须在低级 API 之上编写我们自己的缓冲系统。

  • O_DIRECT 并非对所有文件系统都可用,而且不可移植。

  • 有时缓冲区缓存实际上很有用。例如,当一个 slave 连接到一个 master 时,它会请求一个 RDB 转储,然后读取这个转储。如果没有缓冲区缓存,此操作将产生两倍的 I/O。

  • 转储文件通常比内存中的数据小得多。在很多情况下,您的收获并没有您想象的那么多。

虽然 O_DIRECT 可能不是 Redis 的好解决方案,但在某些情况下使用带有 POSIX_FADV_DONTNEED 选项的 posix_fadvise 可能会有用。过去,我为 RDB 转储玩过一个简单的实现。

关于caching - 为什么redis不使用Direct IO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18326864/

相关文章:

asp.net-mvc - MVC缓存数据库图像

ios - AFNetworking 图像缓存在内存警告中未清空

caching - 无法让 Azure 缓存正常工作。 "There is a temporary failure. Please retry later."

redis - 使用 BookSleeve 从 Redis 检索字符串键/值的正确方法是什么

geolocation - 我如何处理 Geo Ip 数据并将其放在 Redis 上

node.js - 如何使用redis在 Node 中缓存查询数据

caching - infinispan和Jboss缓存对比

python - 在偏移处读入字节数组?

buffer - 协议(protocol)消息标记的线路类型无效

c - 流缓冲是什么意思?