2

我为 redis 制作了一个简单的基准代码,如下伪代码。

for 10~100 redis sessions:
  for n time:
    key = some_random_string(key_size) # about 100 byte
    data = some_random_string(data_size) # about 100k~1m
    session.command("SET %s %s", key, data)
    session.command("GET %s", key)
    session.command("DEL %s", key)

当基准程序启动时,redis-server 进程的内存使用量单调增加,直到达到物理内存限制 (8gb) 并在会话结束时释放。由于 key 的并发数受限于 session 数,因此数据集的峰值大小不应该那么大。

这是设计的故意行为吗?还是我滥用了它?

4

1 回答 1

0

假设最大值是 1 MB,那么每个连接最多应该有 3 MB:1 个用于输入缓冲区 (SET),1 个用于存储在 Redis 中的值,1 个用于输出缓冲区 (GET)。输入和输出缓冲区附加到连接。您可以检查 INFO 命令返回的 client_biggest_input_buf。

注意:Redis 并不是真正为存储大字符串对象而设计的。

也就是说,使用简短的 C 程序、Redis 2.5.11 和 270 个连接,我无法重现您描述的行为。

您确定没有同时运行 MONITOR 命令、导致 Redis 累积所有流量的 SLOWLOG 配置,或者网络链路无法处理流量的从属实例吗?

于 2012-06-21T17:57:03.140 回答