Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

698
Views
Las claves de Redis no caducan - Laravel, Predis

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:

  • ¿Por qué las claves de Redis no caducan?
  • Laravel flash o mensajes de sesión que no caducan [no mantenido Actualizado]
  • mis claves redis no caducan

No hay nada sobre el vencimiento en la documentación de Laravel:

  • https://laravel.com/docs/5.4/redis

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 :)

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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ó.

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report

0

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:

  1. obteniendo el TTL si la clave existe
  2. después de actualizar la clave, establezca la caducidad en el TTL que obtuve de (1)

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!

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!