グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



インメモリで高速に!GoでRedisを扱う方法と排他制御の実装について

業務でRedisを扱うこととなり、Redisはどんなときに使うべき?というところから学習しました。
バックエンドではGoを使用しているので、Goでの簡単な使い方をまとめたいと思います。

Redisとは

Redisとは、Key-Value型のNoSQL(Not only SQL)データベースです。
インメモリのNoSQLデータベースのため、MySQLなどのRDB(Relational Database)よりも高速に処理することができます。
しかし常にメモリを消費し、メモリに乗るデータ量しか扱えないため、一度に大容量のデータを扱うような処理はできません。

Redisの準備

まずはRedisの環境を構築するため、Dockerでコンテナを用意します。
イメージはDockerHubのredisを使用します。
※永続化させる場合は redis-server –appendonly yes を追加する必要があります。

コンテナに入り、Redisにアクセスします。

いくつかRedisの簡単なコマンドを試してみます。
ここでテスト用に使用したデータは、後で混同しないように全て削除して終了しています。

GoでRedisにアクセスする

それではGoでRedisの実装をしていきます。
今回はRedisの公式ページで推奨されているgo-redis/redisを使用して実装します。
この例では、Data構造体に入れたkeyとvalueを、登録して取得するという単純なものです。

Redis公式ページ

出力結果は以下のようになり、入れた値が正しく取得できていることが確認できました。

念のため、先ほど作成したコンテナでRedisにデータが登録されているか確認してみましょう。

こちらでもkey1とvalue1が入っているので、正常に動作していることが確認できました。

排他制御について

先ほどはデータを登録して取得するだけでしたが、次は排他制御ができるようにしてみたいと思います。
先ほど使用したデータは削除し、実装にはSetNXメソッドを使用します。
SetNXでは、キーがまだ存在しない場合にのみキーを設定することができます。
Set関数を用意し、今回は20秒でexpireするように設定します。

key1に対して、value1とvalue100の2つの値を用意し、既に存在しているキーにアクセスした場合はエラーを返すようにします。

main関数を実行すると、以下ような出力結果となりました。

goroutineでアクセスしているので結果は実行する度に異なりますが、今回はvalue100でエラーが返ってきました。
Redisで確認してみても、value100ではなく、value1が登録されていることが確認できました。

今回は20秒で揮発するように実装しているので、コンテナで値を確認する場合には、その時間以内に確認をするようにしてください。

まとめ

GoでRedisを扱う基本的な方法と、排他制御の実装について確認ができました。
インメモリのKVSには高速処理が可能というメリットがある一方、メモリを消費するというデメリットがあります。 特徴を理解した上で、使用用途に応じてRDBとの使い分けをしていきたいと思います。

The following two tabs change content below.

totsuka

事業開発部 web application engineer
鉄道会社でバス・不動産部門を経験の後、エンジニア未経験ながらもアーティスへ入社。 事業開発部のエンジニアとして新規サービスの開発に携わっている。 エンジニア未経験での入社のため、つまずきながらも1,2ヶ月の研修を経て、現在では主にGoを使用したプロダクトコードのコーディングに従事している。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします