jedisconnectionfactory example performance spring-boot redis jedis spring-data-redis

performance - jedisconnectionfactory example



Problemas de rendimiento con Redis/Spring Data Redis (0)

Tengo un problema de rendimiento en mi aplicación Spring Boot cuando me comunico con Redis y esperaba que alguien con experiencia en el tema pudiera arrojar algo de luz.

Explicación de lo que estoy tratando de hacer En resumen, mi aplicación tengo 2 mapas anidados y 3 mapas de listas que quiero guardar en Redis y volver a cargar en la aplicación cuando se necesitan los datos. Los datos en el primer mapa anidado son bastante grandes, con varios niveles de tipos de datos no primitivos (y listas de estos). Por el momento, he estructurado los datos en Redis utilizando repositorios y hashes Redis, con repositorios A, B y C, y dos formas diferentes de búsqueda en id para el tipo de datos primario ( MyClass ) en A. B y C contienen datos que son referenciado desde un valor en A (con la anotación @Reference ).

Análisis de rendimiento Utilizando JProfiler, he encontrado que el cuello de botella está en algún punto entre mi llamada a a.findOne() y el final de la lectura de la respuesta de Redis (antes de que tenga lugar cualquier conversión de byte[] a MyClass ). He revisado el registro lento en mi servidor Redis para verificar si hay alguna acción lenta y de bloqueo y no encontré ninguna. Cada comando HGETALL en Redis toma 400 μs en promedio (para un hash completo en A, que incluye encontrar los hash referenciados en B y C). Lo que me sorprende es que el tiempo de la llamada a.findOne() toma de 5 a 20 ms para una sola instancia de MyClass , dependiendo de cuán grandes sean los hashes en B y C. Una sola instancia tiene en promedio ~ 2500 hash fields en total cuando se incluyen las referencias a B y C. Cuando se hace ~ 900 veces en el primer mapa anidado, tengo que esperar 10 segundos para obtener todos mis datos, que es demasiado largo. En comparación, el otro mapa anidado anidado, que no tiene referencias a C (la mayor parte de los datos), está temporizado a ~ 10μs en Redis y <1ms en Java.

¿Este análisis parece un comportamiento normal cuando la instancia de Redis se ejecuta localmente en la misma MacBook Pro 2015 que la aplicación Spring Boot? Entiendo que llevará más tiempo completar el método findOne() completo que el comando HGETALL real en Redis, pero no entiendo por qué la diferencia es tan grande. Si alguien pudiera arrojar algo de luz sobre el rendimiento de las cosas que están sucediendo debajo del capó en el código de conexión Jedis, lo agradecería.

Ejemplos de mi estructura de datos en 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;

Extracto de la clase C (se eliminaron algunas primitivas para mayor claridad):

@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;

Extracto de la clase 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;