Impaginazione con caching progressivo
Che cos'è la cache? La memorizzazione nella cache è la tecnica di archiviazione delle copie dei dati delle applicazioni utilizzate di frequente in uno strato di memoria più piccola e più veloce per migliorare i tempi di recupero dei dati e il throughput.
Cos'è l'impaginazione? L'impaginazione è il processo di separazione dei dati in set, proprio come le pagine di un libro. Una richiesta API GET per richiedere informazioni da un server tramite un endpoint API a database di grandi dimensioni potrebbe produrre milioni, se non miliardi, di risultati. La risposta dell'API che ci invia migliaia di voci contemporaneamente è uno spreco di risorse. Il paging aiuta a ridimensionare la nostra applicazione, servire più utenti, eseguire query efficienti e creare una buona esperienza del consumatore.
Consideriamo uno scenario: ti viene assegnato un compito per sviluppare un servizio. Ciò avrà endpoint che servono record da diverse tabelle di database. Per ora, consideriamo di iniziare con un endpoint che serve dalla tabella dei prodotti dal tuo database. L'API supporta alcuni parametri di filtro. Diciamo PriceRange, Manufacturer, ecc. Considerando che ci sono oltre 5 milioni di prodotti nel tuo database. E i tuoi fornitori continuano ad aggiungere altri prodotti al database.
Considerazioni iniziali: si potrebbe pensare di creare una query di database rispetto alla risorsa API e al parametro di filtro e di eseguirla in pushdown nel database per leggere tutti i record filtrati, archiviarli in una cache e servire risposte impaginate dalla cache per le richieste successive.
Immagina se il risultato della query restituisse 2 milioni di record. Metterai nella cache (2 milioni - pageSize) i record? Inoltre, il tempo di risposta della prima richiesta sarà enorme. Poiché stai caricando tutti i 2 milioni di record contemporaneamente, indipendentemente dalle dimensioni della pagina. E quando invalidare la cache. Sta già memorizzando una grande quantità di dati.
Il mio approccio utilizzando la memorizzazione nella cache progressiva
Bob va a comprare il pane Naan dal ristorante più vicino. Osserva che ci sono due persone vicino a un forno. Uno di loro sta modellando il pavimento nel pane Naan. Un altro su richiesta mette quelle forme di pane nel forno e serve l'ordine. Lo osserva la persona sul Forno aspetta qualche secondo in caso di qualsiasi altro ordine e si appoggia allo schienale altrimenti.
Hai capito bene? Lavora su richiesta, fermati per un po 'disponi diversamente. È esattamente così che ho risolto questo problema. Ora mappiamo questo nel nostro scenario.
Cache progressiva:
La nostra chiave di cache è GUID. Questo verrà utilizzato qui come parametro del cursore per la nostra impaginazione. Il valore è il lettore in pausa. Possiamo implementare una cache utilizzando la cache LRU. Inoltre, un timer aggiuntivo che ticchetta ogni 8 secondi (può essere configurato dall'utente) elimina il lettore utilizzato meno di recente. Quindi non teniamo aperte a lungo le connessioni al database.
public interface ICache
{
void Add(Guid Key,IReader reader);
IReader Get(Guid Key);
void DisposeUnwanted();
}
Prima Richiesta
Example request: https://localhost:9261/Products?Price=100&Manufacturer=HP
//Converted Query for our example request.
SELECT * FROM products WHERE Price = 100 AND Manufacturer Like 'HP'
Passaggio 3: metti in pausa il lettore, genera GUID e memorizzalo nella cache.
Passaggio 4: aggiungi il GUID generato come cursore per la pagina successiva nel corpo della risposta JSON.
Richieste successive
Example request: https://localhost:9261/Products?Price=100&Manufacturer=HP&Cursor=GUID
Passaggio 2: riprendi il lettore e leggi il record fino al conteggio del limite.
Passaggio 3 e 4: come la prima richiesta.
Complessità temporale: O(limite), dove il limite è la dimensione della pagina di risposta.
Professionisti :
- Nessun caricamento pigro.
- Uso efficiente delle risorse.
- Tempo di risposta costante.
- Nessuna domanda complessa. Che dovresti capire se spingi verso il basso il parametro del cursore.
- Impossibile leggere i record precedenti. Ma ciò non è possibile utilizzando l'impaginazione del cursore per definizione.
Sì, la vita è facile, se riesci a codificarla.
Questo modello di memorizzazione nella cache progressiva può adattarsi ad altre origini dati come file, documenti. (Abbiamo bisogno di un elaboratore di espressioni separato per la clausola where poiché non possiamo eseguire il push down nei file). Si adatta anche in modo efficiente ai diversi schemi di tabelle del database senza preoccuparsi molto della sua struttura.
Il modello ha funzionato perfettamente per me. Ho visto persone bloccate in una situazione simile su Stack Overflow e utilizzare il caricamento lento o un'implementazione di terze parti con un sovraccarico aggiuntivo invece di una soluzione semplice. L'approccio condiviso è il mio. Quindi potrebbe adattarsi al tuo caso d'uso. Per favore condividi i tuoi approcci nei commenti.
E se ti è piaciuto questo articolo, premi il pulsante clap qui sotto . Significa molto per me e aiuta le altre persone a vedere la storia.
~Sooraj Kumar
Ingegnere software senior presso Astera Software

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































