You are currently viewing GoからMemcachedを利用してみる

GoからMemcachedを利用してみる

Memcachedはキーバリュー型のデータストアです。
よく利用するデータをDBではなくMemcachedに保存しておくことで、パフォーマンス改善が望めます。

前職では商品データや(よく利用される)検索結果のデータをMemcachedに入れることでサイトのパフォーマンス向上を行っていました。

ローカル環境にMemcachedを準備する

Dockerを利用すれば簡単に環境を準備できます。
docker-composeのサンプルは以下になります。

version: "3"

services:
  memcached:
    image: memcached:latest
    ports:
      - "11211:11211"

Goから利用してみる

Goから利用するサンプルは以下の通りです

package main

import (
	"encoding/json"

	"github.com/bradfitz/gomemcache/memcache"
)

type Memcache_data struct {
	Name string `json:"name"`
	Tel  string `json:"tel"`
}

func main() {

	mc := memcache.New("127.0.0.1:11211")

	data := Memcache_data{
		Name: "foo bar",
		Tel:  "09011112222",
	}

	// memcachedにデータをセット
	jsonData, err := json.Marshal(data)
	if err != nil {
		panic(err)
	}
	mc.Set(&memcache.Item{Key: "key", Value: []byte(jsonData)})

	// memcachedからデモを取像
	retVal, err := mc.Get("key")
	if err != nil {
		panic(err)
	}

	// jsonから構造体へ
	var retValJson Memcache_data
	json.Unmarshal(retVal.Value, &retValJson)

	println(retValJson.Name)
	println(retValJson.Tel)
}

Memcachedのパッケージがインポートできない場合、「go mod tidy」でパッケージをダウンロードしてください。

プロダクト開発では構造体を利用することが多い(と思う)ので、サンプルでは構造体をMemcachedに保存するようにしました。
構造体をそのままMemcachedに保存することはできないため、一旦Json文字列に変換した後Memcachedに保存しています。

実行結果は以下のとおりです。

構造体に設定した名前と電話番号が復元できたことが確認できました。

終わりに

キャッシュといえばRedisに世代交代するのかなと思っていたのですが、AWSやGCPにもmemcachedを利用したサービスが準備されていたりと、まだまだキャッシュシステムとしてはMemcachedは現役で利用されていますね。
利用方法もシンプルなので、気軽に利用できるのも良いかと思います。

参考サイト

https://kirinblog.net/docker%e5%82%99%e5%bf%98%e9%8c%b2php7-apache-memcache-mysql%e3%81%ae%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97%e3%81%be%e3%81%a8%e3%82%81/

https://qiita.com/masahikoofjoyto/items/a62a1c2b6c4affca772f

参考図書

コメントを残す