在 Redis 上我有大约 120 万个 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"
我的案例中的问题似乎是否定 -@jobId,NOT 运算符似乎没有有效地利用索引。
使用@jobId:[0 jobId-1]代替解决了>10ms的性能问题。