[golang]fiber API5~Ambassador:キャッシュ登録~

こんにちは、KOUKIです。

GolangのWebフレームワークであるfiberを使ってAPIを開発しています。

前回は、Redisを導入しました。

今回は、Redisにキャッシュデータを保存する処理を実装したいと思います。

尚、この記事に出てくるソースコードは、Udemyの「React, NextJS and Golang: A Rapid Guide – Advanced」コースを参考にしています。解釈は私が勝手に付けているので、本物をみたい場合は受講をお勧めします!

前回

作るもの

Ambassdor機能を作りたいと思います。エンドポイントは、次の通りです。

エンドポイント
  • GET /api/ambassador/products/frontend
  • GET /api/ambassador/products/backend
  • POST /api/ambassador/links
  • GET /api/ambassador/stats
  • GET /api/ambassador/rankings

今回は、「/api/ambassador/products/frontend」への処理を追加します。

Productデータのキャッシング

RedisにProductデータをキャッシングして、処理速度の向上に勤めましょう。本APIのように小規模APIの場合は、キャッシングがなくても問題なく動くと思いますが、より実践を見据えてチャレンジしましょう。

ルートの追加

「/api/ambassador/products/frontend」のルートを追加します。

コントローラー

「/api/ambassador/products/frontend」のコントローラーを追加します。

これで、Productデータを全て取得し、呼び出し元に返すことができるようになりました。

検証

以下のパラメーターで検証してみましょう。

  • URL: http://localhost:8000/api/ambassador/products/frontend
  • 形式: GET

OKですね。

キャッシングの意義

先ほどの検証で、全てのProductデータを取得しました。しかし、何度も取得し直すことはパフォーマンスの劣化を招きます。

なぜなら、MySQLのようなDBへのアクセスは“コスト”がかかるからです。

そこで、前回導入したRedisにProductデータをキャッシュとして持たせることで、パフォーマンスを改善します。

先ほど実装した、ProductFrontend関数に、Redisのキャッシング処理を追加しましょう。

検証2

以下のパラメーターで検証してみましょう。

  • URL: http://localhost:8000/api/ambassador/products/frontend
  • 形式: GET

一度目のリクエスト時には、以下のログが出力されます。

この際に、RedisにProductデータが格納されました

そのため、次回のリクエストからは、Redisからデータを取得します。

ただし、現状だと戻り値がNullになるので、修正が必要です。

一度、Dockerコンテナを立ち上げ直してから、再度リクエストを送ってみてください。

OKですね。

補足

キャッシュしてから定期的にデータを更新する必要があります。そうしないと、古いデータがキャッシュとして残り続けてしまうので、正しいデータが取得できなくなります

現場では、バッチなどを用いて定期的にキャッシュの更新を行いますが、本APIにはそのような機能はありませんので、あしからず^^

その内、キャッシュし直す処理を追加するとは思いますが…

次回

次回は、プロダクトの検索機能を実装しましょう。

Go言語まとめ

ソースコード

ここまでのソースコードを以下に記載します。

productController.go

routes.go

コメントを残す