我们可以在生产环境中使用Spring数据部分更新吗



我一直在使用partialUpdate,redisKVTemplate.update(entity(,它在我们的开发环境中运行得很好,但当在生产环境中运行此代码时,Redis服务器的CPU使用率很高(约100%(,只有几百个事务。我根据https://redis.io/docs/reference/optimization/latency/请参阅:

  • 当使用partialUpdate时,它会调用许多KEYS redis命令。调用partialUpdate时,由run:redis-cli-slowlog get200进行检查
  • 在上面的链接中,有一个重要的注意事项:在生产环境中使用KEYS命令是执行慢速命令产生延迟的一个非常常见的来源。如Redis文档中所述,KEYS只能用于调试目的

这是否意味着partialUpdate不应该在PD-env中使用?如果是,在PD env中应该使用哪种方式进行部分更新?

如果https://github.com/spring-projects/spring-data-redis/blob/0e847a3da865481d40c353ddc8507fbe9aec2e0a/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java#L399您可以看到update(PartialUpdate<?> update)正在做的工作量。

我不知道在您的情况下KEYS命令是在哪里发出的,但它可能与二级索引维护有关。您可以直接使用RedisHashCommands测试更新哈希中的特定字段。看见https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/connection/RedisHashCommands.html

主要是hSethSetNXhMSet。在这种情况下,您必须为条目计算Redis密钥(如果您没有使用前缀@RedisHash,则使用实体ID和类名(。

注意:如果要执行多个操作,请注意上面链接的方法如何使用RedisOperations来确保所有操作都通过单个连接进行:

redisOps.execute((RedisCallback<Void>) connection -> { ... }

最新更新