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)
| 归档时间: |
|
| 查看次数: |
1097 次 |
| 最近记录: |