redis newbie - como criar hash dentro de um hash?

12

Eu quero criar esse tipo de estrutura em redis: (são basicamente dados json)

{
    "id": "0001",
    "name":"widget ABC",
    "model": "model123",
    "service":"standard",
    "admin_password": 82616416,
    "r1":
        {
            "extid":"50000",
            "password":"test123",
        },
    "r2":
        {
            "ext":"30000",
            "password":"test123",
        },
}

O que eu tentei até agora:

Eu tentei criar um hash sem os hashes "sub", apenas para garantir que eu tenha o básico. Então, aqui está o que eu comecei com o redis-cli:

HMSET widget:1 id 0001 name 'widget ABC' model 'model123' service standard admin_password 82616416
HMSET widget:2 id 0002 name 'widget ABC' model 'model123' service standard admin_password 12341234

Isso parece funcionar. Percebo que tenho 2 "registros" de dados do widget em uma coleção de widgets.

Mas minha tentativa de criar um registro com os dados r1 falha.

Isto é o que eu tentei:

HMSET widget:3 id 0002 name 'widget ABC' model 'model123' service standard admin_password 12341234 r1{extid 50000} 

Isso cria uma chave de hash "r1 {extid" com um valor de hash de "50000}"

Todas as sugestões serão apreciadas. Eu acho que meu problema é minha linguagem. Só não sei o suficiente sobre a sintaxe redis para saber quais palavras usar na minha pesquisa no google.

Talvez eu apenas precise "achatar" os dados assim:

HMSET widget:3 id 0002 name 'widget ABC' model 'model123' service standard admin_password 12341234 r1_extid 50000 r1_password test123 r2_extid 30000 r2_password test123

Obrigado.

Happydevdays
fonte

Respostas:

14

O Redis não suporta estruturas de dados aninhadas e, especificamente, não suporta um Hash dentro de um Hash :) Você basicamente pode escolher entre duas opções: serializar o Hash interno e armazená-lo em um campo Hash ou usar outra chave Hash e apenas mantenha uma referência a ele em um campo do Hash externo.

Itamar Haber
fonte
1

Eu sugiro ReJSON . Ele foi criado para lidar com esses problemas exatamente.

Você pode usar a notação de caminho para acessar elementos aninhados.

Cihan B.
fonte