【问题标题】:maxmemory parameter in redis.confredis.conf 中的 maxmemory 参数
【发布时间】:2015-03-31 22:06:01
【问题描述】:

我正在尝试在 redis 中插入键-“值”。“值”为 X 字节,同时将我的应用程序插入到 redis 中。我想知道从 ./redis-cli 触发“INFO”命令后要监视哪个参数以检查 X(或者可能 X + somevalue ,以防 redis 填充一些数据)字节数已在 redis 中使用。我正在这样做确定我的应用程序所需的 maxmemory(redis.conf) 参数。

我有一个 master 和一个 sentinel,并且正在使用 redis 进行临时存储。我尝试监控 used_memory 参数。但根据我得到的数据,maxmemory 似乎与 used_memory 无关。

所以我考虑使用“调试对象 Mykey”,它给出了序列化长度。这个长度到底是什么,我在 redis 文档中找不到任何描述。

所以基本上是两个问题:

  1. maxmemory 和 used_memory 是否相关,如果是,那么使用 used_memory 计算插入的键值占用的空间是否存在一些问题。

  2. 什么是“debug object Mykey”命令中的serializedlength

【问题讨论】:

    标签: redis


    【解决方案1】:
    1. maxmemory 配置指令规定了 Redis 应允许用于用户数据的最大内存量。当设置为 0(默认值)时,只要底层操作系统允许,Redis 就会分配内存。 INFO 命令中的used_memory 值是调用命令时用户数据消耗的实际内存。两者的关系(只要maxmemory不为0)就是used_memory maxmemory。

    2. DEBUG OBJECT 输出的serializedlength 是序列化时存储在该键下的值的长度(以字节为单位)。要获取实际的序列化值,您可以使用DUMP 命令。请注意,由于包括 Redis 对数据结构的编码和开销在内的无数因素,序列化长度提供了对密钥使用的实际内存量的准确度量。

    通常,为了获得您的 maxmemory 设置的估计值,请尝试存储几个 100(例如 1000)个代表您的数据的键,然后检查 used_memory,将值相除,然后将结果相乘由具有安全余量的预期键数(例如,至少 %10)。

    【讨论】:

    • “来自 INFO 命令的 used_memory 值是调用命令时用户数据消耗的实际内存。”命令完成后用户数据占用的内存是否会发生变化?只是为了澄清你的建议是假设我在 redis 中插入 X 键。我应该将 user_memory 除以 X,结果应该给我每个键使用的内存。我还注意到,即使没有向 redis 发出命令(不知道为什么),used_memory 也约为 370 kb。在使用“used_memory”估计“maxmemory”时,这也需要一些核算?
    • INFO 不影响内存使用。当然,您对 370kb 的开销是正确的,它可能会略有不同。通常,当您放入一些数据时,它变得可以忽略不计。您的划分是正确的,但请记住这只是一个粗略的估计。您可以进行更多/更大的迭代以更好地了解数字。
    • 客户端输出缓冲区的大小如何。如果考虑到这一点,那么我们将需要估计我们正在服务的客户端数量以及平均客户端输出缓冲区大小。那么这个值也应该加上估计maxmemory?
    • 所有缓冲区在 Redis 的内存消耗中都扮演着重要的角色。当客户端速度慢和/或有大量回复时,客户端缓冲区可能会变大。如果您发现默认设置不适合您,则需要对其进行更改并进行配置。
    • 但 redis.conf 再次声明“如果您连接了从属服务器,建议您为 maxmemory 设置一个下限,以便系统上有一些空闲 RAM 用于从属输出缓冲区(但这是如果政策是 'noeviction',则不需要)。”这很令人困惑。对我来说,这表明从属设备的输出缓冲区的内存消耗不包括在 maxmemory 中,而是从系统 RAM 中单独占用的。(不知道为什么文档说我们不需要空闲 RAM 用于“noeviction”)
    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2012-12-08
    • 2021-10-01
    • 2019-03-29
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多