2009-09-04 8 views
5

Mi piacerebbe sapere se esiste un sistema di cache distribuita come memcached, velocity o sharedcache che mi consente di taggare il contenuto con qualcosa di più del suo nome o che può riguardare gli elementi tra loro, quindi se invalido la cache per uno l'articolo invalida anche gli articoli correlati.Qualsiasi sistema di cache distribuita che consente di codificare il contenuto?

es. se ho due pagine che fanno riferimento agli stessi dati e che i dati cambiano, vorrei che la cache per le due pagine di riferimento venisse invalidata.

  • oppure si tratta di un'aggiunta a uno di quei progetti che richiedono di essere sviluppati? :)

Edit: sto su asp.net

+0

Anch'io sarei interessato a questo - buona domanda. –

risposta

0

Velocity ha il supporto per il tagging in cui ogni tag è una stringa. Gli oggetti possono essere recuperati da un tag o da più tag, ad es. 'Condimento' E 'Consegna gratuita'.

Tuttavia Velocity non ha supporto per le dipendenze - IIRC il team Velocity ha detto che le dipendenze non saranno in v1.

+1

forse guarderò in avanti allora, ma il mio coraggio dimmi che memcache è la strada da percorrere :) – possan

+0

lo contrassegnerò come soluzione. – possan

3

Credo che la cancellazione dei dati dipendenti può essere fatto utilizzando di memcached cas (check-e-set) il funzionamento. Ogni valore ha un ID univoco (seriale). Per ogni chiave, memorizzare un altro key.dependents, che ha la seriale dei dati, e le chiavi di tutti i dipendenti.

Quando si va ad aggiungere un dipendente, fare

dependents, dep_serial = fetch(key+".dependents") 
data, serial = fetch(key) 
if serial != dependents[0]: 
    # somebody changed the actual data 
    start_over 
generate_and_cache_dependent(dep_key, data) 
dependents.append(dep_key) 
if not cas(dependents, dep_serial): 
    # somebody changed dependents 
    start_over # can avoid regenerating the data if they are still at serial 

Quando invalidare un elemento, fare

dependents, dep_serial = fetch(key + ".dependents") 
serial = update(key, new_data) 
for dkey in dependents[1:]: 
    delete(dkey) 
dependents = [serial] 
if not cas(dependents, dep_serial): 
    start_over 

Anche in presenza di scritture contrastanti, questi algoritmi finiranno per terminare, dal momento che uno scrittore sempre "superare".

+0

interessante, vedrò quello! ma mi piacerebbe davvero racchiuderlo in qualcosa come set ('sezione # 1', 'dati sezione', 'articolo # 1, articolo # 2, articolo # 3') quindi semplicemente in grado di eliminare ('Articolo 1'); e poi quando cerco di ottenere section1 la prossima volta è necessario rigenerarlo, ma ciò potrebbe creare condizioni di competizione e cache deadlock, e anche quelli non sono divertenti:/ – possan

Problemi correlati