2011-05-20 15 views
8

Digamos que tengo el siguiente código:¿La configuración de una clave memcached que ya existe actualiza el tiempo de caducidad?

Memcached->set('key', 'value', 60); (expire in one minute) 

while (1) { 
    sleep 1 second; 
    data = Memcached->get('key'); 
    // update data 
    Memcached->set('key', data, 60); 
} 

Después de 60 iteraciones del bucle, caducará la llave y al leerlo Voy a buscar un NULL? ¿O la configuración continua seguirá presionando el tiempo de caducidad cada vez hasta 1 minuto después del último Set?

La documentación menciona esto, y he probado esto en diferentes contextos y estoy bastante seguro de que obtuve resultados diferentes.

+0

De [esta pregunta] (http://programmingbulls.com/php-memcache-key-expire) Supongo que "Sí". Pero esto no es autorizado ni uso memcached. Feliz codificación. –

Respuesta

6

Ok, encontrado mi respuesta mediante la experimentación en el extremo ...

Resulta "set" qué extender el vencimiento, que es básicamente lo mismo que eliminar el elemento y ajuste de nuevo con un nuevo vencimiento .

Sin embargo, Incremento no extender la caducidad. Si incrementa una clave, conserva el tiempo de caducidad original que tenía cuando lo configuró en primer lugar.

+1

¿Tiene una fuente para su respuesta? – KyleWpppd

+0

Hubiera sido mejor si adjuntara la fuente actualizada. – Harshit

0

El conjunto no se preocupa en absoluto de lo que pudo haber estado allí y no puede suponer que provenga de la misma aplicación.

¿Qué pruebas hiciste y qué tipo de resultados obtuviste? Memcached nunca garantiza devolver un valor, por lo que si lo ve desaparecido, es posible construir una prueba que lo pierda independientemente de la caducidad.

+0

... suponiendo que el valor solo se desaloja al vencimiento (imagínese que esto se aplica estrictamente por cuestión de pregunta) y siempre devuelto de lo contrario ... –

+0

No estoy seguro de entender ... Usted está diciendo que la expiración se renueva en ¿ese conjunto? –

+0

Digo que es un artículo completamente diferente. No hay relación entre lo que estaba allí y lo que estableces. No lo está renovando, está creando algo completamente nuevo. – Dustin

3

Si simplemente desea extender el tiempo de caducidad de una clave particular, en lugar de restablecer esencialmente los datos cada vez, sólo puede utilizar Memcached::touch

Con la advertencia de que debe tener protocolo binario permitido de acuerdo con la comenta en la página de arriba.

$memcached = new Memcached(); 
$memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true); 
$memcached->touch('key', 120); 
+0

El protocolo ascii también es compatible con touch con versiones más recientes de php-memcached y memcached. Ya no estás limitado al protocolo binario. –

0

La mejor fuente de documentación es el Memcached protocol description

First, the client sends a command line which looks like this: 

<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n 

- <command name> is "set", "add", "replace", "append" or "prepend" 

Como se puede ver, cada uno de los comandos anteriores tienen el campo exptime cual es obligatorio.

Entonces, - actualizará el tiempo de caducidad. Además, memcached crea un nuevo elemento con su propia clave/banderas/expiración/valor y reemplaza el antiguo con él.

0

Si su objetivo es simplemente extender el tiempo de caducidad, use el comando touch, que se creó para establecer un nuevo tiempo de caducidad para una clave.

Ver https://manned.org/memctouch o http://docs.libmemcached.org/bin/memtouch.html

de paquetes Debian: libmemcached-herramientas

Desde el shell: otros man memctouch

distribuciones utilizan "memtouch" como el nombre de la herramienta de línea de comandos

+ 1 Enlace desde el protocolo de memcached, como referencia manual: https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L318

Ejemplo:

memctouch --servers=localhost --expire=60 $key 

Donde $ clave es su 'llave', esto hará que el tiempo de expiración de 60 segundos, como en el ejemplo, pero sin tener que hacer un "get" y volver a la configuración del llave. ¿Qué pasa si su 'clave' no está configurada todavía y su 'obtener' no devuelve algunos datos?

Cuestiones relacionadas