복붙노트

[REDIS] 어떻게 노드를 사용하여 레디 스에서 이진 객체를 저장?

REDIS

어떻게 노드를 사용하여 레디 스에서 이진 객체를 저장?

나는 레디 스에서 이진 객체를 저장하려고 다음 다시 이미지로 서비스를 제공하고 있습니다.

저는 여기에 데이터를 저장하기 위해 사용하고있는 코드는 다음과 같습니다

var buff=new Buffer(data.data,'base64');
client.set(key,new Buffer(data.data,'base64'));

여기에 데이터를 덤프하는 코드는 다음과 같습니다

client.get(key,function(err,reply){
        var data = reply;
        response.writeHead(200, {"Content-Type": "image/png"});
        response.end(data,'binary');

});

데이터의 처음 몇 바이트가 손상 될 것으로 보인다. 마법의 번호가 올바르지 않습니다.

몇 가지 실험을 했나 :

나는 다음을 수행 할 때

var buff=new Buffer(data.data,'base64');
console.log(buff.toString('binary'));

나는이 얻을 :

0000000 : C289 504E 470D 0a1a 0a00 0000 0d49 4844

나는이 작업을 수행 할 때

 var buff=new Buffer(data.data,'base64');
 console.log(buff);

나는 다음을 얻을 :

버퍼 50 4E 47 0D 0A 0A 1A는 0D 00 00 00 49 48 44 52 00 00 00 89

나는 C2는 어디에서 오는 확실하지 않다

해결법

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

    1.문제는 노드의 레디 스 클라이언트가 기본적으로 자바 스크립트 문자열에 대한 응답을 변환하는 것입니다.

    문제는 노드의 레디 스 클라이언트가 기본적으로 자바 스크립트 문자열에 대한 응답을 변환하는 것입니다.

    나는 클라이언트를 만들 때 true로 return_buffers 옵션을 설정하여이 문제를 해결했다.

    var client = redis.createClient(7000, '127.0.0.1', {'return_buffers': true});
    

    자세한 내용은 여기를 참조하십시오.

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

    2.나는 가게에 이진 문자열을 얻을 방법을 알아낼 수 없습니다.

    나는 가게에 이진 문자열을 얻을 방법을 알아낼 수 없습니다.

    여기 내 해결 방법은 :

    데이터는 base64로 문자열의 데이터는 어디에

    client.set(count,data);
    

    데이터를 제공합니다 :

     client.get(last,function(err,reply){
       var data = reply;
       response.writeHead(200, {"Content-Type": "image/png"});
       var buff=new Buffer(data,'base64');
       response.end(buff);
    });
    

    당신이 때마다 전환 할 필요가 있기 때문에이 적합하지 않습니다, 그러나 그것은 작동하는 것.

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

    3.당신은 다음 문자열로 다른 버퍼를 변환하는 뭔가를해야 할 것이다 것 순수한 버퍼 데이터를 사용하지 않을 때 return_buffers의 문제이다. detect_buffers이 옵션이 될 수 있지만 너무 신뢰할 수없는 것입니다.

    당신은 다음 문자열로 다른 버퍼를 변환하는 뭔가를해야 할 것이다 것 순수한 버퍼 데이터를 사용하지 않을 때 return_buffers의 문제이다. detect_buffers이 옵션이 될 수 있지만 너무 신뢰할 수없는 것입니다.

    당신은 여분의 컴퓨팅주기를 괜찮다면. 당신은 또한 시도 할 수 있습니다 :

    // convert your buffer to hex string
    client.set(key, mybuffer.toString('hex'));
    // create a new buffer from hex string
    client.get(key, function (err, val) {
       var bin = new Buffer(val, 'hex');
    });
    
  4. ==============================

    4.무엇 나를 위해 일한 것은 버퍼 인 경우 data.toString ( '진')를 사용하는 것입니다. 또한 UTF-8로 재 해석하지 않도록주의뿐만 아니라 이진.

    무엇 나를 위해 일한 것은 버퍼 인 경우 data.toString ( '진')를 사용하는 것입니다. 또한 UTF-8로 재 해석하지 않도록주의뿐만 아니라 이진.

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

    5.나는 매우 (에 관계없이 언어 프로그래밍)이 길을 가기 전에 읽어 보시기 바랍니다이 일의 의미를 설명하는 주제에이 기사를 발견했다.

    나는 매우 (에 관계없이 언어 프로그래밍)이 길을 가기 전에 읽어 보시기 바랍니다이 일의 의미를 설명하는 주제에이 기사를 발견했다.

    http://qnimate.com/storing-binary-data-in-redis/

    레디 스는 메모리 키 / 값 저장소이기 때문에 요약하면, 당신은 당신이 신속하게 사용할 수있는 메모리를 사용하고 레디 스 인스턴스의 성능이 저하됩니다 같은 레디 스 내부 이미지와 같은 잠재적으로 큰 값을 저장하지하는 것이 현명 할 것이다. 레디 스에서 파일이 아닌 파일 자체의 위치를 ​​저장하는 것이 좋습니다.

  6. from https://stackoverflow.com/questions/20732332/how-to-store-a-binary-object-in-redis-using-node by cc-by-sa and MIT license