2009-09-04 15 views
5

Me gustaría saber si hay algún sistema de caché distribuida como memcached, velocity o sharedcache que me permita etiquetar contenido con algo más que su nombre, o que pueda relacionar elementos entre sí, por lo que si invalido el caché para uno elemento también invalida los artículos relacionados también.¿Algún sistema de caché distribuida que permite etiquetar contenido?

por ejemplo. si tengo dos páginas que hacen referencia a los mismos datos y esos datos cambian, me gustaría que la caché de las dos páginas de referencia invalidara.

  • o es esto una adición a uno de esos proyectos que piden ser desarrollados? :)

edición: estoy en asp.net

+0

Yo también estaría interesado en esto - buena pregunta. –

Respuesta

0

Velocity tiene soporte para el etiquetado donde cada etiqueta es una cadena. Los objetos pueden ser recuperados por una etiqueta o por múltiples etiquetas, p. 'Condimento' Y 'Entrega gratuita'.

Sin embargo, Velocity no tiene soporte para dependencias - IIRC, el equipo de Velocity ha dicho que las dependencias no estarán en v1.

+1

tal vez investigue la velocidad entonces, pero mis entrañas dime que Memcache es el camino a seguir :) – possan

+0

voy a marcar esto como la solución. – possan

3

creo que la supresión de los datos dependientes se puede hacer usando cas de memcached (check-y-set) operación. Cada valor tiene una identificación única (serial). Para cada clave, almacene otra clave.dependientes, que tiene el número de serie de los datos y las claves de todos los dependientes.

Cuando va a agregar a un dependiente, hacer

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 

Cuando invalidar un elemento, hacer

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 

Incluso en presencia de escrituras en conflicto, estos algoritmos finalmente terminar, ya que un escritor siempre "pasar".

+0

interesante, ¡lo investigaré! pero realmente me gustaría envolverlo en algo como establecer ('sección # 1', 'datos de sección', 'artículo # 1, artículo # 2, artículo # 3') y luego ser capaz de eliminar ('Articulo 1'); y luego, cuando trato de obtener la sección 1 la próxima vez solo tiene que regenerarla, pero eso podría crear condiciones de carrera y puntos muertos en la memoria caché, y esos tampoco son divertidos:/ – possan

Cuestiones relacionadas