[golang]fiber API9~Ambassador: キャッシュの更新~

こんにちは、KOUKIです。

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

前回は、ページネーション機能を実装しました。

今回は、キャッシュを更新する方法を紹介します。

尚、本記事は「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

キャッシュ更新の問題点

以前、RedisにProductデータをキャッシングする実装を行いましたが、キャッシュ更新の課題が残っていました。

例えば、idが「1」のデータは現在、以下のようになっています。

このデータを以下のパラメータで更新したいと思います。

  • URL: http://localhost:8000/api/admin/products/1
  • 形式: PUT

更新が完了できたら、もう一度商品を取得してみましょう。

更新前のデータを取得しましたね。これは、キャッシュを更新していないためです。

キャッシュ削除

まず、キャッシュを削除する処理を実装しましょう。

ここでは、goroutineを使って実装しています。これをfor文と組み合わせて実行しているので、fiber APIとは別プロセスでキャッシュを削除するプロセスを立ち上げられます。

Cache.Delメソッドは、Redisに格納したデータを削除します。RedisはKey-Valueデータストアなので、Keyを指定すればサクッと削除できます。

Keyは、呼び出し元からChannelを介して取得します。goroutineを使って別プロセスで動かした場合、Channelを介さないとデータを送ることができません。

このキャッシュチャネルのプロセスは、main.goから動かしましょう。

キャッシュの更新タイミング

キャッシュは、「/api/ambassador/products/frontend」や「/api/ambassador/products/backend」へリクエストを送り、DBからデータを取得後、呼び出し元にリプライするタイミングで登録します。

そして、データを再取得するときに、Redisにキャッシュされたデータを返します。

キャッシュは、データの状態が変わったタイミングで更新されれば、とても良いですね。そうすれば、データを取得するときに、常に最新データを取得できます。

よって、プロダクトの作成、更新、削除のタイミングで、キャッシュを削除しましょう。

検証

キャッシュが更新されるか検証してみましょう。

先ほどと同様に、商品を更新してからデータを取得します。

データの更新

データの再取得

更新後のデータを取得することができました!

コンソールにも、以下のログが出力されています。

次回

次回は、LinkとStatsを実装しましょう。

Go言語まとめ

ソースコード

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

productController.go

redis.go

main.go

コメントを残す