Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Storing nested javascript objects in redis - NodeJS

I recently switched from memcached to redis in nodejs. The thing I liked in node-memcached was that I can save the whole javascript object in the memory. Sadly I couldn't do this in redis. For example, I got the following object:

var obj = {
    name: "Hello world!",
    author: "admin",
    user: {
        "yolololo" : {
             "id": "352asdsafaseww",
             "server": 5,
             "data" : {
                  x: 1, 
                  y: 1,
                  z: 50
             }
        },
        "yolol" : {
             "id": "358dsa",
             "server": 7
        }
    }
}

with the 3rd-Eden/node-memcached I could just do:

memcached.set("obj", obj, 12345, function(err) { });

and then

memcached.get("obj", function(err, data) {
    console.log(data);
});

And I'll get the object I saved, just the way it is.

The problem with redis is that if I save the object like this:

redisclient.set("obj", obj, redis.print);

When I get the value with

redisclient.get("obj", function(err, data) {
    console.log(data);
});

The output is just string containing [object Object].

Yeah I understand redis is text-based protocol and it's trying to do obj.toString(), but seems memcached take care of objects and redis don't. I thought I could just do:

redisClient.set("obj", JSON.stringify(obj));

but I'm not sure if this will be good, because there will be insane high I/O and I'm not sure if the JSON obj->string will be bottleneck ( 10k+ request/second ).

Both Memcached and Redis store the data as string, but does redis have built-in feature for converting objects?

like image 690
Deepsy Avatar asked Sep 22 '13 09:09

Deepsy


People also ask

Can Redis store nested objects?

Storing the object in two hash tables. Since hash tables in Redis can not be nested (a.k.a. need to be “flat”), you have to use two hash tables in order to store the house-object. Suppose we have a nested object “roof”, we would store the roof-object in a separate hash table.

Can we store objects in Redis?

Object Storing Procedure. In the Redis, Everything can be stored as only key-value pair format. Key must be unique and storing an object in a string format is not a good practice anyway. Objects are usually stored in a binary array format in the databases.

Can you nest objects in JavaScript?

The basic definition of an object in JavaScript is a container for named values called properties (keys). Sometimes, we need to create an object inside another object. In this case, it's called a nested object.

How does Redis integrate with node js?

Create new session. js file in the root directory with the following content: const express = require('express'); const session = require('express-session'); const redis = require('redis'); const client = redis. createClient(); const redisStore = require('connect-redis')(session); const app = express(); app.


1 Answers

First of all redis only supports the following data types:

  1. String
  2. List
  3. Set
  4. Hash
  5. Sorted set

You'll need to store objects as string in both redis and memcached.

node-memcached parses/stringifies the data automatically. But node-redis doesn't.

However, you can implement your own serialization/deserialization functions for your app.

The way node-memcached stringifies an object is as follows:

if (Buffer.isBuffer(value)) {
    flag = FLAG_BINARY;
    value = value.toString('binary');
} else if (valuetype === 'number') {
    flag = FLAG_NUMERIC;
    value = value.toString();
} else if (valuetype !== 'string') {
    flag = FLAG_JSON;
    value = JSON.stringify(value);
}

It also parses the retrieved text this way:

switch (flag) {
    case FLAG_JSON:
        dataSet = JSON.parse(dataSet);
        break;
    case FLAG_NUMERIC:
        dataSet = +dataSet;
        break;
    case FLAG_BINARY:
        tmp = new Buffer(dataSet.length);
        tmp.write(dataSet, 0, 'binary');
        dataSet = tmp;
        break;
}
like image 101
fardjad Avatar answered Oct 21 '22 02:10

fardjad