Bookmark and Share

Usare Memoize e vivere felici

Il caching è un argomento complesso e fondamentale per una applicazione web.. plone.memoize lo rende semplice e divertente, almeno a livello applicativo.

by Maurizio Delmonte - 2008-08-29
Usare Memoize e vivere felici

Per alcuni progetti stiamo utilizzando come motore di tagging il pacchetto lovely.tag, offerto alla comunità da Lovely Systems, e alla base delle funzionalità di tagging di plone.tv e Plone4Artists.

Le sue caratteristiche sono piuttosto adatte ai nostri progetti, tuttavia se il numero di oggetti sottoposti a tagging diventa rilevante, usarlo "a presa diretta" ed effettuare i calcoli ad ogni richiesta utente diventa improponibile.. presto si raggiungono tempi di attesa inaccettabili.

Come fare? l'ideale sarebbe che il motore di tagging memorizzasse le tag cloud e i tag tra loro correlati in modo da non doverli ricalcolare ad ogni richiesta.. ma ogni buon programmatore sa che non è affatto bene andare a manipolare pacchetti di basso livello a proprio uso e consumo.

E' a questo punto che entra in scena plone.memoize, un pacchetto standard di Plone che consente allo sviluppatore di applicare al proprio software varie strategie di caching in modo semplice ed efficace.

Senza entrare troppo nei dettagli (che potrete trovare a documentazione del pacchetto!), vi dico quel che ho potuto rapidamente fare.. ho creato sul mio oggetto contenitore un metodo capace di calcolare la tag cloud degli oggetti in esso contenuti, e ho applicato il decoratore instance.memoize a tale metodo. Questo senza ulteriore sforzo fa si che alla prima richiesta il metodo viene mandato in esecuzione, mentre per tutte le richieste successive memoize restituisce il valore calcolato che viene annotato direttamente sull'istanza dell'oggetto in questione.. geniale!!

Aggiornamento (29/8/08)

Ho dovuto rivedere la scelta iniziale di utilizzare il modulo instance per la gestione del mio caching. Dopo essere passato alle verifiche sul campo mi sono accorto di un "problema" per il mio caso d'uso: un eventuale aggiornamento della cache sull'istanza elimina completamente tutti i valori presenti.. se da un punto di vista concettuale questo è accettabile, da un punto di vista pratico nel mio caso ho bisogno di poter decidere per chiave quali valori aggiornare.

Per questo, dopo un primo tentativo di modificare il codice del modulo, grazie a Daniel Nouri ho scoperto che il modulo plone.memoize.volatile in realtà risulta molto più flessibile, e facilmente si può adottare lo storage che si preferisce (rendendo persistente la cache!). Grazie Daniel! :D