こんにちは、KOUKIです。
GolangのWebフレームワークであるfiberを使ってAPIを開発しています。
前回はAliasを設定し、リクエストごとに処理の振り分けを行いました。
今回は、Redisを導入してみましょう。
Redisは、DBのキャッシュやメッセージブローカーなどに利用されるオープンソースのストレージです。Key-Valueの形式でデータを保存できるので、使い勝手も良いです。
尚、Udemyの「React, NextJS and Golang: A Rapid Guide – Advanced」コースを参考にしています。解釈は私が勝手に付けているので、本物をみたい場合は受講をお勧めします!
<目次>
前回
事前準備
モジュール
1 |
go get github.com/go-redis/redis/v8 |
ファイル
1 |
touch src/database/redis.go |
作るもの
Ambassdor機能を作りたいと思います。エンドポイントは、次の通りです。
- GET /api/ambassador/products/frontend
- GET /api/ambassador/products/backend
- POST /api/ambassador/links
- GET /api/ambassador/stats
- GET /api/ambassador/rankings
Redisの導入
本APIの実行環境は、Dockerです。Dockerを使うとめんどくさい環境構築もコマンド一つで行えるようになるので、ローカルにインストールすることを強くお勧めします。
Redis Serviceの追加
docker-compose.ymlにRedisのServiceを追加しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# docker-compose.yml version: "3.3" services: backend: ... depends_on: - db - redis # 追加 db: ... redis: image: redis:latest ports: - 6379:6379 |
コネクション
Redisへコネクションするコードを実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// database/redis.go package database import "github.com/go-redis/redis/v8" var Cache *redis.Client func SetupRedis() { Cache = redis.NewClient(&redis.Options{ // docker-compose.ymlに指定したservice名+port Addr: "redis:6379", DB: 0, // use default DB }) } |
コネクションの呼び出し
main.goからRedisコネクションの呼び出し処理を実装します。
1 2 3 4 5 6 7 8 9 10 11 |
// main.go package main ... func main() { // Connection To Mysql // Migration // Redis database.SetupRedis() ... } |
検証
コンテナを立ち上げて、コネクションエラーが発生しないか検証してみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
docker-compose up backend_1 | ┌───────────────────────────────────────────────────┐ backend_1 | │ Fiber v2.11.0 │ backend_1 | │ http://127.0.0.1:3000 │ backend_1 | │ (bound on host 0.0.0.0 and port 3000) │ backend_1 | │ │ backend_1 | │ Handlers ............ 30 Processes ........... 1 │ backend_1 | │ Prefork ....... Disabled PID ............... 102 │ backend_1 | └───────────────────────────────────────────────────┘ backend_1 | |
Fiberのメッセージが出てきたので、コネクションは問題ないと思います。ただし、コネクションに失敗しても、エラーを吐いてプログラムが停止するような作りにしていないので、次回以降で実際にデータが保存できるか確認します。
次回
次回は、キャッシュの登録処理を実装しましょう。
Go言語まとめ
ソースコード
ここまでのソースコードを以下に記載します。
main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// main.go package main import ( "admin/src/database" "admin/src/routes" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" ) func main() { // Connection To Mysql database.Connect() // Migration database.AutoMigrate() // Redis database.SetupRedis() // fiber API app := fiber.New() // CORSの設定 app.Use(cors.New(cors.Config{ // 認証にcookieなどの情報を必要とするかどうか AllowCredentials: true, })) // Setup Routes routes.Setup(app) app.Listen(":3000") } |
redis.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// database/redis.go package database import "github.com/go-redis/redis/v8" var Cache *redis.Client func SetupRedis() { Cache = redis.NewClient(&redis.Options{ // docker-compose.ymlに指定したservice名+port Addr: "redis:6379", DB: 0, }) } |
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# docker-compose.yml version: "3.3" services: backend: # docker-composeファイルと同階層のDockerfileをビルド build: . ports: # ローカル:Docker - 8000:3000 # DockerとローカルのFSをマウント volumes: - .:/app # dbを先に起動させる # ただし、初回起動時はDBの準備に手間取るので、コネクトに失敗する # 可能性がある depends_on: - db - redis db: image: mysql:5.7.22 # restart: always environment: MYSQL_DATABASE: ambassador MYSQL_USER: admin MYSQL_PASSWORD: admin MYSQL_ROOT_PASSWORD: root # ローカルに.dbdataを作成し、dbコンテナとFSをマウントする volumes: - .dbdata:/var/lib/mysql ports: - 33066:3306 redis: image: redis:latest ports: - 6379:6379 |
コメントを残す
コメントを投稿するにはログインしてください。