Комплексные структуры данных Redis

Предположим, что у меня есть хэш хэша, например.

$data = {
    'harry' : {
         'age' : 25,
         'weight' : 75,
    },
    'sally' : {
        'age' : 25,
        'weight' : 75,
    }
}
  • Каким будет "обычный" способ хранения такой структуры данных (или вы не хотите?)
  • Вы могли бы напрямую получить значение (например, get harry: age?
  • После сохранения вы можете напрямую изменить значение вспомогательного ключа (например, sally: weight = 100)

Ответ 1

Каким будет "обычный" способ хранения такой структуры данных (или вы не?)

Например, harry и sally будут храниться каждый в отдельном хешах, где поля будут представлять их свойства, такие как возраст и вес. Затем структура set будет содержать все члены (harry, sally,...), которые вы сохранили в redis.

Вы могли бы напрямую получить значение (например, get harry: age?)

Да, см. HGET или HMGET или HGETALL.

После сохранения вы можете напрямую изменить значение дополнительного ключа (например, sally: weight = 100)

Да, см. HSET.

Ответ 2

Давайте возьмем сложные данные, которые мы должны сохранить в redis, например, этот:

  $data = { 
            "user:1"  : {
                       name : "sally",
                       password : "123"
                       logs : "25th october" "30th october" "12 sept",
                       friends : "34" , "24", "10"
                   } 
            "user:2"  :{
                       name : ""
                       password : "4567"
                       logs :
                       friends: ""
                   }
          }

Проблема, с которой мы сталкиваемся, заключается в том, что друзья и журналы являются списками. Итак, что мы можем сделать, чтобы представить эти данные в redis, является использование хэшей и перечисляет что-то вроде этого:

Вариант 1. Хэш-карта с ключами как пользователь: 1 и пользователь: 2

      hmset user:1 name "sally" password "12344"
      hmset user:2 name "pally" password "232342"
      create separate list of logs as 
              logs:1 { here 1 is the user id }
              lpush logs:1 "" "" "" 
              lpush logs:2 "" "" ""
      and similarly for friends.

Опция 2: хеш-карта с дефисными данными json в виде кодировки строк

      hmset user:1 name "sally" password "12344" logs "String_dumped_data" friends "string of dumped data"

Опция 3: Это другое представление # 1

      something like user:1:friends -> as a list 
      and            user:2:friends -> as a list 

Пожалуйста, исправьте меня, если я ошибаюсь.

Ответ 3

В зависимости от того, что вы хотите сделать, но если ваша структура данных не является более глубокой и вам нужен доступ к каждому полю, я бы рекомендовал использовать хеши: http://redis.io/commands#hash

Вот хороший обзор по типам redis, каждый из которых имеет pro и contra: http://redis.io/topics/data-types