527 messaggi dal 18 dicembre 2012
Ciao a tutti
In un portale per la ricerca di disponibilità in strutture alberghiere eseguo la ricerca attraverso jquery. Il risultato è una stringa di dati in formato json.
Un consiglio: meglio salvare questa stringa in un db o nella cache? La dimensione della stringa dipende da quante strutture sono disponibili.
Grazie mille
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
penso che ti convenga salvare il risultato nella cache in memoria avvalendoti di un servizio (leggi: classe) che si occupi anche di:
  • Eliminare automaticamente dalla memoria le chiavi poco usate;
  • Invalidare immediatamente una chiave quando il numero di strutture ottenute da quella ricerca cambia.


Questo secondo punto sarà abbastanza ostico perchè ti serve una logica per determinare velocemente quali chiavi vanno invalidate. Secondo Phil Karlton esistono solo due cose difficili in informatica: dare i nomi alle cose e invalidare la cache.

Ti servirà un po' di tempo per escogitare una politica di cache che sia in grado di abbattere le query al database e al contempo garantire dati freschi agli utenti.

Se la tua stringa JSON è fornita da un'action di WebAPI, leggi questi due script di Marco De Sanctis sul caching e sull'invalidazione.
http://www.aspitalia.com/script/1225/Attivare-Output-Caching-ASP.NET-Web-API.aspx
http://www.aspitalia.com/script/1226/Invalidare-Automaticamente-Output-Cache-ASP.NET-Web-API.aspx

ciao,
Moreno

Enjoy learning and just keep making
527 messaggi dal 18 dicembre 2012
Grazie Moreno
I dati non sono forniti da una web api, ma da una semplice $.ajax
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
$.ajax è la funzione jQuery che usi inviare una richiesta ajax al server.
Il server, di suo, risponderà inviando del JSON. Ecco: cos'è lato server che invia quel json? C'è un'action di WebAPI? Un'action di MVC? Un Page Method di WebForms? Una semplice pagina o un'httphandler che fanno Response.Write del JSON?

Enjoy learning and just keep making
527 messaggi dal 18 dicembre 2012
Hai ragione. Ho letto male la domenda.
Utilizzo un httphandler

Ho utilizzato MemoryCache per salvare il risultato della ricerca. Ho impostato che i dati devo essere eliminati dopo 15 minuti.

Ho 2 dubbi:
1. devo inserire all'inizio della pagina <%@ OutputCache ... %> o non è necessario visto che salvo dei dati? Nel caso sia sì, che parametri devo passare?

2. Non so se sia il comportamento normale, quando clicco su una struttura trovata nella ricerca e poi clicco per tornare indietro alla pagina risultati, non trovo più i dati nella cache? E' possibile lascaire i dati nella cache anche se si cambia pagina?

Così salvo e leggo i dati:
var policy = new CacheItemPolicy
{
SlidingExpiration = new TimeSpan(0, 15, 0)
};
MemoryCache.Default.Set(param4, new tipoResultCerca { Elenco = JsonConvert.SerializeObject(proposte), Tot = totProposte, Codici = _codiceStrutture }, policy);


tipoResultCerca cacheData = (tipoResultCerca)MemoryCache.Default.Get(param4);


Grazie mille
Modificato da Svipla il 04 luglio 2016 13.08 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


1. devo inserire all'inizio della pagina <%@ OutputCache ... %> o non è necessario visto che salvo dei dati? Nel caso sia sì, che parametri devo passare?

No, OutputCache non sarebbe necessario se hai scelto di sfruttare l'application cache con l'oggetto MemoryCache.


non trovo più i dati nella cache

Il valore deve necessariamente essere ancora lì in cache se la chiave è la stessa che avevi usato prima, per cachare il valore. Le mie ipotesi sono:
  • Non ricostruisci la chiave in maniera esattamdete uguale, e questo ti dà l'illusione che la cache abbia perso il valore. Hai messo un breakpoint in corrispondenza del Get per verificare che la chiave sia la stessa e quale sia il valore restituito?
  • Nel codice che hai postato fai prima il Set e poi il Get. Dovrebbe essere il contrario: prima cerchi di ottenere il valore dalla cache e, solo se il valore ottenuto è null, allora fai il Set;
  • Oppure, quando torni indietro, ti aspetti di trovare i risultati nella pagina web ma ciò non avviene, e quindi il problema è nel javascript anziché nei risultati cache.


Personalmente, in questo caso, anziché MemoryCache userei l'OutputCache perché mi interessa cachare tutto il risultato JSON e non solo alcune parti. Questa considerazione è valida solo se stai invocando l'HttpHandler con una richiesta GET, altrimenti non funzionerebbe.
Andrebbe configurato così. Metti questo come ultimo codice nel corpo del metodo ProcessRequest.
// caching lato server
context.Response.Cache.SetCacheability(HttpCacheability.Server);
// 15 minuti di scadenza
context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(15));
// La cache è considerata valida finché non scade
context.Response.Cache.SetValidUntilExpires(true);
// Le chiavi cache si differenziano al differenziarsi dei parametri querystring
context.Response.Cache.VaryByParams["*"] = true;

Se scegli per questa strada ricorda che tutti i parametri di ricerca vanno forniti via querystring e non via POST.

Così sei riuscito a riprodurre una soluzione equivalente a quella del MemoryCache, che è anche un pelo più efficiente perché il tuo handler non andrà in esecuzione se viene rilevato che la cache è ancora valida e la risposta può essere servita da lì.

ciao,
Moreno
Modificato da BrightSoul il 05 luglio 2016 08.59 -

Enjoy learning and just keep making
527 messaggi dal 18 dicembre 2012
Scusami Moreno se ti disturbo ancora.
Un consiglio: La mia idea è quella di salvare nella cache i risultati della ricerca senza nessun filtro. Quindi oltre a salvare le info delle strutture, le camere trovate e il costo, vado a salvare anche i dati utili per i filtri(es. tipologia di struttura, zone, numero di stelle ecc).
Quando l'utente applica un filtro recupero dalla cache i dati e con linq filtro i dati. I dati li salvo nella cache come List. Lato client invio, con jquery, solo i dati necessari alla visualizzazione.
Posso salvare tutti questi dati nella cache o posso avere problemi di velocità?
Consigli su come realizzare tutto questo?
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


La mia idea è quella di salvare nella cache i risultati della ricerca senza nessun filtro
...
recupero dalla cache i dati e con linq filtro i dati

Però questo comincia a somigliare più ad un database in memoria che non ad una cache.
Se tieni una List in cache come stai cercando di fare, non potrai sfruttare gli indici e gli altri accorgimenti usati da un motore di ricerca vero e proprio. Certamente sfrutti la velocità della RAM ma è una magra conquista, perché non è un modo appropriato di farlo e certamente non ci realizzi un motore di ricerca che potrebbe darti prestazioni ancora superiori.

Ogni attività ha una sua tecnologia appropriata. Nella tua situazione, sceglierei senza dubbio ElasticSearch o, se non vuoi il problema di doverlo configurare, Azure Search. Penso che uscirà la registrazione della sessione che Marco De Sanctis ha tenuto su Azure Search lo scorso 30 giugno a Milano, in occasione del 18° anniversario di ASPItalia.

Ho provato a proporlo in un'altra discussione ma riscontro una certa "diffidenza" nell'usare nuove tecnologie come questa. Alla fine credo che tutto dipenda da quanto vuoi investire (tempo e denaro) per dare un servizio soddisfacente ai tuoi utenti.
Modificato da BrightSoul il 08 luglio 2016 10.33 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.