Go言語で構築したサーバで複数台の構成にして、
ロードバランサで負荷分散しなければならない状況になりそうだ。
複数台にした時に問題になるのが、
複数サーバ間でセッションのような値を共有したいという問題が発生する。
どうにかできないかと検討してみたところ、
KVS(Key-Valueストア)のRedisであればできそうだ
ということを思い出し、
Go言語でRedisの使い方を調べることにした。
早速、Redisのインストールからはじめてみる。
環境
Lenovo Ideapad 720S プラチナ
CPU : AMD Ryzen 5 2500U APU ( 2.00GHz 2MB )
OS : Ubuntu 18.04
メモリ : 8.0GB PC4-17000 DDR4 (オンボード) 2133MHz
グラフィック : APU内蔵グラフィックス
Go言語:1.11 linux/amd64
Redisのインストール
$ sudo add-apt-repository ppa:chris-lea/redis-server $ sudo apt-get install redis-server # サーバの起動時にRedisサーバを起動する設定を追加 $ sudo sysv-rc-conf redis-server on # Redisサーバを起動する $ sudo /etc/init.d/redis-server start #Redisサーバのインストールが無事終了したか?を調べる $ redis-server -v Redis server v=5.0.0 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=12e155be0a2852d9
Redisサーバのインストールができたことが確認できたら、
次はGo言語でRedisを使用できるようにする。
Go言語でRedisを使う為にRedigoパッケージを利用する。
GitHub - gomodule/redigo: Go client for Redis
下記のコマンドを実行
go get github.com/garyburd/redigo/redis
準備が整ったので早速Go言語でRedisを使ってみる。
package main import ( "fmt" "log" "github.com/garyburd/redigo/redis" ) func main() { ip := "127.0.0.1" port := "6379" // redis-serverに接続する conn, err := redis.Dial("tcp", ip+":"+port) if err != nil { log.Fatal("error") } //keyをhogeにして、hugaという値をセットする conn.Do("SET", "hoge", "huga") //key「hoge」にセットされた値を取得する v, err := redis.String(conn.Do("GET", "hoge")) if err != nil { log.Fatal("error") } //hugaと出力された fmt.Println(v) //key「hoge」にセットされた値を削除する conn.Do("DEL", "hoge") //再びkey「hoge」の値を取得してみる v, err = redis.String(conn.Do("GET", "hoge")) if err != nil { log.Fatal("error") } //ここまでコードが到達しない fmt.Println(v) }
Redisサーバに接続する個所あたりは省略して、
実際の値の出し入れを見てみると、
conn.Do("コマンド", "キー", "バリュー")のように使用し、
コマンドはRedisで用意されているものをそのまま利用することが出来る。
※GET、SET、DEL等
一点注意が、
DELで削除した値を再びDoメソッドで取得すると、
Redisでは<nil>が返ってくるところ、
Go言語ではerrに何らかの値が返ってくる。
とりあえず、
これで複数サーバ間のデータのやりとりは間にRedisサーバを用意すれば対処出来ることがわかった。