O TairHash (exHash) é uma estrutura de dados hash que permite definir tempo de expiração e versão para cada campo. Esse recurso aumenta a flexibilidade da estrutura de dados hash e simplifica o desenvolvimento em diversos cenários.
Visão geral
O TairHash estende o hash padrão do Redis com duas funcionalidades ausentes na implementação nativa: expiração por campo e controle de versão por campo. Você pode definir um TTL em campos individuais sem afetar o restante da chave e usar números de versão para evitar conflitos em escritas simultâneas.
O TairHash utiliza um algoritmo de Expiração Ativa que verifica e remove proativamente os campos expirados, sem impacto perceptível no tempo de resposta. Também há suporte à expiração passiva, que elimina os campos expirados no momento do acesso.
Principais recursos
Defina tempo de expiração e versão para cada campo.
Use políticas de expiração ativa e passiva para campos.
Utilize sintaxe semelhante ao tipo de dados hash nativo do Redis.
Este módulo é open source. Para mais informações, consulte TairHash.
Pré-requisitos
Antes de começar, verifique se você possui:
-
Uma instância Tair de um dos seguintes tipos:
Otimizada para memória persistente (versão secundária 1.2.6 ou posterior)
Mantenha sua instância na versão secundária mais recente para obter recursos adicionais e maior estabilidade. Consulte Atualização de versão secundária . Para instâncias com arquitetura de cluster ou de divisão de leitura/escrita, atualize também os nós de proxy. Caso contrário, alguns comandos podem não ser reconhecidos.
Precauções
Os comandos operam sobre dados TairHash em uma instância Tair.
Comandos
As tabelas a seguir listam todos os comandos do TairHash, agrupados por tipo de operação.
Comandos de escrita
|
Comando |
Sintaxe |
Descrição |
||
|
EXHSET |
|
XX] [VER |
ABS version] [KEEPTTL]` |
Adiciona um campo à chave TairHash especificada. Cria a chave se ela não existir. Sobrescreve o valor do campo se ele já existir. |
|
EXHMSET |
|
Adiciona vários campos à chave TairHash especificada. Cria a chave se ela não existir. Sobrescreve os valores dos campos existentes. |
||
|
EXHINCRBY |
|
ABS version] [MIN minval] [MAX maxval] [KEEPTTL]` |
Incrementa o valor inteiro de um campo em |
|
|
EXHINCRBYFLOAT |
|
ABS version] [MIN minval] [MAX maxval] [KEEPTTL]` |
Incrementa o valor de ponto flutuante de um campo em |
Comandos de expiração
|
Comando |
Sintaxe |
Descrição |
|
|
EXHEXPIRE |
|
ABS version]` |
Define um tempo de expiração relativo em segundos para um campo. |
|
EXHPEXPIRE |
|
ABS version]` |
Define um tempo de expiração relativo em milissegundos para um campo. |
|
EXHEXPIREAT |
|
ABS version]` |
Define um tempo de expiração absoluto (timestamp UNIX em segundos) para um campo. |
|
EXHPEXPIREAT |
|
ABS version]` |
Define um tempo de expiração absoluto (timestamp UNIX em milissegundos) para um campo. |
Comandos de leitura
|
Comando |
Sintaxe |
Descrição |
|
EXHGET |
|
Obtém o valor de um campo. Retorna |
|
EXHMGET |
|
Obtém os valores de vários campos. Retorna |
|
EXHGETWITHVER |
|
Obtém o valor e o número de versão de um campo. Retorna |
|
EXHMGETWITHVER |
|
Obtém os valores e os números de versão de vários campos. |
|
EXHTTL |
|
Obtém o TTL restante de um campo, em segundos. |
|
EXHPTTL |
|
Obtém o TTL restante de um campo, em milissegundos. |
|
EXHVER |
|
Obtém o número de versão atual de um campo. |
|
EXHLEN |
|
Obtém o número de campos na chave. Especifique |
|
EXHEXISTS |
|
Verifica se um campo existe. |
|
EXHSTRLEN |
|
Obtém o comprimento da string de valor de um campo. |
|
EXHKEYS |
|
Obtém todos os campos da chave. |
|
EXHVALS |
|
Obtém todos os valores dos campos da chave. |
|
EXHGETALL |
|
Obtém todos os campos e valores da chave. |
|
EXHSCAN |
|
Percorre a chave iterativamente. Apenas para instâncias otimizadas para memória. |
Comandos de versão
|
Comando |
Sintaxe |
Descrição |
|
EXHSETVER |
|
Defina o número de versão de um campo. |
Comandos de exclusão
|
Comando |
Sintaxe |
Descrição |
|
EXHDEL |
|
Exclua um ou mais campos da chave. |
|
|
Exclua uma ou mais chaves TairHash usando o comando DEL nativo do Redis. |
Convenções de sintaxe
|
Convenção |
Significado |
|
|
|
Palavra-chave do comando |
|
|
|
Variável |
|
|
|
Parâmetro opcional |
|
|
|
B` |
Mutuamente exclusivo — especifique apenas um |
|
|
O parâmetro pode ser repetido |
EXHSET
time complexity|
**Sintaxe** |
** |
XX] [VER |
ABS version] [KEEPTTL]`** |
|
O(1) |
|||
|
Descrição |
Adiciona um campo à chave TairHash especificada. Cria a chave se ela não existir. Sobrescreve o valor do campo se ele já existir. |
Opções
|
Opção |
Descrição |
|
|
A chave TairHash. |
|
|
O campo a ser definido. |
|
|
O valor do campo. |
|
|
Tempo de expiração relativo em segundos. |
|
|
Tempo de expiração absoluto como um timestamp UNIX em segundos. |
|
|
Tempo de expiração relativo em milissegundos. |
|
|
Tempo de expiração absoluto como um timestamp UNIX em milissegundos. |
|
|
Defina o campo apenas se ele ainda não existir. |
|
|
Defina o campo apenas se ele já existir. |
|
|
Controle de concorrência otimista. Se o campo existir e sua versão atual corresponder a |
|
|
Defina a versão com um valor exato, independentemente da versão atual. |
|
|
Preserva a expiração atual do campo quando você não especifica |
Após definir um tempo limite para um campo, executar o EXHSET novamente sem uma opção de tempo limite limpa a expiração (a menos que você useKEEPTTL). Para definir uma expiração na própria chave, use o comando nativoEXPIREouEXPIREAT.
Valores de retorno
|
Valor |
Significado |
|
|
Um novo campo foi criado. |
|
|
O campo existia e seu valor foi sobrescrito. |
|
|
|
|
|
|
Exemplo
EXHSET myhash field1 val EX 10
(integer) 1
EXHGET
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Obtém o valor de um campo. Retorna |
Valores de retorno
|
Valor |
Significado |
|
Valor do campo |
O campo existe. |
|
|
A chave ou o campo não existe. |
Exemplo
EXHSET myhash field1 val
EXHGET myhash field1
"val"
EXHMSET
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(N), onde N é o número de campos |
|
Descrição |
Adiciona vários campos à chave TairHash especificada. Cria a chave se ela não existir. Sobrescreve os valores dos campos existentes. |
Para definir a expiração em campos individuais após a criação, use EXHEXPIRE, EXHPEXPIRE, EXHEXPIREAT ou EXHPEXPIREAT. Para definir a expiração na própria chave, use o comando nativoEXPIREouEXPIREAT.
Valores de retorno
|
Valor |
Significado |
|
|
A operação foi bem-sucedida. |
Exemplo
EXHMSET myhash field1 val1 field2 val2
OK
EXHEXPIRE
|
**Sintaxe** |
** |
ABS version]`** |
|
Complexidade de tempo |
O(1) |
|
|
Descrição |
Define um tempo de expiração relativo em segundos para um campo. |
Opções
|
Opção |
Descrição |
|
|
A chave TairHash. |
|
|
O campo no qual definir a expiração. |
|
|
Tempo de expiração relativo em segundos. |
|
|
Mesmo comportamento de concorrência otimista do EXHSET. |
|
|
Defina a versão com um valor exato, independentemente da versão atual. |
Valores de retorno
|
Valor |
Significado |
|
|
O campo existe e a expiração foi definida. |
|
|
O campo não existe. |
Exemplo
EXHSET myhash field1 val
EXHEXPIRE myhash field1 100
(integer) 1
EXHPEXPIRE
|
**Sintaxe** |
** |
ABS version]`** |
|
Complexidade de tempo |
O(1) |
|
|
Descrição |
Define um tempo de expiração relativo em milissegundos para um campo. |
Opções
|
Opção |
Descrição |
|
|
A chave TairHash. |
|
|
O campo no qual definir a expiração. |
|
|
Tempo de expiração relativo em milissegundos. |
|
|
Mesmo comportamento de concorrência otimista do EXHSET. |
|
|
Defina a versão com um valor exato, independentemente da versão atual. |
Valores de retorno
|
Valor |
Significado |
|
|
O campo existe e a expiração foi definida. |
|
|
O campo não existe. |
Exemplo
EXHSET myhash field1 val
EXHPEXPIRE myhash field1 1000
(integer) 1
EXHEXPIREAT
|
**Sintaxe** |
** |
ABS version]`** |
|
Complexidade de tempo |
O(1) |
|
|
Descrição |
Define um tempo de expiração absoluto (timestamp UNIX em segundos) para um campo. |
Opções
|
Opção |
Descrição |
|
|
A chave TairHash. |
|
|
O campo no qual definir a expiração. |
|
|
Timestamp UNIX absoluto em segundos. |
|
|
Mesmo comportamento de concorrência otimista do EXHSET. |
|
|
Defina a versão com um valor exato, independentemente da versão atual. |
Valores de retorno
|
Valor |
Significado |
|
|
O campo existe e a expiração foi definida. |
|
|
O campo não existe. |
Exemplo
EXHEXPIREAT myhash field1 1293840000
(integer) 1
EXHPEXPIREAT
|
**Sintaxe** |
** |
ABS version]`** |
|
Complexidade de tempo |
O(1) |
|
|
Descrição |
Define um tempo de expiração absoluto (timestamp UNIX em milissegundos) para um campo. |
Opções
|
Opção |
Descrição |
|
|
A chave TairHash. |
|
|
O campo no qual definir a expiração. |
|
|
Timestamp UNIX absoluto em milissegundos. |
|
|
Mesmo comportamento de concorrência otimista do EXHSET. |
|
|
Defina a versão com um valor exato, independentemente da versão atual. |
Valores de retorno
|
Valor |
Significado |
|
|
O campo existe e a expiração foi definida. |
|
|
O campo não existe. |
Exemplo
EXHPEXPIREAT myhash field1 1293840000000
(integer) 1
EXHTTL
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Obtém o TTL restante de um campo, em segundos. |
Valores de retorno
|
Valor |
Significado |
|
Inteiro positivo |
TTL restante em segundos. |
|
|
O campo existe, mas não tem expiração definida. |
|
|
A chave não existe. |
|
|
O campo não existe. |
Exemplo
O exemplo a seguir mostra todos os estados de retorno possíveis em uma única sequência: um campo com TTL definido (85) e um campo sem expiração (-1).
EXHSET myhash field1 val1 EX 100
EXHSET myhash field2 val2
EXHTTL myhash field1
EXHTTL myhash field2
EXHTTL myhash field3
(integer) 85
(integer) -1
(integer) -3
EXHPTTL
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Obtém o TTL restante de um campo, em milissegundos. |
Valores de retorno
|
Valor |
Significado |
|
Inteiro positivo |
TTL restante em milissegundos. |
|
|
O campo existe, mas não tem expiração definida. |
|
|
A chave não existe. |
|
|
O campo não existe. |
Exemplo
EXHSET myhash field1 val1 EX 100
EXHPTTL myhash field1
(integer) 97213
EXHVER
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Obtém o número de versão atual de um campo. |
Valores de retorno
|
Valor |
Significado |
|
Inteiro positivo |
O número de versão atual. |
|
|
A chave não existe. |
|
|
O campo não existe. |
Exemplo
EXHVER myhash field1
(integer) 1
EXHSETVER
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Defina o número de versão de um campo com um valor exato. |
Valores de retorno
|
Valor |
Significado |
|
|
A versão foi definida. |
|
|
A chave ou o campo não existe. |
Exemplo
EXHSETVER myhash field1 3
(integer) 1
EXHINCRBY
|
**Sintaxe** |
** |
ABS version] [MIN minval] [MAX maxval] [KEEPTTL]`** |
|
Complexidade de tempo |
O(1) |
|
|
Descrição |
Incrementa o valor inteiro de um campo em |
Opções
|
Opção |
Descrição |
|
|
A chave TairHash. |
|
|
O campo a ser incrementado. |
|
|
Valor inteiro de incremento. |
|
|
Mesma função que no EXHSET. |
|
|
Mesmo comportamento de concorrência otimista do EXHSET. |
|
|
Defina a versão com um valor exato, independentemente da versão atual. |
|
|
Valor mínimo permitido. Retorna um erro se o resultado for menor que |
|
|
Valor máximo permitido. Retorna um erro se o resultado exceder |
|
|
Preserva a expiração atual do campo. Mesmo comportamento do EXHSET. |
Após definir um tempo limite para um campo, executar o EXHINCRBY novamente sem uma opção de tempo limite limpa a expiração (a menos que você use KEEPTTL ).
Valores de retorno
|
Valor |
Significado |
|
Inteiro |
O novo valor após o incremento. |
Exemplo
EXHMSET myhash field1 10
EXHINCRBY myhash field1 100
(integer) 110
EXHINCRBYFLOAT
|
**Sintaxe** |
** |
ABS version] [MIN minval] [MAX maxval] [KEEPTTL]`** |
|
Complexidade de tempo |
O(1) |
|
|
Descrição |
Incrementa o valor de ponto flutuante de um campo em |
Opções
|
Opção |
Descrição |
|
|
A chave TairHash. |
|
|
O campo a ser incrementado. |
|
|
Valor de incremento de ponto flutuante. |
|
|
Mesma função que no EXHSET. |
|
|
Mesmo comportamento de concorrência otimista do EXHSET. |
|
|
Defina a versão com um valor exato, independentemente da versão atual. |
|
|
Valor mínimo permitido. Retorna um erro se o resultado for menor que |
|
|
Valor máximo permitido. Retorna um erro se o resultado exceder |
|
|
Preserva a expiração atual do campo. Mesmo comportamento do EXHSET. |
Após definir um tempo limite para um campo, executar o EXHINCRBYFLOAT novamente sem uma opção de tempo limite limpa a expiração (a menos que você use KEEPTTL ).
Valores de retorno
|
Valor |
Significado |
|
String de ponto flutuante |
O novo valor após o incremento. |
Exemplo
EXHMSET myhash field1 10
EXHINCRBYFLOAT myhash field1 9.235
"19.235"
EXHGETWITHVER
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Obtém o valor e o número de versão de um campo. Retorna |
Valores de retorno
|
Valor |
Significado |
|
Array de |
O campo existe. |
|
|
A chave ou o campo não existe. |
Exemplo
EXHGETWITHVER myhash field1
1) "19.235"
2) (integer) 5
EXHMGET
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Obtém os valores de vários campos. Retorna |
Valores de retorno
|
Valor |
Significado |
|
|
A chave não existe. |
|
Array de valores |
Um elemento por campo solicitado; |
Exemplo
EXHMSET myhash field1 10 field2 var1
EXHMGET myhash field1 field2
1) "10"
2) "var1"
EXHMGETWITHVER
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Obtém os valores e os números de versão de vários campos. Retorna |
Valores de retorno
|
Valor |
Significado |
|
|
A chave não existe. |
|
Array de pares |
Um elemento por campo solicitado; |
Exemplo
EXHMSET myhash field1 10 field2 var1
EXHMGETWITHVER myhash field1 field2
1) 1) "10"
2) (integer) 1
2) 1) "var1"
2) (integer) 1
EXHLEN
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) sem |
|
Descrição |
Obtém o número de campos na chave. Por padrão, inclui campos que expiraram, mas ainda não foram excluídos. Use |
Opções
|
Opção |
Descrição |
|
|
Percorre toda a chave e filtra os campos expirados antes da contagem. Observe que |
Valores de retorno
|
Valor |
Significado |
|
Inteiro |
Número de campos (pode incluir campos expirados, mas não excluídos, sem |
|
|
A chave não existe. |
Exemplo
EXHLEN myhash
(integer) 2
EXHEXISTS
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Verifica se um campo existe na chave. |
Valores de retorno
|
Valor |
Significado |
|
|
O campo existe. |
|
|
A chave ou o campo não existe. |
Exemplo
EXHEXISTS myhash field1
(integer) 1
EXHSTRLEN
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Obtém o comprimento da string de valor de um campo. |
Valores de retorno
|
Valor |
Significado |
|
Inteiro positivo |
O comprimento da string. |
|
|
A chave ou o campo não existe. |
Exemplo
EXHSTRLEN myhash field1
(integer) 2
EXHKEYS
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(N) |
|
Descrição |
Obtém todos os campos da chave. |
Valores de retorno
|
Valor |
Significado |
|
Array de nomes de campos |
A chave existe. |
|
Array vazio |
A chave não existe. |
Exemplo
EXHMSET myhash field1 10 field2 var1
EXHKEYS myhash
1) "field1"
2) "field2"
EXHVALS
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(N) |
|
Descrição |
Obtém todos os valores dos campos da chave. |
Valores de retorno
|
Valor |
Significado |
|
Array de valores |
A chave existe. |
|
Array vazio |
A chave não existe. |
Exemplo
EXHMSET myhash field1 10 field2 var1
EXHVALS myhash
1) "10"
2) "var1"
EXHGETALL
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(N) |
|
Descrição |
Obtém todos os campos e seus valores na chave. A resposta alterna entre nomes de campos e valores. |
Valores de retorno
|
Valor |
Significado |
|
Array de pares campo-valor |
A chave existe. |
|
Array vazio |
A chave não existe. |
Exemplo
EXHMSET myhash field1 10 field2 var1
EXHGETALL myhash
1) "field1"
2) "10"
3) "field2"
4) "var1"
EXHSCAN
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) por chamada; O(N) para uma varredura completa |
|
Descrição |
Percorre a chave iterativamente e retorna um cursor e um lote de pares campo-valor. Apenas para instâncias otimizadas para memória. |
Opções
|
Opção |
Descrição |
|
|
A chave TairHash. |
|
|
Posição inicial da varredura. Veja os valores válidos abaixo. |
|
|
Campo de referência usado com |
|
|
Filtra os resultados por um padrão de expressão regular aplicado aos nomes dos campos. |
|
|
Número de campos a serem percorridos por chamada. O padrão é |
Valores válidos de op
|
Valor |
Posição inicial |
|
|
Primeiro campo maior que |
|
|
Primeiro campo maior ou igual a |
|
|
Primeiro campo menor que |
|
|
Primeiro campo menor ou igual a |
|
|
Primeiro campo igual a |
|
|
Primeiro campo da chave |
|
|
Último campo da chave |
Valores de retorno
A resposta é um array de dois elementos:
O campo inicial para a próxima chamada de varredura. Vazio quando a varredura estiver concluída.
Os campos percorridos e seus valores, intercalados como
[field, value, field, value, ...].
Retorna um array vazio se a chave não existir.
Exemplo
EXHMSET myhashkey field1 val1 field2 val2 field3 val3 field4 val4 field5 val5
EXHSCAN myhashkey ^ xx COUNT 3
1) "field4"
2) 1) "field1"
2) "val1"
3) "field2"
4) "val2"
5) "field3"
6) "val3"
A próxima varredura começa em field4. Passe field4 como subkey com op >= para continuar.
EXHDEL
|
**Sintaxe** |
** |
|
Complexidade de tempo |
O(1) |
|
Descrição |
Exclua um ou mais campos da chave. |
Valores de retorno
|
Valor |
Significado |
|
|
O campo foi excluído. |
|
|
A chave ou o campo não existe. |
Exemplo
EXHDEL myhash field1
(integer) 1
Perguntas frequentes
Por que o exHash usa mais memória que um hash padrão do Redis para os mesmos dados?
Cada campo no TairHash armazena metadados adicionais — o timestamp de expiração e o número de versão — que um hash padrão do Redis não possui. Esses metadados extras por campo causam o maior uso de memória.