Redis/Spring Data Redis的性能问题

fri*_*erg 7 performance redis jedis spring-data-redis spring-boot

我在Spring Boot应用程序中遇到性能问题,当它与Redis通信时,我希望有专门知识的人能够对此有所了解.

什么,我试图做解释 总之,我的应用程序有2个嵌套的地图,我要保存到Redis的,并需要数据时回加载到应用程序列表中的3张地图.第一个嵌套映射中的数据相当大,具有几个级别的非原始数据类型(以及这些类型的列表).目前,我使用存储库和Redis Hashes,使用存储库A,B和C在Redis中构建数据,并在A中使用两种不同的方式查找主数据类型(MyClass).B和C包含引用的数据来自A中的值(带@Reference注释).

性能分析 使用的JProfiler,我发现,瓶颈是我的电话之间的某处a.findOne(),并阅读来自Redis的响应(从任何转换之前结束byte[]MyClass已经发生).我查看了我的Redis服务器上的slowlog来检查任何缓慢和阻塞的操作,但没有找到.HGETALLRedis中的每个命令平均需要400μs(对于A中的完整哈希,包括在B和C中查找引用的哈希值).让我感到奇怪的是,a.findOne()对于一个单一实例,调用的时间需要5-20ms MyClass,具体取决于B和C中的哈希值有多大.当包括对B和C的引用时,单个实例总共具有约2500个哈希字段.如果在第一个嵌套映射上完成了大约900次,我必须等待10秒才能获得所有数据,这太长了.相比之下,另一个嵌套的嵌套映射(没有引用C(数据的最大部分))在Redis中定时为~10μs,在Java中定时为<1ms.

当Redis实例在与Spring Boot应用程序相同的2015 MacBook Pro上本地运行时,此分析是否看起来像是正常行为?我知道完整的findOne()方法完成比HGETALLRedis中的实际命令需要更长的时间,但我不明白为什么差异很大.如果有人能够对Jedis连接代码中引发的内容的性能有所了解,我会很感激.

Java中我的数据结构示例

@RedisHash("myClass")
public class MyClass {

@Id
private String id;

private Date date;
private Integer someValue;

@Reference
private Set<C> cs;

private someClass someObject;
private int somePrimitive;
private anotherClass anotherObject;

@Reference
private B b;
Run Code Online (Sandbox Code Playgroud)

C类摘录(为清晰起见,删除了一些基元):

@RedisHash("c")
public class C implements Comparable<BasketValue>, Serializable {

@Id
private String id;

private EnumClass someEnum;
private aClass anObject;
private int aNumber;
private int anotherNumber;
private Date someDate;

private List<CounterClass> counterObjects;
Run Code Online (Sandbox Code Playgroud)

B类摘录:

@RedisHash("b")
public class B implements Serializable {

@Id
private int code;

private String productCodes;
private List<ListClass> listObject;
private yetAnotherClass yetAnotherObject;
private Integer someInteger;
Run Code Online (Sandbox Code Playgroud)