Complex data structures Redis

Redis

Redis Problem Overview


Lets say I have a hash of a hash e.g.

$data = {
    'harry' : {
	     'age' : 25,
         'weight' : 75,
    },
    'sally' : {
        'age' : 25,
        'weight' : 75,
    }
}
  1. What would the 'usual' way to store such a data structure (or would you not?)
  2. Would you be able to directly get a value (e.g. get harry : age ?
  3. Once stored could you directly change the value of a sub key (e.g. sally : weight = 100)

Redis Solutions


Solution 1 - Redis

> What would the 'usual' way to store such a data structure (or would > you not?)

For example harry and sally would be stored each in separate hashes where fields would represent their properties like age and weight. Then set structure would hold all the members (harry, sally, ...) which you have stored in redis.

> Would you be able to directly get a value (e.g. get harry : age ?)

Yes, see HGET or HMGET or HGETALL.

> Once stored could you directly change the value of a sub key (e.g. > sally : weight = 100)

Yes, see HSET.

Solution 2 - Redis

Lets take a complex data that we have to store in redis , for example this one:

  $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: ""
                   }
          }

The problem that we face is that the friends & logs are lists. So what we can do to represent this data in redis is use hashes and lists something like this :

Option 1. A hash map with keys as user:1 and user: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.

Option 2: A hash map with dumped json data as string encode

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

Option 3: This is another representation of #1

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

Please , correct me if i m wrong.

Solution 3 - Redis

Depends on what you want to do, but if your datastructure is not deeper nested and you need access to each field, I would recommend using hashes: http://redis.io/commands#hash

Here is a good overview over the redis datatypes, each with pro and contra: http://redis.io/topics/data-types

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionXrenderView Question on Stackoverflow
Solution 1 - Redisyojimbo87View Answer on Stackoverflow
Solution 2 - RedismareenatorView Answer on Stackoverflow
Solution 3 - RedisMaxView Answer on Stackoverflow