2016-08-20 10 views
0

"RPUSH"명령을 사용하여 내 개체를 내 붉게 만듭니다.redigo and gob 고브 데이터 조각을 검색하는 방법

// object is of type interface 

var network bytes.Buffer 
gob.NewEncoder(&network) 
enc.Encode(object /* interface{} */) 

redis.String(d.Conn.Do("RPUSH", "objects", network.String())) 

Redigo 내가 예상 한대로, 모든 데이터 구조를 gob로 인코딩했습니다.

이제 내가 그들을 retreive하기 위해 노력하고있어 :

sall, _ := redis.Strings(d.Conn.Do("LRANGE", "todos", "0", "-1")) 
fmt.Printf("%T", sall) // type []string as expected 

// At this point, I have no idea if I should store the data in a buffer, or convert it directly as bytes. actually, here I'm lost 
var network bytes.Buffer 
var object []interface{} 


dec := gob.NewDecoder(network) 
err := dec.Decode(inout) 
fmt.Printf("%v", err) // decode error:EOF 

그들을 GOB-decod하는 가장 좋은 방법은 무엇입니까? 인터페이스 {}의 조각으로 다시 가져오고 싶습니다. 하지만 내 물건이 고블라 데이터로 인코딩 되더라도. 그들은 redis 방법으로 밀려 나고, 그래서 그것은 멍청한 관점에서 슬라이스로 간주 될 수 있습니까?

다른 목록을 반복하여 하나씩 디코딩 할 수 있습니다. 그러나 효율성에 대한 확신이 없습니다. 나는 홉이 그 방식으로 인코딩 된 슬라이스 구조를 원한다고 가정하고있다. 그래서 내 질문은 : 데이터 구조의 컬렉션으로 멍청이 데이터의 조각을 효율적으로 해독하기 위해 속임수가 있나요? 또는 다른 방법으로 데이터 구조를 저장해야합니까? (RPUSH로 내 데이터를 저장하면 무차별 조작을 방지 할 수 있다고 가정합니다)

답변

1

LRANGE 명령은 목록을 반환합니다. 해당 목록을 [] [] 바이트로 가져 오려면 redis.ByteSlices을 사용하십시오. 목록의 각 수병을 디코딩 :

items, err := redis.ByteSlices(d.Conn.Do("LRANGE", "objects", "0", "-1")) 
if err != nil { 
    // handle error 
} 
var values []*Object 
for _, item := range items { 
    var v Object 
    if err := gob.NewDecoder(bytes.NewReader(item)).Decode(&v); err != nil { 
     // handle error 
    } 
    values = append(values, &v) 
} 

이 새로운 gob.Encoder가 목록에 밀려 각 값에 대해 생성 된 것으로 가정합니다.

응용 프로그램이 다음 인코딩을 전체 목록을 GOB, 레디 스에서 독립적으로 목록 항목에 액세스하고 대량 문자열로 저장하지 않는 경우

var values []*Object 
var buf bytes.Buffer 
if err := gob.NewEncoder(&buf).Encode(values); err != nil { 
    // handle error 
} 
if _, err := d.Conn.Do("SET", "objects", buf.Bytes()); err != nil { 
    // handler error 
} 
다음

을 디코딩하는 방법은 다음과 같습니다

items, err := redis.Bytes(d.Conn.Do("GET", "objects")) 
if err != nil { 
    // handle error 
} 
var values []*Objects 
if err := gob.NewDecoder(items).Decode(&values); err != nil { 
    // handle error 
} 

다음은이 코드 라인에 대한 질문입니다.

redis.String(d.Conn.Do("RPUSH", "objects", network.String())) 

네트워크를 사용하십시오. 문자열 할당을 피하기위한 바이트(). redis.Int를 사용하여 RPUSH의 정수 반환 값을 디코딩합니다. 목록에서 반환 된 요소의 수를 걱정하지 않는 경우 다 쓰고

n, err := redis.Int(d.Conn.Do("RPUSH", "objects", network.Bytes())) 

나 : 내가 기대 정확히 무엇 이었는가 그,

_, err := d.Conn.Do("RPUSH", "objects", network.Bytes()) 
+0

당신을 감사로 코드를 작성합니다. –