[golang]fiber API11~Ambassador: RankingとRedis Sortの実装~

こんにちは、KOUKIです。

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

前回は、LinkとStatsの実装を行いました。

今回は、Ranking APIとRedisのソート処理の実装を行います。

尚、本記事は「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/rankings」への処理を実装します。

Ranking

ユーザーごとの売り上げランキングを返すAPIを実装しましょう。

ルートの追加

「/api/ambassador/rankings」へのルートを追加しましょう。

コントローラーの追加

Rankingを算出するコントローラーを追加します。

「models.Ambassador(user)」の処理ですが、以前作成したAmbassadorリンクをuserデータに紐づけています。こんな書き方ができることを初めて知りました。

また、userモデルにNameメソッドを追加します。

検証

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

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

OKですね。

補足: データの投入について

MySQLのデータは、.dbdataに保存されています。MySQLのデータを削除したい時は、このフォルダを削除してください。

削除後に、一度Dockerを立ち上げてMySQLの初期化を済ませます。次にもう一度Dockerを立ち上げ直して、以下のコマンドを実行するとテストデータを投入することが可能です。

Redisのソート

Redisには、データをソートする機能があります。
※ 参考 – Sorted sets 101

この機能を使って、先ほど取得したRankingデータをアルファベット順に並び替えてみましょう。

ソートプログラムの作成

Redisのソートプログラムを実装します。

ここでは、”rankings”というキーワードを関連付けたRankingデータを作成しています。※先ほど実装したRanking関数と同じようなものです。※ 参考 – ZAdd

Rankingコントローラーの修正

キャッシュ(Redis)からデータを取得する必要があるので、先ほど実装したRankingコントローラーを修正します。

ZRevRangeByScoreWithScoresは、min/maxの間にある全ての対象要素のデータを返却するようです。ちなみに、infは保持している値全てを取得するキーワードで、min/maxに「-inf,+inf」の形式で指定できます。

Makefile更新

Makefileに以下のコマンドを追加しましょう。

検証

以下のコマンドを実行してください。

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

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

OK! 名前のアルファベット順で、ソートされましたね。

次回

次回は、Checkout APIを実装しましょう。

Go言語まとめ

ソースコード

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

updateRankings.go

userController.go

Makefile

コメントを残す