Este artigo pode fornecer muitas informações aqui:http://redis.io/topics/memory-optimization
Há muitas maneiras de armazenar uma matriz de objetos no Redis (spoiler :eu gosto da opção 1 para a maioria dos casos de uso):
-
Armazene o objeto inteiro como string codificada em JSON em uma única chave e acompanhe todos os objetos usando um conjunto (ou lista, se mais apropriado). Por exemplo:
INCR id:users SET user:{id} '{"name":"Fred","age":25}' SADD users {id}
De um modo geral, este é provavelmente o melhor método na maioria dos casos. Se houver muitos campos no objeto, seus objetos não estão aninhados com outros objetos e você tende a acessar apenas um pequeno subconjunto de campos por vez, talvez seja melhor usar a opção 2.
Vantagens :considerado uma "boa prática". Cada objeto é uma chave Redis completa. A análise de JSON é rápida, especialmente quando você precisa acessar vários campos para este objeto de uma só vez. Desvantagens :mais lento quando você só precisa acessar um único campo.
-
Armazene as propriedades de cada objeto em um hash Redis.
INCR id:users HMSET user:{id} name "Fred" age 25 SADD users {id}
Vantagens :considerado uma "boa prática". Cada objeto é uma chave Redis completa. Não há necessidade de analisar strings JSON. Desvantagens :possivelmente mais lento quando você precisa acessar todos/a maioria dos campos em um objeto. Além disso, objetos aninhados (objetos dentro de objetos) não podem ser armazenados facilmente.
-
Armazene cada objeto como uma string JSON em um hash Redis.
INCR id:users HMSET users {id} '{"name":"Fred","age":25}'
Isso permite que você consolide um pouco e use apenas duas chaves em vez de muitas chaves. A desvantagem óbvia é que você não pode definir o TTL (e outras coisas) em cada objeto de usuário, pois é apenas um campo no hash Redis e não uma chave Redis completa.
Vantagens :A análise de JSON é rápida, especialmente quando você precisa acessar vários campos para este objeto de uma só vez. Menos "poluente" do namespace da chave principal. Desvantagens :Sobre o mesmo uso de memória que #1 quando você tem muitos objetos. Mais lento que #2 quando você só precisa acessar um único campo. Provavelmente não é considerada uma "boa prática".
-
Armazene cada propriedade de cada Objeto em uma chave dedicada.
INCR id:users SET user:{id}:name "Fred" SET user:{id}:age 25 SADD users {id}
De acordo com o artigo acima, esta opção é quase nunca preferencial (a menos que a propriedade do Objeto precise ter TTL específico ou algo assim).
Vantagens :as propriedades do objeto são chaves Redis completas, o que pode não ser um exagero para seu aplicativo. Desvantagens :lento, usa mais memória e não é considerado "prática recomendada". Muita poluição do namespace da chave principal.
Resumo geral
A opção 4 geralmente não é a preferida. As opções 1 e 2 são muito semelhantes, e ambas são bastante comuns. Eu prefiro a opção 1 (de um modo geral) porque ela permite que você armazene objetos mais complicados (com várias camadas de aninhamento, etc.) A opção 3 é usada quando você realmente se importa sobre não poluir o namespace da chave principal (ou seja, você não quer que haja muitas chaves em seu banco de dados e não se importa com coisas como TTL, fragmentação de chave ou qualquer outra coisa).
Se eu tiver algo errado aqui, considere deixar um comentário e permitir que eu revise a resposta antes de votar negativamente. Obrigado! :)