Convenções de nomeação de chaves Redis?

226

Qual é a convenção de nomenclatura normal para chaves em redis? Vi valores separados por, :mas não sei ao certo qual é a convenção normal ou por quê.

Para um usuário, você faria algo como ...

user:00

se o ID do usuário fosse 00

Você pode consultar apenas o começo da chave para retornar todos os usuários?

Espero principalmente evitar problemas futuros pesquisando as maneiras que funcionam para as pessoas e por que elas as escolheram.

chique
fonte

Respostas:

205

Qual é a convenção de nomenclatura normal para chaves em redis? Vi valores separados por: mas não sei ao certo qual é a convenção normal ou por quê.

Sim, o sinal de dois pontos :é uma convenção ao nomear chaves. Em este tutorial sobre Redis website é afirmado: Tente ficar com um esquema. Por exemplo, "tipo de objeto: id: campo" pode ser uma boa ideia, como em "usuário: 1000: senha". Eu gosto de usar pontos para campos com várias palavras, como em "comment: 1234: reply.to".

Você pode consultar apenas o começo da chave para retornar todos os usuários?

Se você quer dizer algo como consultar diretamente todas as chaves que começa com, user:existe um comando de chaves para isso. No entanto, este comando deve ser usado apenas para fins de depuração, pois é O (N) porque está pesquisando todas as chaves digitadas no banco de dados.

A solução mais apropriada para esse problema é criar uma chave dedicada, vamos nomear users, que armazenará todas as chaves dos usuários, por exemplo, na lista ou na estrutura de dados do conjunto .

yojimbo87
fonte
1
scannão é a opção @EranH., é a melhor prática para iterar chaves. scané usado para iterar incrementalmente uma coleção de elementos.
Kishor Pawar
2
@ yojimbo87 Portanto, haverá dois comandos, digamos que primeiro é criar chave como - usuário: 808021: password = XYZ e o segundo é colocar a chave no registro ou índice (conjunto), mas o que acontecerá quando um comando for executado com êxito e outro obtém falha significa que as chaves foram criadas, mas não obtêm entrada no registro.
LoveToCode
1
@LoveToCode Você pode usar a transação que deve garantir que todas ou nenhuma das operações seja executada.
precisa saber é o seguinte
2
Notei também que Redis Desktop Manager (uma ferramenta cliente Redis) também trata de cólon ':' como separador, e exibe várias chaves agrupados
Adam Rotaru
1
Sou da opinião de que o valor único será o último. Torna mais fácil fazer algo como:$redis->delete($redis->keys('user:password:*'));
Crayons
26

Usamos dois pontos (:) como separador de namespace e um hash (#) para partes de chaves de identificação, por exemplo:

logistics:building#23
The Nail
fonte
Qual é a melhor convenção de nomes se você tiver mais chaves como localidade, categoria etc.? {resource}: {key} # {value}, {key} # {value} => textos: local #, categoria # 15? Ou você tem alguma outra sugestão?
fsasvari 12/09
1
No meu exemplo, "construção" é apenas o nome da "coleção" e 23 é o "ID" personalizado. Se você tiver um ID composto com locale = en e categoria = 15, o ID real poderá ser {en, 15}; portanto, espaço para nome: textos # {en, 15} ou para ser mais detalhado: espaço para nome: texto # {locale = pt-br, categoria = 15}. Mas isso é apenas uma ideia, nunca a usei assim. Cuidado para não alterar a ordem dos elementos id, porque a chave não será encontrada, é claro. Na verdade, em vez de codificar essa complexidade em seus nomes de chave, considere usar estruturas de dados redis. Dê uma olhada no redis.io/topics/indexes
The Nail
16

Uma convenção parece ser dois pontos (:), mas eu sou desenvolvedor web, então eu pessoalmente prefiro a barra (/) para o separador. O Slash já é um separador tão importante nos URLs, que devem ser Localizadores Uniformes de Recursos, para que sejam chaves de recursos. Por que adotar uma abordagem diferente com dois pontos (:)? Isso ajuda alguma coisa?

Considere este exemplo:

Temos uma API RESTful para objetos de brinquedo. Existe um:

http://example.com/api/toy/234 

Onde nós o armazenamos? Usamos Redis e barras para que a chave seja óbvia:

toy/234

Esta é a chave exclusiva para o brinquedo. A chave agora pode ser usada também no lado do cliente:

{
    key: "toy/234",
    color: "red",
    url: function () {
        return API_BASE_URL + this.key;
    }
}

Um usuário solicita um objeto com chave toy/666. Como obtê-lo de Redis? Um exemplo relacionado ao Node.js.

redis.get(key, function reply_callback(error, toystring) {
    var toy = JSON.parse(toystring);
    ...
}

Não há necessidade de converter barras em dois pontos e vice-versa. Conveniente, você não acha?

Nota: sempre assegure-se de que o usuário possa acessar apenas o que você pretendia. A abordagem bruta de URL para chave acima também pode ser buscada user/1/password, conforme observado pelos comentaristas. Isso não deve ser um problema se você usar o Redis como um cache público somente leitura.

Akseli Palén
fonte
24
... conveniente e quase nojento inseguro. Você está implorando para obter curl http://example.com/api/user/1/password, ou similar. (Apenas dizendo.)
ELLIOTTCABLE
3
Cólons, guisados e barras pode ser usado para designar os diferentes níveis de assentamento, por exemploUser#23:uploads:my/path/to/file.ext
encarnado
31
Por favor, nunca tome a entrada do usuário como uma chave no banco de dados.
Lyle
1
Gosto de como você achou que preferia barras porque é desenvolvedor web.
Hector Ordonez
@ELLIOTTCABLE Obrigado, observação adicional sobre as inseguranças. Você vê algum problema nessa abordagem se o Redis for usado como cache público somente leitura?
Akseli Palén 12/0418
6

Ainda não sei se ainda existem "práticas recomendadas" generalizadas para a nomeação de chaves Redis.

Eu experimentei usar caracteres ASCII NUL como meus separadores (já que Redis e Python são ambos limpos em 8 bits). Parece um pouco feio se você estiver vendo chaves não processadas, mas a idéia é escondê-la atrás de uma camada de abstração. Os símbolos de dois pontos e de tubulação são alternativas óbvias, desde que os componentes do seu espaço para nome tenham a garantia de não usá-los ou você queira codificar cada componente conforme necessário. No entanto, se você os codificasse, desejaria desenvolver a camada de abstração e evitar a visualização de chaves brutas de qualquer maneira ... o que me levou a voltar a usar apenas 0 no meu raciocínio.

Serei interessante em ver se há outras opiniões articuladas sobre isso.

Jim Dennis
fonte
0

Para seu caso, parece-me que o HSET / HGET seria um ajuste melhor. Há também o comando HKEYS .

Todos esses comandos têm a mesma complexidade que GET / SET / KEYS, então por que não usá-los?

Você poderia ter essa estrutura então:

  • usuários> 00> valor
  • usuários> 01> valor

ou:

  • usuários: nome de usuário> 00> valor
  • usuários: nome de usuário> 01> valor

Apenas extraia o ID do usuário e use-o como uma chave de hash. Pessoalmente, prefiro essa abordagem, pois ela é mais agradável e também é possível consultar facilmente os IDs de usuário existentes.

vitro
fonte