Redis: Implementar expira em hash

Criado em 28 out. 2011  ·  44Comentários  ·  Fonte: redis/redis

Olá, gostaria de saber se é possível definir um tempo de expiração nas chaves de um hash?
Por exemplo, eu gostaria de ter a lista de membros conectados em um hash com uma expiração de 5 minutos em cada chave.

É possível?

Obrigado e desculpe antecipadamente pelo meu inglês.

Atenciosamente, Max

Comentários muito úteis

Bem, quase nunca quero expirar um hash inteiro de uma vez. Então, realmente, você está sugerindo dividir um hash em um monte de chaves. Isso funciona, mas o mesmo argumento poderia ser usado para perguntar por que você precisa de um hash? Há um valor imenso em agrupar todas as suas chaves logicamente relacionadas. Caso contrário, você precisa fazer essa contabilidade por meio de algum conjunto que armazena suas chaves e você terá problemas de integridade referencial. É tudo factível, mas parece uma grande omissão no redis não suportar a expiração de chaves individuais em um hash. E não estou convencido de que haja qualquer valor em ter N pessoas diferentes resolvendo isso de M maneiras diferentes.

Todos 44 comentários

Olá, não é possível, usar uma chave de nível superior diferente para esse campo específico ou armazenar junto com o campo outro campo com um tempo de expiração, buscar ambos e deixar que o aplicativo entenda se ainda é válido ou não com base em hora atual.

redis 127.0.0.1:6379> hset expire: me name tom
(inteiro) 0
redis 127.0.0.1:6379> hget expire: me name
"Tom"

redis 127.0.0.1:6379> expire expire: me 10
(inteiro) 1
redis 127.0.0.1:6379> ttl expire: me
(inteiro) 8

...
...
...

redis 127.0.0.1:6379> ttl expire: me
(inteiro) -1
redis 127.0.0.1:6379> hget expire: me name
(nada)

então funciona

Acredito que a solicitação seja para expirar campos individuais. Expirar o hash inteiro é o mesmo que expirar qualquer outra chave.

Sim, também atendi a esse requisito. É possível expirar campos individuais?

Existe um problema específico com a criação de vários hashes com diferentes tempos de expiração?

Bem, quase nunca quero expirar um hash inteiro de uma vez. Então, realmente, você está sugerindo dividir um hash em um monte de chaves. Isso funciona, mas o mesmo argumento poderia ser usado para perguntar por que você precisa de um hash? Há um valor imenso em agrupar todas as suas chaves logicamente relacionadas. Caso contrário, você precisa fazer essa contabilidade por meio de algum conjunto que armazena suas chaves e você terá problemas de integridade referencial. É tudo factível, mas parece uma grande omissão no redis não suportar a expiração de chaves individuais em um hash. E não estou convencido de que haja qualquer valor em ter N pessoas diferentes resolvendo isso de M maneiras diferentes.

Obrigado Kevin Menard e Johan Bergström. Na verdade, encontrei o mesmo cenário descrito aqui: https : //github.com/antirez/redis/issues/242, e li os comentários feitos por Salvatore.
Se eu dividir todos os campos em chaves como esta: hashkey : hashkey: field2 , .. É difícil gerenciar essas chaves como uma coleção. como consultar todos os campos, KEYS 'padrão' é necessário ...

Cumprimentos,
Dengchunping

Isso é muito problemático. O motivo pelo qual desejo expirar chaves específicas dentro de um hash é porque estou armazenando configurações em cache no hash. Quero expirar as chaves automaticamente depois de defini-las. ao mesmo tempo, preciso eliminar todo o hash se todas as minhas configurações tiverem sido atualizadas. Portanto, preciso conseguir colocar essas configurações na lista e eliminar a lista. sem encontrar todas as instâncias de configurações: seja o que for.

Tenho o mesmo problema com bjoshuanoah, agora estou usando a chave com ttl em vez de hash, por exemplo:
Hash: Hashname A - Chave B - Valor C
Valor-chave: Chave A_B - Valor C

A falta desse recurso não é tecnicamente possível ou é a escolha do design?

A escolha do design leva a uma implementação que não permite uma implementação.

: +1:

próprio redis não suporta, esta função é muito útil.

Até hoje a redis não planejava implementar esta funcionalidade :-(

redis 127.0.0.1:6379> hset expire: me name tom
(inteiro) 0
redis 127.0.0.1:6379> hget expire: me name
"Tom"

redis 127.0.0.1:6379> expire expire: me 10
(inteiro) 1
redis 127.0.0.1:6379> ttl expire: me
(inteiro) 8

...
...
...

redis 127.0.0.1:6379> ttl expire: me
(inteiro) -1
redis 127.0.0.1:6379> hget expire: me name
(nada)

então funciona

há apenas um campo na tabela de hash, e quanto a vários campos? Não funcionaria corretamente!

@oylz - Acredito que a intenção original desta solicitação de recurso é permitir a expiração de campos específicos dentro do hash, não a chave inteira.

@itamarhaber
que tal assim ?:
hset expire: me name1 tom1
hset expire: me name2 tom2
hset expire: me name3 tom3

ttl expire: me 10

Toda a tabela de hash (expire: me) será expirada.

@oylz Sabemos que o hash completo irá expirar. está funcionando, mas aqui estamos falando sobre um único campo de qualquer hash (como @itamarhaber já explicou). Por exemplo, no seu caso, como você pode expirar o campo name1 após 5s, name2 após 10 e name3 após 15 segundos? Espero que agora esteja claro qual caso de uso está em discussão aqui.

@ nomi-ramzan
você realmente entende? como @itamarhaber disse: "Acredito que a intenção original desta solicitação de recurso é permitir a expiração de campos específicos dentro do hash, não a chave inteira ."

@ nomi-ramzan
desculpe, respondi errado no começo, devo responder @wheelq .
por exemplo:
_redis 127.0.0.1:6379> hset expire: me name tom
(inteiro) 0
redis 127.0.0.1:6379> hget expire: me name
"Tom"

redis 127.0.0.1:6379> expire expire: me 10
(inteiro) 1
redis 127.0.0.1:6379> ttl expire: me
(inteiro) 8

...
...
...

redis 127.0.0.1:6379> ttl expire: me
(inteiro) -1
redis 127.0.0.1:6379> hget expire: me name
(nada)

então funciona_

Estamos em 2020, o Redis deve olhar para isso

nossa empresa implementou a função de campo hash de expiração
ele base redis 4.0

Fornecer esse recurso nativamente será muito útil.
Obrigado.

Eu ainda estou esperando por isso

inacreditável! O Redis ainda não o implementou!

o mesmo aqui, seria incrível ter a capacidade de definir expirar para campos de hash

+1

inacreditável! O Redis ainda não o implementou!

+1 para este recurso

Depois de descobrir o mundo Redis, imaginei armazenar o cache desta forma:
1) Cada tabela hash - é meu método de API
2) Linhas em tabelas hash - uma função hash dos parâmetros de entrada do método e o valor é a resposta do método

+1 para este recurso

+1 para este recurso

+1

+1

+1

+1

Há um motivo específico para que as chaves de expiração em hashes não sejam implementadas?

O motivo pelo qual isso ainda não foi implementado é devido ao aumento da complexidade de tempo (CPU) e espaço (RAM) que esse recurso exigiria. Dito isso, nunca diga nunca.

A complexidade do tempo está indo na ordem do tempo polinomial? O que o torna intensivo em RAM, clonando para qualquer propósito?

Tenho certeza de que se esse recurso fosse implementado, o redis teria um grande impulso em popularidade

+1 para este recurso

+1

+1

Esta página foi útil?
0 / 5 - 0 avaliações