복붙노트

[REDIS] 레디 스에서 중첩 된 자바 스크립트 객체를 저장 - NodeJS를

REDIS

레디 스에서 중첩 된 자바 스크립트 객체를 저장 - NodeJS를

나는 최근에 nodejs에서 레디 스에 memcached를로 전환. 노드에 memcached에 좋아 일이 내가 메모리에 전체 자바 스크립트 객체를 저장할 수 있었다. 슬프게도 나는 레디 스에서이 작업을 수행 할 수 없었다. 예를 들어, 나는 다음과 같은 목적을 가지고 :

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
        }
    }
}

3 - 에덴 / 노드 memcached를 함께 난 그냥 할 수 :

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

그리고

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

그리고 객체 I, 그것은 단지 길을 저장할 수 있습니다.

레디 스에 대한 문제는이 같은 개체를 저장하는 경우이다 :

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

내가 가진 값을 얻을 때

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

출력은 [개체 개체 함유하는 막 문자열이다.

내가 레디 스를 이해 그래 텍스트 기반 프로토콜이며)는 obj.toString을 (수행하려고하지만, 그렇지 않은 객체와 레디 스의 memcached를 돌봐 보인다. 난 그냥 할 수 있다고 생각 :

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

JSON를 OBJ> 문자열 병목한다면 미친 높은 I가있을 것이기 때문에 이것은 좋은 것입니다하지만 만약 내가하지 확신 / O와 잘 모르겠어요 (10,000 + 요청 / 초).

Memcached가와 레디 스 모두 문자열로 데이터를 저장하지만, 레디 스가 내장되어 않는 기능 객체를 변환?

해결법

  1. ==============================

    1.우선 레디 스의 다음과 같은 데이터 유형을 지원합니다 :

    우선 레디 스의 다음과 같은 데이터 유형을 지원합니다 :

    당신은 레디 스 및 memcached를 모두 문자열로 개체를 저장해야합니다.

    노드는 memcached를 파싱 / 자동 데이터 stringifies. 그러나 노드 레디 스하지 않습니다.

    그러나, 당신은 당신의 응용 프로그램에 대한 자신의 직렬화 / 역 직렬화 기능을 구현할 수 있습니다.

    다음과 같은 방법으로 노드-memcached를 stringifies 객체는 다음과 같습니다

    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);
    }
    

    또한 검색된 텍스트이 방법을 구문 분석 :

    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;
    }
    
  2. from https://stackoverflow.com/questions/18942089/storing-nested-javascript-objects-in-redis-nodejs by cc-by-sa and MIT license