Redis: Implementar Expire en hash

Creado en 28 oct. 2011  ·  44Comentarios  ·  Fuente: redis/redis

Hola, me gustaría saber si es posible establecer un tiempo de vencimiento en las claves de un hash.
Por ejemplo, me gustaría tener la lista de miembros conectados en un hash con un vencimiento de 5 minutos en cada clave.

¿Es posible?

Gracias, y lo siento de antemano por mi inglés.

Saludos, Max

Comentario más útil

Bueno, casi nunca quiero que caduque un hash completo a la vez. Entonces, realmente, estás sugiriendo dividir un hash en un montón de claves. Eso funciona, pero el mismo argumento podría usarse para preguntar por qué necesita un hash. Hay un valor inmenso en agrupar todas sus claves relacionadas lógicamente. De lo contrario, debe hacer esa contabilidad a través de algún conjunto que almacene sus claves y se encontrará con problemas de integridad referencial. Todo es factible, pero se siente como una omisión bastante grande en redis para no admitir la expiración de claves individuales en un hash. Y no estoy convencido de que tenga valor que N personas diferentes lo resuelvan de M maneras diferentes.

Todos 44 comentarios

Hola, no es posible, use una clave de nivel superior diferente para ese campo específico, o almacene junto con el archivo archivado otro campo con un tiempo de vencimiento, obtenga ambos y deje que la aplicación comprenda si aún es válida o no en función de tiempo actual.

redis 127.0.0.1:6379> hset expire: me llamo tom
(entero) 0
redis 127.0.0.1:6379> hget expire: mi nombre
"Tomás"

redis 127.0.0.1:6379> caducar caducar: yo 10
(entero) 1
redis 127.0.0.1:6379> ttl expire: yo
(entero) 8

...
...
...

redis 127.0.0.1:6379> ttl expire: yo
(entero) -1
redis 127.0.0.1:6379> hget expire: mi nombre
(nulo)

entonces funciona

Creo que la solicitud es para caducar campos individuales. Caducar todo el hash es lo mismo que caducar cualquier otra clave.

Sí, también he cumplido con este requisito. ¿Es posible caducar campos individuales?

¿Existe un problema específico con la creación de varios hashes con diferentes tiempos de vencimiento?

Bueno, casi nunca quiero que caduque un hash completo a la vez. Entonces, realmente, estás sugiriendo dividir un hash en un montón de claves. Eso funciona, pero el mismo argumento podría usarse para preguntar por qué necesita un hash. Hay un valor inmenso en agrupar todas sus claves relacionadas lógicamente. De lo contrario, debe hacer esa contabilidad a través de algún conjunto que almacene sus claves y se encontrará con problemas de integridad referencial. Todo es factible, pero se siente como una omisión bastante grande en redis para no admitir la expiración de claves individuales en un hash. Y no estoy convencido de que tenga valor que N personas diferentes lo resuelvan de M maneras diferentes.

Gracias Kevin Menard y Johan Bergström. En realidad, me encontré con el mismo escenario que se describe aquí: https : //github.com/antirez/redis/issues/242, y he leído los comentarios de Salvatore.
Si divido todos los campos en claves como esta: hashkey: field1 , hashkey: field2 , .. Es difícil administrar estas claves como una colección. como consultar todos los campos, se requiere KEYS 'patten' ...

Saludos,
Dengchunping

Esto es muy problemático. La razón por la que quiero caducar claves específicas dentro de un hash es porque estoy almacenando configuraciones en caché en el hash. Quiero que las claves caduquen automáticamente después de configurarlas. al mismo tiempo, necesito poder eliminar todo el hash si se han actualizado todas mis configuraciones. Entonces necesito la capacidad de obtener estas configuraciones en la lista y eliminar la lista. sin encontrar todas las instancias de configuración: lo que sea.

Tengo el mismo problema con bjoshuanoah, ahora estoy usando key con ttl en lugar de hash, por ejemplo:
Hash: Hashname A - Tecla B - Valor C
Valor-clave: clave A_B - valor C

¿Es técnicamente imposible la falta de esta característica o es una elección de diseño?

La elección del diseño conduce a una implementación que no permite una implementación.

: +1:

redis en sí no es compatible, esta función es demasiado útil.

Hasta hoy, redis no tenía previsto implementar esta funcionalidad :-(

redis 127.0.0.1:6379> hset expire: me llamo tom
(entero) 0
redis 127.0.0.1:6379> hget expire: mi nombre
"Tomás"

redis 127.0.0.1:6379> caducar caducar: yo 10
(entero) 1
redis 127.0.0.1:6379> ttl expire: yo
(entero) 8

...
...
...

redis 127.0.0.1:6379> ttl expire: yo
(entero) -1
redis 127.0.0.1:6379> hget expire: mi nombre
(nulo)

entonces funciona

solo hay un campo en la tabla hash, ¿qué pasa con varios campos? ¡No funcionaría correctamente!

@oylz : creo que la intención original de esta solicitud de función es permitir la expiración de campos específicos dentro del hash, no la clave completa.

@itamarhaber
¿Qué tal esto ?:
hset expire: yo name1 tom1
hset expire: me name2 tom2
hset expire: yo name3 tom3

ttl expire: yo 10

La tabla hash completa (expire: me) expirará.

@oylz Sabemos que el hash completo caducará. está funcionando, pero aquí estamos hablando de un solo campo de cualquier hash (como ya te explicó @itamarhaber ). Por ejemplo, en su caso, ¿cómo puede caducar el campo nombre1 después de 5 segundos, nombre2 después de 10 y nombre 3 después de 15 segundos? Espero que ahora esté claro qué caso de uso se está debatiendo aquí.

@ nomi-ramzan
realmente entiendes? como dijo @itamarhaber : "Creo que la intención original de esta solicitud de función es permitir la expiración de campos específicos dentro del hash, no la clave completa ".

@ nomi-ramzan
lo siento, te respondí mal al principio, debería responder @wheelq .
p.ej:
_redis 127.0.0.1:6379> hset expire: me llamo tom
(entero) 0
redis 127.0.0.1:6379> hget expire: mi nombre
"Tomás"

redis 127.0.0.1:6379> caducar caducar: yo 10
(entero) 1
redis 127.0.0.1:6379> ttl expire: yo
(entero) 8

...
...
...

redis 127.0.0.1:6379> ttl expire: yo
(entero) -1
redis 127.0.0.1:6379> hget expire: mi nombre
(nulo)

entonces funciona_

Esto es 2020, Redis debería mirar esto

nuestra empresa ha implementado la función de caducidad del campo hash
es base redis 4.0

Proporcionar esta función de forma nativa será de gran ayuda.
Gracias.

Sigo esperando esto

¡increíble! ¡Redis todavía no lo ha implementado!

lo mismo aquí, sería increíble tener la capacidad de establecer expirar para campos hash

+1

¡increíble! ¡Redis todavía no lo ha implementado!

+1 para esta función

Habiendo descubierto el mundo de Redis, me imaginé almacenando el caché de esta forma:
1) Cada tabla hash - es mi método api
2) Filas en tablas hash: una función hash de los parámetros de entrada del método y el valor es la respuesta del método.

+1 para esta función

+1 para esta función

+1

+1

+1

+1

¿Hay alguna razón específica por la que no se implementan las claves que caducan en los hash?

La razón por la que esto nunca se implementó es debido a la mayor complejidad de tiempo (CPU) y espacio (RAM) que requeriría esta característica. Dicho esto, nunca digas nunca.

¿La complejidad del tiempo va en el orden del tiempo polinomial? Sin embargo, ¿qué hace que sea un uso intensivo de RAM, la clonación para cualquier propósito?

Estoy seguro de que si esta función se implementara, redis obtendría un gran impulso en popularidad.

+1 para esta función

+1

+1

¿Fue útil esta página
0 / 5 - 0 calificaciones