[REDIS] Node.js를 가게 레디 스에서 객체
REDISNode.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.Downvoters : 여기 문맥 SET 명령과 임의의 객체를 저장하는 기능입니다.
Downvoters : 여기 문맥 SET 명령과 임의의 객체를 저장하는 기능입니다.
아니, 당신은 할 수 없습니다. 당신은 레디 스 문자열 (프로토콜이 결국, 텍스트 기반)와 같은 모든 저장한다는 사실을 받아 들여야한다. 레디 스 약간의 최적화를 수행하고 정수로 어떤 값을 변환,하지만 사업이 아니라 당신입니다 수 있습니다.
당신은 레디 스에서 임의의 객체를 저장할 경우, 당신이 검색 한 후 저장 및 역 직렬화하기 전에 직렬화 확인하십시오.
당신이 소켓 객체 그렇게 할 수 있다면, 그래도 모르겠어요. 그들은 단순히 (예를 들어, TCP 소켓) 결국, 시스템 자원 (열려있는 연결)에 대해 설명합니다. 당신은 설명을 직렬화 관리 및 기타 기계가 연결이되지 않습니다, 다른 컴퓨터에 직렬화합니다.
-
==============================
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.공유 데이터 클러스터 인스턴스에서 -이 솔루션은 아래 레디 스를 사용하는 요점가 해결되지 않습니다. 레디 스에서 인스턴스 고유의 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.나는이 당신이 당신의 프런트 엔드에 API에서 JSON을 채널링 특히, 믿을 수 없을만큼 유용한 도구가 될 것으로 :
나는이 당신이 당신의 프런트 엔드에 API에서 JSON을 채널링 특히, 믿을 수 없을만큼 유용한 도구가 될 것으로 :
ので れぢ s 자 j 소니 fy
당신은 JSON의 거대한 블록을 수신하고 당신이 "[개체 개체]"대신 전체 JSON를 검색 할 수 있도록 저장하는 동안을 stringifying, 특정 해시로 저장 할 수 없습니다.
-
==============================
5.난 당신이 객체를 저장할 때, 내부 스토리지는 Object.toString 전에 ()를 호출하고이 저장되는 값입니다 있다고 생각합니다.
난 당신이 객체를 저장할 때, 내부 스토리지는 Object.toString 전에 ()를 호출하고이 저장되는 값입니다 있다고 생각합니다.
({a: 1}).toString() # "[object Object]"
당신이해야 할 것은 사용 JSON.encode 및 JSON.parse입니다.
당신은 (숨겨진 진) 참조를 저장할 수 없습니다. 그렇지 않으면, 당신은 정수와 소켓 및 저장 정수와의 대응 관계를 만들 수 있습니다.
-
==============================
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.이 같은 기술을 사용하여 자바 스크립트 객체에 대한 참조를 저장할 수 있습니다. 기본적으로,이 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();
from https://stackoverflow.com/questions/8694871/node-js-store-objects-in-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 호스트 컴퓨터에서 도커 컨테이너에서 레디 스 실행에 연결 (0) | 2020.01.13 |
---|---|
[REDIS] 레디 스 : dump.rdb 백업 (0) | 2020.01.13 |
[REDIS] 레디 스 데이터베이스에 HSET 및 HMSET 방법의 차이점은 무엇입니까 (0) | 2020.01.13 |
[REDIS] 어떻게 레디 스 지속성 저장소를 수행하는? (0) | 2020.01.13 |
[REDIS] 레디 스에서 매장 IP 범위 (0) | 2020.01.13 |