Golangで、MessagePackを使い、Redisに書き込み/読み込みをする


下記の書籍の4章のsprinkleを写経中に思い付いたので、やってみた。
「Go言語によるWebアプリケーション開発」
http://www.amazon.co.jp/exec/obidos/ASIN/4873117526/noimpslmtbrk-22/

ライブラリ選定基準は、スターの数やQiitaの記事を参考に選んだ。

Redisへの接続ライブラリはRedigoを使用。
https://github.com/garyburd/redigo

MessagePackのEncode/Decodeライブラリはugorji/goを使用。
https://github.com/ugorji/go

MsgPackToRedis.go
package main

import (
    "github.com/ugorji/go/codec"
    "log"
    "github.com/garyburd/redigo/redis"
    "os"
)

type OtherWord struct {
    Word []string
}

const otherWord = "*"

var transforms = []string{
    otherWord,
    otherWord,
    otherWord,
    otherWord,
    otherWord + "app",
    otherWord + "site",
    otherWord + "time",
    "get" + otherWord,
    "go" + otherWord,
    "lets" + otherWord,
}

//msgpack専用のBundle
var (
    mh codec.MsgpackHandle
)
const message = "length of %#v as MessagePack: %d\n%v"
func main() {
    otherWord := OtherWord{
        Word:transforms,
    }

    writeRedisForUseMsgPack("otherWords", messagePackEncoding(otherWord))

    value := readRedisForUseMsgPack("otherWords")

    messagePackDecoding(value)
}

func messagePackEncoding(otherWord OtherWord) []byte {
    //Encodingされる中身を受け取るbyte[]のスライス
    buf := make([]byte, 0, 64)
    //messagePack専用のBundleを使用してEncoderの準備をして、Encodeする。
    err := codec.NewEncoderBytes(&buf, &mh).Encode(otherWord)
    if err != nil {
        log.Printf("error encoding %v to MessagePack: %v", otherWord, err)
    }
    log.Printf(message, otherWord, len(buf), buf)
    return buf;
}

func messagePackDecoding(buf []byte) OtherWord {
    //Encodingされる中身を受け取るOtherWord構造体型の変数
    var otherWord OtherWord
    //messagePack専用のBundleを使用してDecoderの準備をして、Decodeする。
    err := codec.NewDecoderBytes(buf, &mh).Decode(&otherWord)
    if err != nil {
        log.Printf("error decoding %v to MessagePack: %v", buf, err)
    }
    log.Printf(message, otherWord, len(buf), buf)
    return otherWord;
}

func writeRedisForUseMsgPack(key string, buf []byte) {
    con, err := redis.Dial("tcp", ":6379")
    if err != nil {
        log.Println(err)
        os.Exit(1)
    }
    defer con.Close()

    con.Do("SET", key, buf)
}

func readRedisForUseMsgPack(key string) []byte {
    con, err := redis.Dial("tcp", ":6379")
    if err != nil {
        log.Println(err)
        os.Exit(1)
    }
    defer con.Close()

    buf, err := redis.Bytes(con.Do("GET", key))
    if err != nil {
        log.Println(err)
        os.Exit(1)
    }
    return buf;
}