2009-05-21 11 views
7

Nos gustaría procesar algo en una aplicación Java, almacenar los resultados en nuestro grupo de servidores Memcache y leerlo de nuevo usando Memcache en PHP.¿Los clientes de Memcache de hash de diferentes idiomas se hacen de la misma manera?

Esto es bastante fácil de probar, pero pensé en preguntar si alguien más había hecho esto.

Mientras los clientes de Java y PHP se conecten al mismo grupo de servidores de Memcache, ¿los dos clientes llevarán hash a la misma ubicación del servidor, haciendo posible la recuperación de PHP?

+0

Hacer esto sólo parece como una mala idea para mí ... –

+2

1 Excelente pregunta. ¿Mala idea? De ningún modo. Los entornos de lenguaje dividido son un escenario bastante común. – cletus

+0

¿Puedes elaborar? Conceptualmente, solo está escribiendo datos en un lugar en la memoria de 2 idiomas diferentes ... no es muy diferente de escribir en la misma base de datos de 2 idiomas diferentes. –

Respuesta

4

No. No todos los clientes hash de la misma manera. Como evidencia de esto, verá que algunos clientes ofrecen "hash consistente", mientras que otros no lo hacen.

En resumen, los clientes de memcached pueden usar cualquier algoritmo de hashing que deseen. No hay un estándar oficial.

El cliente PHP admite a variety of hashing algorithms - por lo que puede ser posible configurarlo para utilizar el mismo algoritmo que utiliza su biblioteca Java (parece que hay varios por ahí, ¿qué está utilizando?). Pero querrás probar mucho, obviamente.

+0

Hmmm interesante - ¿qué pasa con Java y PHP en particular? –

1

Otra posibilidad de permitir el acceso a través del idioma sería no confiar en la serialización del lenguaje sino almacenar objetos en formato JSON, como Cadena de texto.

Personalmente, uso Gson para Java y json_encode, json_decode en PHP.

+0

Gracias. Sí, eso es otra parte del problema, pero primero debe asegurarse de que todos los clientes lo hagan de la misma manera, por lo que solo está almacenando datos una vez. –

+0

Ah sí, por supuesto, la clave ... bueno, yo no probé el PHP memcached todavía, pero con Java cuando pones un objeto en el caché explícitamente le das un nombre, así que por ejemplo si digo un Objeto de Tipo Persona con Id 232, llamaría a la clave "Persona-232". Si lo desea, puede anteponer el nombre de su aplicación "YourApp-Person-232" y controlar todo con SHA1 o MD5. Aquí se muestra cómo generar un SHA1 de Java que sea el mismo que el de PHP: http://stackoverflow.com/questions/4769007/can-you-get-this-same-java-sha-1-in-php-please/4769087 # 4769087 – stivlo

0

pylibmc

import pylibmc 

mc = pylibmc.Client(["127.0.0.1"], binary=True, 
        behaviors={"tcp_nodelay": True, 
           "ketama": True}) 

key="someKey" 
i=0 
while True: 
    #mc.set(key, str(i)) 
    value = mc.get(key) 
    print(value) 
    sleep(1) 
    i+=1 
Cuestiones relacionadas