ども、cloudpackかっぱ (@inokara) です。

はじめに

前の記事で Redis に断続的にアクセスさせたいなとシェルスクリプトで頑張っていたけどせっかくなので Go から Redis を扱ってみようってことで試してみました。

参考

れりごー、れりごー、Redigo

以下のようにRedigoは Redis のドキュメントにも Recommend の星印も付いていることですし…
Go から Redis をちょっと扱うメモ: Redigoを試す

穴と雪のなんとかっぽいのでRedigoでレリゴーしてみたいと思います。

基本的なれりごー

れりごー、れりごー、Redigo は以下のように Redis に繋ぐところから始めます。

c, err := redis.Dial("tcp", ":6379")
if err != nil {
    // handle error
}
defer c.Close()

繋ぐことができたら Do を利用して Redis のコマンドSETGET 等)を以下のように書くことで Redis にアクセスしてデータの書き込み等を行うようです。

Do(commandName string, args ...interface{}) (reply interface{}, err error)

commandNameSET とか GET とか入れますねん。

接続して set して get で少しも寒くないわ

このままじゃだめなんで

レリゴパッケージを導入していきます。(※既に $GOPATH は設定済みという状態です。)

go get github.com/garyburd/redigo/redis

インストールが完了したら以下のように確認します。

# go list
_/path/to/redis-go
# go test github.com/garyburd/redigo/redis
ok      github.com/garyburd/redigo/redis        1.277s

ありのままで

Exampleを参考に以下のような感じで簡単に書けました。

package main

import (
        "fmt"
        "os"
        "flag"
        "github.com/garyburd/redigo/redis"
)

func main() {
        var h = flag.String("hostname", "127.0.0.1", "Set Hostname")
        var p = flag.String("port", "6379", "Set Port")
        var key = flag.String("key", "foo", "Set Key")
        var val = flag.String("value", "bar", "Set Value")
        flag.Parse()

        c, err := redis.Dial("tcp", *h + ":" + *p)

        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }

        // Connection Close
        defer c.Close()

        c.Do("SET", *key, *val)
        s, err := redis.String(c.Do("GET", *key))
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        fmt.Printf("%#vn", s)
}

せっかくなんで引数に Redis のホスト名とかポート番号を渡せるようにもしてます。あと、キーとバリューも。

れりごー、れりごー、Redigo

ということで、ソースコードをビルドして試してみます。

go build redis-client.go

まずはヘルプを確認。

# ./redis-client -h
Usage of ./redis-client:
  -hostname="127.0.0.1": Set Hostname
  -key="foo": Set Key
  -port="6379": Set Port
  -value="bar": Set Value

既に Redis が起動している状態で以下のように実行します。

# ./redis-client
"bar"

おお、値が取得出来ましたな。
ちょっとポート番号とかを弄ってみましょう。

# ./redis-client -port=16379 -key=$RANDOM -value=$RANDOM
"12516"
# ./redis-client -port=16379 -key=$RANDOM -value=$RANDOM
"25130"
# ./redis-client -port=16379 -key=$RANDOM -value=$RANDOM
"24459"

キー、バリューもランダムな値で試してみてます。

これでいいの…

当初は以下のようなシェルスクリプトで SET と GET を繰り返していましたが、これでいいの…少しは(スクリプトの)行が減るわ(少しも寒くないわ)。

#!/usr/bin/env bash
while true
do
  KEY=$RANDOM
  VAL=$RANDOM
  echo "set $KEY $VAL" | nc 127.0.0.1 16379
  echo "get $KEY" | nc 127.0.0.1 16379
done

元記事はこちらです。
Go から Redis をちょっと扱うメモ(Redigo、 レディゴー、レリゴー)