Estoy usando Laravel 5.4 , con Predis y el último Redis (o Redis para Windows ).
Las claves se están guardando sin problema. Entonces, dudo que sea un problema de configuración.
El problema es que no caducan. La clave se reutiliza hasta que caduca... similar a cómo funciona una sesión.
Creo la clave una vez, si no existe. En esa misma lógica, establezco el tiempo de vencimiento.
En el controlador, tengo
use Illuminate\Support\Facades\Redis;En una de las funciones, obtenga la instancia de conexión :
$redis = Redis::connection();Antes de crear la clave, compruebo la existencia (simplificado) y luego creo y establezco el vencimiento.
if(!$redis->exists($some_unique_key)) { //set the key $redis->set($some_unique_key, 'Some Value')); //set the expiration //I understand this means expire in 60s. $redis->expire($some_unique_key,60); }¿Por qué no podría estar expirando la clave?
Como mencioné, todo lo demás funciona. Veo que la clave se actualiza sin problemas si superviso y puedo consultarla.
Para el registro, he leído:
No hay nada sobre el vencimiento en la documentación de Laravel:
ACTUALIZAR 1
Investigar una posible causa donde configurar (actualizar) la clave restablece el vencimiento
ACTUALIZAR 2
Usé el razonamiento de @for_thestack (en los comandos de REDIS) para encontrar la solución. Ver mi respuesta con el código. Siéntete libre de votar @for_thestack :)
Para aquellos que usan Laravel, es posible usar EX param (resolución de caducidad) + ttl. En el siguiente ejemplo, EX significa que TTL se expresa en segundos (consulte los documentos de Redis: https://redis.io/commands/set ). Entonces, el resultado a continuación será que $val almacenado en $key se eliminará después de 35 segundos.
Redis::set($key, $val, 'EX', 35);En predis puedes usar lo mismo, en realidad Laravel usa predis debajo del capó.
Algún otro proceso podría llamar a SET para actualizar el par clave-valor, en este caso, se eliminará el vencimiento.
// set expiration EXPIRE key expiration_in_seconds // update key-value pair with no expiration SET key new_value // now, expiration has been reset, and the key won't be expired any more Para mantener la caducidad, cuando actualice el par clave-valor, debe llamar a SET con parámetros de caducidad.
// get TTL, ie how much time left before the key will be expired TTL key // update with expiration parameter SET key new_value EX ttl Puede envolver los dos comandos en un script lua para hacerlo atómico. Y también debe ocuparse del caso de que la clave no exista cuando llame a TTL . Ver el documento para más detalles.
Dado que @for_stack me proporcionó la lógica (en los comandos y la lógica de REDIS), acepté su contribución como respuesta.
Mi problema era que no sabía que configurar la clave restablece la caducidad. Entonces, hacer que funcione, como lo explica @for_stack, implica:
Significa que el TTL general no es preciso. Hay un margen de milisegundos o microsegundos entre el momento en que obtuve el valor TTL en (1) y el momento en que lo actualicé... ¡lo cual me parece bien!
Entonces, para mi escenario Laravel (PHP), Predis, hago lo siguiente:
En algún punto relevante, más arriba en el código:
//get ttl - time left before expiry $ttl = $redis->ttl($some_unique_key);Luego, donde sea que tenga que actualizar el valor, establezco el vencimiento después de establecer el valor. La lógica para crear la clave (en mi pregunta) sigue siendo correcta y sin cambios.
//***note that I am UPDATING a key. Checking if it exists then I update if($redis->exists($some_unique_key)) { //set/up the key $redis->set($some_unique_key, 'Some New, Updated, Value')); //Do some work //set the expiration with the TTL value from (1) $redis->expire($some_unique_key,$ttl); }¡Funciona perfectamente!