在相同负载下,Redis 命令时间随着时间的推移而增加

问题描述 投票:0回答:1

在 Redis 上我有大约 120 万个 json 文档,

  • 第一个命名空间:com.test.api.redis.model.document.PRedis:* 大约 700K json 键
  • 第二个nemespace:com.test.api.redis.model.document.SRedis:* 大约 550K json 键

每个命名空间每 1 小时运行一次作业,该作业将更新所有 json 键、创建新键并删除未更新的键。每个命名空间的作业彼此相隔 30 分钟。

通常工作需要 2 分钟。

我观察到slowlog中的命令:

FT.SEARCH com.test.api.redis.model.document.PRedisIdx ( -@jobId:[1.731591900002E12 1.731591900002E12]) NOCONTENT LIMIT 0 10000 DIALECT 1 

我用来在工作期间查找未更新的密钥,随着时间的推移,在相同的负载上逐渐增加。 例如,redis 第一次启动后,它将在 30 毫秒内运行,1 天后,它会达到 1 秒,一周后 10 秒,等等..

如果我这次重新启动redis的docker容器,再次回到正常的30ms,然后再次逐渐开始增加。

使用最新图像时出现同样的问题: redis/redis-stack-server:7.2.0-v13 和 redis/redis-stack-server:7.4.0-v1

有人知道导致性能下降的原因是什么吗?

我尝试过内存清除、主动碎片整理、终止客户端、将作业之间的时间增加到 5 小时,但性能仍然随着时间的推移而下降...... 在作业运行期间,CPU 使用率达到 99%,但在作业之间,CPU 使用率低于 1%。

任何人都可以提出一些建议,这可能是什么导致此 redis 行为的罪魁祸首?


有关 jobId 的信息:是作业运行时的当前时间:

在文档实体中用redis om spring定义为:

   @Indexed
    private Long jobId;

这会转换为索引中的属性:

  18) 1) "identifier"
      2) "$.jobId"
      3) "attribute"
      4) "jobId"
      5) "type"
      6) "NUMERIC"
redis redis-stack-server redis-stack redis-om-spring
1个回答
0
投票

我的案例中的问题似乎是否定 -@jobId,NOT 运算符似乎没有有效地利用索引。

使用@jobId:[0 jobId-1]代替解决了>10ms的性能问题。

© www.soinside.com 2019 - 2024. All rights reserved.