La mia situazione è che attualmente sto memorizzando una gerarchia in un database SQL che si avvicina rapidamente a 15000 nodi (5000 spigoli). Questa gerarchia sta definendo il mio modello di sicurezza basato sulla posizione di un utente nell'albero, garantendo l'accesso agli elementi sottostanti. Quindi, quando un utente richiede un elenco di tutti gli articoli protetti, sto usando CTE per reclamarlo nel db (e appiattire tutti gli elementi), che viene avviato per mostrare la sua età (lento).Come archiviare e leggere in modo efficiente una gerarchia dalla cache
La gerarchia non cambia spesso, quindi ho tentato di spostarlo nella RAM (redis). Tenendo presente che ho molti sottosistemi che hanno bisogno di questo per le chiamate di sicurezza e UI per costruire l'albero per le operazioni CRUD.
primo tentativo
Il mio primo tentativo è quello di memorizzare i rapporti come una coppia di valori chiave (questo è come la sua memorizzati nel database)
E / \ F G /\ /\ H I J K mapped to: E - [F, G] F - [H, I] G - [J, K]
Così quando voglio E e tutti i suoi discendenti, in modo ricorsivo, i suoi figli e i loro figli usano i tasti, e mi permette di iniziare da qualsiasi nodo a scendere. Questa soluzione ha dato un buon aumento di velocità ma con 15.000 nodi, è stato circa 5000 colpi di cache per ricostruire il mio albero nel codice (scenario caso peggiore ... partendo da E. prestazioni si basa sulla posizione dei nodi iniziali, con conseguente super utenti che vedono il peggiore prestazione). Questo era ancora piuttosto veloce ma sembrava loquace. Mi piace il fatto che riesco a rimuovere un nodo in qualsiasi momento saltando fuori dall'elenco delle chiavi senza ricostruire l'intera cache. Questo si stava anche rapidamente accendendo per costruire un albero su richiesta visivamente su un'interfaccia utente.
secondo tentativo
altra mia idea è quella di prendere la Gerarchia dal database, costruire l'albero e memorizzare che nella RAM (Redis) poi tirare l'intera cosa di memoria (era circa 2 MB di dimensioni, serializzato). Questo mi ha dato una chiamata singola (non così chatty) in redis per estrarre l'intero albero, individuare il nodo padre degli utenti e discendere per ottenere tutti gli elementi figlio. Queste chiamate sono frequenti e il passaggio di 2 MB a livello di rete sembrava ampio. Ciò significa anche che non posso aggiungere/rimuovere e aggiungere facilmente elementi senza abbattere l'albero e modificarlo e rimandarlo indietro. Inoltre, su richiesta, la creazione di alberi tramite HTTP significava che ciascuna richiesta doveva abbattere 2 MB per ottenere solo figli diretti (molto piccoli utilizzando la prima soluzione).
Quindi quale soluzione ritiene sia un approccio migliore (a lungo termine mentre continua a crescere). Entrambi sono provocatoriamente più veloci e caricano il database. O è il loro un modo migliore per realizzare ciò a cui non ho pensato?
Grazie
Come hai risolto questo problema? – vishal