Mi situación es que actualmente estoy almacenando una jerarquía en una base de datos SQL que se acerca rápidamente a los 15000 nodos (5000 bordes). Esta jerarquía es la definición de mi modelo de seguridad basado en una posición de los usuarios en el árbol, otorgando acceso a los elementos a continuación. Entonces, cuando un usuario solicita una lista de todos los elementos asegurados, estoy usando CTE para recurse en el archivo db (y aplanar todos los elementos), que se inicia para mostrar su edad (lenta).Cómo almacenar y leer una jerarquía de manera eficiente desde el caché
La jerarquía no cambia con frecuencia, así que he intentado moverla a la RAM (redis). Teniendo en cuenta que tengo muchos subsistemas que necesitan esto para llamadas de seguridad, y UI para construir el árbol para operaciones CRUD.
primer intento
Mi primer intento es almacenar las relaciones como un par de valores clave (esta es la forma de su almacenado en la base de datos)
E / \ F G /\ /\ H I J K mapped to: E - [F, G] F - [H, I] G - [J, K]
Así que cuando quiero E y todos sus descendientes, recursivamente obtengo su hijo y su hijo usando las teclas, y me permite comenzar en cualquier nodo para bajar. Esta solución dio un buen aumento de velocidad pero con 15,000 nodos, fue aproximadamente 5000 visitas de caché para reconstruir mi árbol en código (peor escenario posible ... comenzando en E. el desempeño se basa en la ubicación de los nodos iniciales, lo que resulta en superusuarios que ven el peor rendimiento). Esto todavía era bastante rápido, pero parecía ser parlanchín. Me gusta el hecho de que puedo eliminar un nodo en cualquier momento saliéndolo de las listas de teclas sin reconstruir todo el caché. Esto también se estaba iluminando rápidamente para construir un árbol según demanda en una interfaz de usuario.
segundo intento
Mi otra idea es tomar la Jerarquía de la base de datos, construir el árbol y almacenar que en la memoria RAM (Redis) luego tire toda la cosa fuera de la memoria (que era aproximadamente 2 MB en tamaño, serializado). Esto me dio una sola llamada (no tan hablador) en redis para extraer todo el árbol, ubicar el nodo padre de los usuarios y descender para obtener todos los elementos secundarios. Estas llamadas son frecuentes y la transferencia de 2 MB en la capa de red parecía grande. Esto también significa que no puedo agregar/eliminar fácilmente y el elemento sin tirar hacia abajo del árbol y editarlo y empujarlo hacia atrás. Además, la creación de árboles a pedido a través de HTTP significaba que cada solicitud tenía que reducir 2 MB para obtener solo hijos directos (muy pequeños con la primera solución).
Entonces, ¿qué solución cree que es un mejor enfoque (a largo plazo, ya que sigue creciendo). Ambos son desafiantemente más rápidos y toman algo de carga de la base de datos. ¿O es una mejor manera de lograr esto que yo no haya pensado?
Gracias
¿Cómo resolvió este problema? – vishal