복붙노트

[REDIS] Node.js를 가게 레디 스에서 객체

REDIS

Node.js를 가게 레디 스에서 객체

여기에 일이 - 내가 특정 키에 레디 스의 객체 (플래시 소켓 참조)를 기본 JS (Node.js를)을 저장할. 나는 간단한 client.set으로이 작업을 수행 할 때 () 그것은 문자열로 저장합니다. 단지 문자열 - 내가 값을 얻을 때 나는 [개체 개체]를 얻을.

이 작업을 얻을 수있는 가능성은? 여기 내 코드는 :

  addSocket : function(sid, socket) {
    client.set(sid, socket);
  },

  getSocket : function(sid) {
    client.get(sid, function(err, reply) {
      // cant't get an object here. All I get is useless string
    });
  },

해결법

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

    1.Downvoters : 여기 문맥 SET 명령과 임의의 객체를 저장하는 기능입니다.

    Downvoters : 여기 문맥 SET 명령과 임의의 객체를 저장하는 기능입니다.

    아니, 당신은 할 수 없습니다. 당신은 레디 스 문자열 (프로토콜이 결국, 텍스트 기반)와 같은 모든 저장한다는 사실을 받아 들여야한다. 레디 스 약간의 최적화를 수행하고 정수로 어떤 값을 변환,하지만 사업이 아니라 당신입니다 수 있습니다.

    당신은 레디 스에서 임의의 객체를 저장할 경우, 당신이 검색 한 후 저장 및 역 직렬화하기 전에 직렬화 확인하십시오.

    당신이 소켓 객체 그렇게 할 수 있다면, 그래도 모르겠어요. 그들은 단순히 (예를 들어, TCP 소켓) 결국, 시스템 자원 (열려있는 연결)에 대해 설명합니다. 당신은 설명을 직렬화 관리 및 기타 기계가 연결이되지 않습니다, 다른 컴퓨터에 직렬화합니다.

  2. ==============================

    2.소켓이 Object 형이기 때문에, 당신은 저장 및 소켓을 검색 할 때, 필요 개체로 다시 변환하기 전에 객체를 문자열로 변환해야합니다.

    소켓이 Object 형이기 때문에, 당신은 저장 및 소켓을 검색 할 때, 필요 개체로 다시 변환하기 전에 객체를 문자열로 변환해야합니다.

    당신이 사용할 수있는

    JSON.stringify(socket) 
    

    문자열로 변환하고,

    JSON.parse(socketstr) 
    

    객체로 다시 변환합니다.

    편집하다:

    버전 2.0.0의 출시 이후, 우리는 레디 스에 해시 등의 개체를 저장할 수 있습니다.

    client.hmset("hosts", "mjr", "1", "another", "23", "home", "1234");
    
    client.hgetall("hosts", function (err, obj) {
        console.dir(obj);
    });
    

    https://redis.io/commands/hset

    https://github.com/NodeRedis/node_redis

  3. ==============================

    3.공유 데이터 클러스터 인스턴스에서 -이 솔루션은 아래 레디 스를 사용하는 요점가 해결되지 않습니다. 레디 스에서 인스턴스 고유의 ID를 저장하면 시도가 ID를 사용하는 또 다른 인스턴스에 의미가있을 것입니다.

    공유 데이터 클러스터 인스턴스에서 -이 솔루션은 아래 레디 스를 사용하는 요점가 해결되지 않습니다. 레디 스에서 인스턴스 고유의 ID를 저장하면 시도가 ID를 사용하는 또 다른 인스턴스에 의미가있을 것입니다.

    그러나, 객체 호출 할 수있다 "hmset"이며 동일한 키에 별도 레디 스 필드로 각 오브젝트 필드를 설정한다. 그리고 그것은 당신이 hgetall을 부르는 객체로 변환 돌아올 것이다. 불행하게도, 나는 그것이 객체, 그 값으로 저장 될 수있는 단순한 속성 "toString ()"안에 중첩 된 개체 또는 배열을 처리합니다 생각하지 않습니다.

    객체 같은

    client.hmset("myhashkey",{a:1, b:2, c:'xxx'})
    

    좋은 작품과 함께 검색 할 수 있습니다

    client.hmget("myhashkey", function(obj) {
       console.log(obj);
    });
    

    너무 많이하지 않는 :

    client.hmset("myhashkeynested",{a:1, b:2, c:'xxx', d: { d1: 'x', d2: 'y'}});
    
  4. ==============================

    4.나는이 당신이 당신의 프런트 엔드에 API에서 JSON을 채널링 특히, 믿을 수 없을만큼 유용한 도구가 될 것으로 :

    나는이 당신이 당신의 프런트 엔드에 API에서 JSON을 채널링 특히, 믿을 수 없을만큼 유용한 도구가 될 것으로 :

    ので れぢ s 자 j 소니 fy

    당신은 JSON의 거대한 블록을 수신하고 당신이 "[개체 개체]"대신 전체 JSON를 검색 할 수 있도록 저장하는 동안을 stringifying, 특정 해시로 저장 할 수 없습니다.

  5. ==============================

    5.난 당신이 객체를 저장할 때, 내부 스토리지는 Object.toString 전에 ()를 호출하고이 저장되는 값입니다 있다고 생각합니다.

    난 당신이 객체를 저장할 때, 내부 스토리지는 Object.toString 전에 ()를 호출하고이 저장되는 값입니다 있다고 생각합니다.

    ({a: 1}).toString() # "[object Object]"
    

    당신이해야 할 것은 사용 JSON.encode 및 JSON.parse입니다.

    당신은 (숨겨진 진) 참조를 저장할 수 없습니다. 그렇지 않으면, 당신은 정수와 소켓 및 저장 정수와의 대응 관계를 만들 수 있습니다.

  6. ==============================

    6.당신이 그것에 대해 생각 잘하면 자바 스크립트 객체는 값이 다른 객체를 참조 할 수의 열쇠, 소켓 가능성이 네이티브 오브젝트의 경우입니다. 레디 스가 실행 자바 스크립트 외부에있는 경우 그래서 어떻게 그 객체에 대한 참조를 저장할 수 있습니까?

    당신이 그것에 대해 생각 잘하면 자바 스크립트 객체는 값이 다른 객체를 참조 할 수의 열쇠, 소켓 가능성이 네이티브 오브젝트의 경우입니다. 레디 스가 실행 자바 스크립트 외부에있는 경우 그래서 어떻게 그 객체에 대한 참조를 저장할 수 있습니까?

    // a and b exist inside the executing javascript, not in the external O/S
    a = {}
    b = {}
    
    var obj = {
      'one': a,
      'two': b
    }
    
    // how can redis possibly store references to obj, a or b when this application exits?
    redis.set('obj', obj)
    
    // same as..
    redis.set('obj', obj.toString()) /*or*/ redis.set('obj', "" + obj)
    
    // same as..
    redis.set('obj', "[object Object]")
    
    
    // the trick is to stringify the object
    redis.set('obj', JSON.stringify(obj))
    
    // same as..
    redis.set('obj', "{'one':{},'two':{}}")
    
    // here redis does not have to store the actual object references but rather a json string representing the object
    
    // this could also work
    redis.set('obj', "{'one':a,'two':b}")
    
    // where you would then do:
    obj = eval(redis.get('obj')) 
    // provided that a and b have already been initialized
    
  7. ==============================

    7.이 같은 기술을 사용하여 자바 스크립트 객체에 대한 참조를 저장할 수 있습니다. 기본적으로,이 Object.prototype에 (하지 않음) 확장 및 rget와 객체를 다음 rhash {}에 사용자 정의 참조를 추가 검색 () (Radd)에 호출 할 수 있습니다 (). 「참조 "는 레디 스에 잘 맞도록 문자열입니다. 당신이하지 않습니다이 방법은 () / 넣어 데이터베이스의 사본을 얻을 수 .parse .stringify ()하고있다. 노드 닫힌다 아래는 직렬화하지 않는 경우에는, 개체의 데이터가 파괴됩니다.

    이 같은 기술을 사용하여 자바 스크립트 객체에 대한 참조를 저장할 수 있습니다. 기본적으로,이 Object.prototype에 (하지 않음) 확장 및 rget와 객체를 다음 rhash {}에 사용자 정의 참조를 추가 검색 () (Radd)에 호출 할 수 있습니다 (). 「참조 "는 레디 스에 잘 맞도록 문자열입니다. 당신이하지 않습니다이 방법은 () / 넣어 데이터베이스의 사본을 얻을 수 .parse .stringify ()하고있다. 노드 닫힌다 아래는 직렬화하지 않는 경우에는, 개체의 데이터가 파괴됩니다.

    var OBJECT = Object.prototype;
    OBJECT.rhash = {};
    OBJECT.rset = function(id, object) {
      OBJECT.rhash[id] = object;
      return id;
    };
    OBJECT.rget = function(id) {
      return OBJECT.rhash[id];
    };
    
    var dog = {
      name: "Skippy",
      food: "Bacon",
      bark: function() {
        alert(this.name + "!");
      }
    };
    
    var id = OBJECT.rset("a123", dog);
    var ref = OBJECT.rget("a123");
    ref.bark();
    
  8. from https://stackoverflow.com/questions/8694871/node-js-store-objects-in-redis by cc-by-sa and MIT license