GolangでRedisを操作しよう!

こんにちは。KOUKIです。

とあるWeb系企業で、Webエンジニアをしています。

最近、Go言語でRedisを扱うことがあったので、備忘がてら記事にしました。

表題の通り、Redisを操作して遊びましょう。

Redisとは

Redisは、Key-Valueで値を保存できるNoSQLデータベースです。

データベースのキャッシュに使ったり、メッセージブローカーにしたりできます。

環境準備

Docker

アプリケーションは、Dockerで動かしましょう。

Dockerfile

golangのairを導入しているので、ホットリロード(コンテナを止めずに、Goのコードの変更を検知する仕組み)ができます。

docker-compose.yml

main.go

コンテナの立ち上げ

ブラウザから「http://localhost:8080/」へアクセスしてみましょう。

Redisへアクセスする

Redisへアクセスするコードを書きます。

接続には、go-redisを使います。

SetupRedis関数は、main.goから呼び出しましょう。

これで、Redisへ接続できるようになりました。

APIのレスポンス

とりあえず、以下のデータを取得するAPIを作ってみようかと思います。

Userモデルの作成

Userモデルを作成しましょう。

テストデータをRedisに突っ込む

BookデータRedisに突っ込みましょう。

UUIDをキーに、ユーザーリストを追加しました。

Redisコンテナが立ち上がっていることが前提ですが、以下のコマンドを実行してテストデータを入れましょう。

ここで取得したUUIDは後で使います。

ユーザーリストの取得

redisからユーザーリストを取得してみましょう。

Redisからデータを取得するための関数を定義しました。

Redisから取得したデータは、jsonパッケージのUnmarshalを使って、GoのStructへパースしています。
今回のようにリストデータもパースできるので、大変便利です。

ルートの追加

main.goにルートを追加します。

「http://localhost:8080/users/<uuid>」へGET形式でリクエストを送ると、Redisからデータを取得して呼び出し元に返す処理を追加しました。

検証

curlで確認してみましょう。データが取得できれば、OKです。

jqコマンドは、HomeBrewでインストールしています(brew install jq)

ソート

Redis Sort

Redisは、スコア(ランキング)をつけることで、データの並び替えをしてくれます。

スコアをつけるには、go-redisのZAddメソッドを使います。

テストデータを作成するtestdata.goに以下の処理を追加します。

AccountIDをスコアとして、Nameを登録しました。”rankings”キーワードで、データが取得できます。

実装が完了したら、以下のコマンドで、Redisにデータを入れましょう。

並び替えには、「ZRevRangeByScoreWithScoresメソッドを使います。

main.go関数にRankingハンドラを実装しましょう。

これで、「http://localhost:8080/ranking」にアクセスすると、ランキングされたデータが取得できます。

ユーザー名が小さい順にソートされますね。てっきり、Score(AccountID)が小さい順にソートされるものだと思いましたが…

Golang Sort

RedisのScoreは、覚えることがたくさんあり、使い勝手も悪そうなので、Go言語でソートをしてみたいと思います。

Account IDが降順になるようにプログラミングをします。

Goのsortパッケージを使って、AccountIDが降順になるように実装しました。

これを、main.goのgetUserListに組み込みましょう。

これで、AccountIDが大きい順にデータが取得できるようになりました。

まとめ

GoでRedisを操作するのは結構簡単ですし、何より処理速度がめちゃくちゃ早いです。

現場でも結構重宝するので、皆さんもぜひ試してみてください。

それでは、また!

Go記事まとめ

ソースコード

Dockerfile

docker-compose.yml

main.go

radis.go

testdata.go

user.go

sort.go

コメントを残す