2011-02-28 12 views
7

estoy usando memcahced (específicamente el Enyim memcached client) y me gustaría poder hacer un claves en la memoria caché depende de otras teclas, es decir, si Clave Un depende de B Clave, entonces cada vez La clave B se borra o cambia, La clave A también se invalida.elementos dependientes de Memcached

Si es posible me gustaría también para asegurarse de que la integridad de los datos se mantienen en el caso de un nodo en el clúster falla, es decir, si Clave B es en algún momento no está disponible, Clave Un debe todavía ser válido si La clave B debe dejar de ser válida.

Basado en this post Creo que esto es posible, pero estoy luchando para entender el algoritmo lo suficiente como para convencerme de cómo/por qué esto funciona.

¿Alguien puede ayudarme?

Respuesta

0

No creo que sea una solución directa, pero intente crear un sistema de espacios de nombres en sus claves de Memcache, p. http://www.cakemail.com/namespacing-in-memcached/. En resumen, las claves se generan y contienen los valores actuales de otras claves memcached. En el problema del espacio de nombres, la idea es invalidar una amplia gama de claves que están dentro de un cierto espacio de nombres. Esto se logra mediante algo así como incrementar el valor de la clave del espacio de nombres, y cualquier clave que haga referencia al valor del espacio de nombres anterior no coincidirá cuando se regenere la clave.

Su problema se ve un poco diferente, pero creo que mediante la creación de Clave Un para estar en el B Clave "espacio de nombres, si un nodo B no estaba disponible entonces calculando Tecla espacio de nombres completo Un 's por ejemplo

"Key A|Key B:<whatever Key B value is>" 

volverá falsa, por lo tanto lo que le permite determinar que B no está disponible y invalidan la búsqueda en la caché para clave Un.

7

I He estado usando memcached un poco últimamente y estoy seguro de que lo que estás tratando de hacer con las dependencias no es posible con Memcached "tal cual", pero tendría que ser manejado desde el lado del cliente. Además de que la replicación de datos debe ocurrir en el servidor y no en el cliente, estos son 2 dominios diferentes. (Con memcached al menos, al ver su falta de lógica de almacenamiento de datos. El punto de memcached es precisamente eso, minimalismo extremo para un mejor rendimiento)

Para la replicación de datos (protección contra un nodo físico de clúster fallido) debe verificar Membased http://www.couchbase.org/get/couchbase/current en su lugar.

Para el algoritmo deps, pude ver algo así en un cliente: para cualquier tecla dada, se sospecha que hay una tecla adicional que contiene la lista/matriz de teclas dependientes.

# - delete a key, recursive: 
function deleteKey(keyname): 
    deps = client.getDeps(keyname) # 
    foreach (deps as dep): 
     deleteKey(dep) 
     memcached.delete(dep) 
    endeach 
    memcached.delete(keyname) 
endfunction 

# return the list of keynames or an empty list if the key doesnt exist 
function client.getDeps(keyname): 
    return memcached.get(key_name + "_deps") or array() 
endfunction 

# Key "demokey1" and its counterpart "demokey1_deps". In the list of keys stored in 
# "demokey1_deps" there is "demokey2" and "demokey3". 
deleteKey("demokey1"); 
# this would first perform a memcached get on "demokey1_deps" then with the 
# value returned as a list of keys ("demokey2" and "demokey3") run deleteKey() 
# on each of them. 

Saludos