Best practice per memorizzare le query di ricerca nella cache

2

Sto cercando di migliorare le prestazioni del mio ASP Web ASP.net aggiungendo una cache di dati, ma non sono sicuro di come procedere esattamente in quanto sembra essere più complesso della maggior parte degli scenari di caching. Un esempio è che ho una tabella di posizioni e una API per recuperare posizioni tramite la ricerca, per un completamento automatico.

/api/location/Londo

e la query sarebbe qualcosa come

SELECT * FROM Locations WHERE Name like 'Londo%'

Queste posizioni cambiano molto di rado, quindi vorrei memorizzarle nella cache per impedire viaggi al database senza alcun motivo reale e migliorare i tempi di risposta.

Guardando le opzioni di memorizzazione nella cache sto usando il sistema Windows Azure Appfabric, il problema è che si tratta solo di una cache chiave / valore. Dal momento che posso recuperare solo gli elementi basati su chiavi, non potrei effettivamente usarlo per questo scenario fino a Im aware.

È quello che sto cercando di fare un cattivo uso di un sistema di memorizzazione nella cache? Dovrei provare a cercare NoSql DB che potrebbe essere eseguito come cache per qualcosa di simile per migliorare le prestazioni? Dovrei semplicemente mettere in cache l'intera tabella / raccolta in una singola chiave con una specifica struttura dati che potrebbe aiutare con la ricerca e quindi effettuare la ricerca al momento del recupero dei dati?

    
posta David Esteves 09.04.2014 - 17:07
fonte

3 risposte

2

Dal momento che si desidera seguire le migliori pratiche quindi utilizzare il motore di ricerca come ElasticSearch o Solr. Non solo sono veloci e gestiscono le proprie cache, ma sono anche meglio equipaggiati con diversi tipi di metodi di ricerca.

Usare / gestire la propria cache è una buona idea, ma lo lascerei come ottimizzazione piuttosto che come soluzione al problema (ricerca) perché ti dà solo velocità ma non facilità di ricerca.

Ad esempio, in questo momento si desidera solo cercare la posizione per stringa di ricerca dell'utente. Se in un secondo momento si desidera cercare la posizione per geocodifica (poiché i client mobili possono inviare la loro posizione) sarà necessario scrivere la propria soluzione se si desidera utilizzare il DB. Questo tipo di ricerca è disponibile dai motori di ricerca. L'altro tipo di ricerca che potresti voler fare è la ricerca sfaccettata e ci sono altri metodi (come una stringa simile al suono, ecc.)

La seccatura di usare il motore di ricerca è dover mantenere tutto aggiornato sia sul database che sul motore di ricerca. Ma è un piccolo prezzo da pagare.

    
risposta data 10.06.2014 - 01:07
fonte
0

Se stai costruendo l'istruzione SQL come una stringa, puoi prendere un hash e utilizzarlo come chiave in una cache distribuita.

A seconda di quante varianti ci sono e di quanta memoria hai, potresti voler includere un "time to live" o un "algoritmo meno utilizzato" per mantenere la quantità di memoria entro i limiti.

Tuttavia @GrandmasterB ha ragione - la maggior parte dei database fa un caching molto aggressivo dei risultati delle query, quindi potresti finire per duplicare il caching che sta già accadendo. L'unico miglioramento che viene in mente è se si memorizzano nella cache i risultati localmente nella RAM (con un algoritmo usato meno di recente) per salvare un round trip nel database.

Ma no, in generale non è un cattivo uso del caching. Le avvertenze sono che potresti duplicare il caching che sta già accadendo. Inoltre, se i risultati della query cambiano molto, allora si verificano i soliti problemi con la duplicazione dei dati: la risposta in cache non è più sincronizzata con la risposta "reale".

    
risposta data 10.04.2014 - 08:15
fonte
0

Se hai avvolto la tua query attorno a un ORM come Hibernate, il link Eclipse, ecc. allora l'ORM farà un po 'di cache nella tua RAM localmente. Si salva la latenza di I / O della rete.

Quando la richiesta arriva al server SQL, eseguirà un altro giro di memorizzazione nella cache, salvando l'IO del disco.

Tuttavia, poiché i dati cambiano così frequentemente, è necessario pensare a un altro modo per migliorare le prestazioni piuttosto che il caching.

    
risposta data 09.06.2014 - 17:45
fonte

Leggi altre domande sui tag