Go言語で構築したサーバで複数台の構成にして、

ロードバランサで負荷分散しなければならない状況になりそうだ。


複数台にした時に問題になるのが、

複数サーバ間でセッションのような値を共有したいという問題が発生する。


どうにかできないかと検討してみたところ、


redis_logo

https://redis.io/


KVS(Key-Valueストア)のRedisであればできそうだ

ということを思い出し、

NoSQL - Wikipedia


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サーバを用意すれば対処出来ることがわかった。