Redisといえば赤く四角い板が3層に重なり、丸・三角・四角・星のシンボルが刻まれているロゴが印象的です。

Redis Logo Contestによって選ばれたロゴで、今でもサイトを覗くと公募されたロゴの一覧が表示できます。

さて本記事ではRedisの特徴やメリット・デメリットについて解説を行いましょう。用途や活用方法などにも言及します。

またコマンドの使い方や特に便利なコマンドのピックアップなど、実践的な部分にも踏み込んで紹介を行う予定です。

Redisとは

Redisはオープンソースの永続化可能なインメモリデータベース(In-memory database)で、BSDライセンスで公開されています。

2009年初めにSalvatore Sanfilippo氏によってRedisプロジェクトが開始されました。

最初は自社製品のパフォーマンス向上が目的だったようです。

しかし2010年にはVMWareが開発を支援するようになり、今では大きなコミュニティに成長しました。

Twitter・Github・PinterestなどのサービスがRedisを採用しており、大規模データの処理や処理速度の向上を実現しています。


Redisの特徴

Redisの特徴はインメモリ型データ構造ストアであること、そしてデータの永続化ができることといえるでしょう。


インメモリ型データ構造ストア

Redisはメモリ上で動作するキーバリューストア型のデータベースです。

全てのデータをメモリ上に格納し、各種アプリケーションからの高速アクセスを可能にします。

データ構造ストアでは複雑な型のデータを操作し、保存することができるのが特徴です。

リスト・マップ・セットなどのお馴染みのデータ構造をそのまま取り扱うことができます。


データ永続化機能

メモリ上のデータは揮発性なので、何もせずに再起動すると全て消えてしまうでしょう。

Redisはメモリを利用しますが、メモリ上のデータを任意のタイミングでディスクに格納して保持する仕組みがあります。

1つ目のRDB(Database Backup File)はダンプファイルのようなものをスナップショットとして保存する方法です。

速度面への影響は少ないですが、この方法だと障害発生前数分ほどのデータは復旧できません。

2つ目はAOF(Append Only File)という実行時の全コマンドを記録しておく方法です。

こちらは障害発生前1秒ほどのデータのみが失われるだけですが、代わりに実行速度は著しく低下します。

パフォーマンスに影響が出るため全てに適用する訳にはいきませんが、使いどころを考えて実装すれば強い武器になるでしょう。


レプリケーション機能

Redisはマスター・スレーブ型レプリケーションの仕組みを持っています。

1つのマスターに対し複数のスレーブを作成し、スレーブはマスターとデータの同期を行いながら読み込みに応答する仕組みです。

これにより負荷が分散します。またしかるべき設定を行えば自動のフェイルオーバーなども行えるようになるでしょう。


Redisのメリット

Redisには沢山のメリットがあります。


Webアプリケーションの高速化

RedisはインメモリのNoSQLデータベースのため、RDBよりも処理速度が高速です。

Webアプリケーションのセッションやキャッシュの一時的な保存先に指定することで、アクセス速度が飛躍的に向上します。


アトミック(原子性)

ある操作がアトミックであるとは、複数の操作が全て実行されるかあるいは全く実行されないと保証される性質のことです。

実際Redisのコマンド実行もトランザクションもアトミックなので不整合が生じません。

当たり前のように思われるかもしれませんが、他の多くのキーバリューストアにはトランザクション機能がないのが普通です。


データ型のサポート

一般的なキーバリューストアにはデータ型がありません。保存したJSONやCSVをアプリケーション側で解釈して使用します。

しかしRedisには以下のようなデータ型が用意されており、各言語のクライアントで取得したデータはそのまま使用可能です。

  • Strings(文字列型)
  • Lists(リスト型)
  • Sets(セット型)
  • Hashes(ハッシュ型)
  • Sorted sets(ソート済みセット型)


Redisのデメリット

Redisのデメリットについて説明しましょう。


常にメモリを消費する

メモリ上で動作するため常にメモリを消費します。

またメモリに乗り切るデータしか扱えないため、大容量のデータを一度に取り扱うような処理はできません。

またメモリの断片化の問題もあります。大量のデータの書き込み・削除を繰り返すとパフォーマンスが低下するでしょう。


データの揮発性

RDB・AOFの2種類の永続化機能があるとはいえ、基本的にはインメモリデータベースであり数分・1秒とはいえ揮発性があります。

データの消失を許さないシステムではRedisを用いることはできません。

加えて上記の永続化機能は速度やパフォーマンスへの影響もありました。これでは折角のメリットが活かせません。


Redisの用途

Redisは実装の際にどのような用途を想定して導入されるのでしょうか。


セッション管理・キャッシュ

Webアプリケーションのセッション管理への利用です。

またHTMLコード片やページのキャッシュを行うことで、より速くWebページが表示されるようにできます。

この機能はMemcachedと同様のものです。


リアルタイム更新

商品・ユーザー・コンテンツなどのデータをリスト化した状態で保持し、変化があれば更新やソートを行います。

このようにあるユーザーのアクションをWebサイトの他のデータと連携・反映するような仕組みを作る利用シーンもRedisの出番です。


Redisの活用方法

Redisの導入事例を中心に実用のプロダクトでどのように活用されているかを見ていきましょう。


Pinterestのフォロー管理

Pinterestには5000万を超えるユーザーが存在するため、大量のフォロー・フォロワー関係の管理を行わなければなりません。

この問題をRedisによって解決しています。

具体的にはフォローしているユーザーやフォロワーのリストをRedisに保持しておき、変化があればフォロワー数を更新するという具合です。


Slackにおけるジョブ管理

SlackではKafkaとRedisを使用して大量のタスクを捌いています。元々SlackはRedisだけでタスクを管理していました。

ところがRedisのメモリ枯渇問題にあたり、Kafkaへの完全な移行も考えたそうです。

しかし既存アプリケーションへの影響が大きいことから、RedisをKafkaとアプリケーションの間に配置して対応しました。

このような事例もあるという紹介でした。


Airbnbの問題監視

AirbnbはWebサイト経由で民宿などの宿泊施設を宣伝・予約できるシステムです。

AirbnbがRedisを使用しているのはAirbnbを利用するユーザーに起きている問題を効率良く監視するためのダッシュボードでした。

Elasticsearchで予約チケットのデータを検索・分析し、結果をRedisに格納します。

この結果をフロントエンド側のReactアプリケーションが取得・表示する仕組みです。


Redisの使い方

Redisの使い方について解説していきましょう。本記事ではインストール手順は説明を省略しますのでご了承下さい。

動作確認環境は以下になります。

  1. $ redis-server –version
  2. Redis server v=5.0.8 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=f5de7c59791f2d0a

また以下のコマンドでヘルプ表示です。

  1. $ redis-server –help

それでは本題に入りましょう。


サーバー起動・停止

Redisサーバーの起動は「redis-server」コマンドです。「–daemonize yes」オプションを使用するとバックグラウンド実行できます。

  1. $ redis-server
  2. $ redis-server /path/to/redis.conf –daemonize yes

「/path/to/redis.conf」にはRedis設定ファイルのパスを指定して下さい。

「–port ポート番号」はポートの指定、「–loglevel ログレベル」はログ出力のオプションです。


サーバー停止

Redisサーバーを停止させる方法はいくつかありますが、「redis-cli」を利用して停止する方法が迷いがないと思います。

  1. $ redis-cli
  2. 127.0.0.1:6379>shutdown

これ以外の方法はsystemctlやserviceを使用してデーモンを停止させる方法やPIDを調べてKillする方法です。

Redisのコマンド一覧

Redisには便利なコマンドが豊富に揃っています。

全てを紹介するのは難しいので追加・表示を中心に見ていきましょう。詳細はヘルプや公式のリファレンスを参照して下さい。

実際に利用しているのはRedisではなくredis-cliというCLIツールになります。

「redis-cli」コマンドでシェルを起動しておいて下さい。

  1. $ redis-cli
  2. 127.0.0.1:6379>


Strings(文字列型)

「set キー 値」でデータを保存します。「get キー」でデータの取得です。

  1. 127.0.0.1:6379> set key hogehoge
  2. OK
  3. 127.0.0.1:6379> get key
  4. “hogehoge”

「mset key value [key value …]」で複数のデータを一気に格納します。「mget key [key …]」で取得です。

  1. 127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3
  2. OK
  3. 127.0.0.1:6379> mget key1 key2 key3
  4. 1) “value1”
  5. 2) “value2”
  6. 3) “value3”


Lists(リスト型)

「lpush key value [value …]」でリスト型の値を格納します。「llen key」で長さの取得です。

  1. 127.0.0.1:6379> lpush mylist 0 1 2
  2. (integer) 3
  3. 127.0.0.1:6379> llen mylist
  4. (integer) 3

リスト全ての値を表示するには「lrange key start stop」を使用します。インデックスを指定する場合は「lindex mylist index」です。

  1. 127.0.0.1:6379> lrange mylist 0 2
  2. 1) “2”
  3. 2) “1”
  4. 3) “0”
  5. 127.0.0.1:6379> lindex mylist 0
  6. “2”


Sets(セット型)

「sadd key value [value …]」でセット型の値を格納します。また「smembers key」で表示です。

  1. 127.0.0.1:6379> sadd myset1 4 5 6
  2. (integer) 3
  3. 127.0.0.1:6379> smembers myset1
  4. 1) “4”
  5. 2) “5”
  6. 3) “6”

セットは結合することもできます。「sadd myset2 7 8 9」でもう1つのセットを追加しました。

「sunion key [key…]」コマンドで複数のセットを結合です。

  1. 127.0.0.1:6379> sunion myset1 myset2
  2. 1) “4”
  3. 2) “5”
  4. 3) “6”
  5. 4) “7”
  6. 5) “8”
  7. 6) “9”

このようにデータ型によっては追加のコマンドが用意されています。

後述するヘルプコマンドで一覧を確認してみて下さい。


Hashes(ハッシュ型)

「hset key field value」でハッシュ型の値を格納します。「hgetall key」で表示です。

  1. 127.0.0.1:6379> hset myhash field1 value1
  2. (integer) 1
  3. 127.0.0.1:6379> hset myhash field2 value2
  4. (integer) 1
  5. 127.0.0.1:6379> hgetall myhash
  6. 1) “field1”
  7. 2) “value1”
  8. 3) “field2”
  9. 4) “value2”


Sorted sets(ソート済みセット型)

「zadd key value [value …]」でソート済みセット型の値を格納します。「zrange key start stop withscores」で表示です。

  1. 127.0.0.1:6379> zadd sorted 0 1 2 3
  2. (integer) 2
  3. 127.0.0.1:6379> zrange sorted 0 4 withscores
  4. 1) “1”
  5. 2) “0”
  6. 3) “3”
  7. 4) “2”


Redisの便利なコマンド

Redisコマンドのうち覚えておいた方が良いものを取り上げました。


キーの一覧を表示する

「keys *」で現在表示されている全てのキーを確認するコマンドです。

  1. 127.0.0.1:6379> keys *
  2. 1) “key1”
  3. 2) “key2”
  4. 3) “key3”
  5. 4) “mylist”


キーに対する値の型を表示する

「type key」で対象のキーが保持している値の型を取得します。

  1. 127.0.0.1:6379> type key1
  2. string
  3. 127.0.0.1:6379> type mylist
  4. list


ヘルプを表示する

「help」でヘルプが確認できるので目を通しておくと良いでしょう。

  1. 127.0.0.1:6379> help
  2. redis-cli 5.0.8
  3. (後略)

例えばStrings(文字列型)で使用できるコマンドの詳細を確認したい場合は、以下のようにコマンドを入力して下さい。

  1. 127.0.0.1:6379> help @string
  2. APPEND key value
  3. summary: Append a value to a key
  4. since: 2.0.0


おわりに

Redisの使い方やコマンドについては把握できたでしょうか。

Redisには型やコマンドが多いため、迷わず使いこなせるようになるまで大変かもしれません。

しかしその分Memcachedなどの同じ畑の技術と比べると、案件や仕事は遥かに多くなっています。

もし技術選定に迷った場合もRedisにしておけば、後々の仕様変更など融通が効くのでおすすめです。

これを機にインメモリデータベースやキャッシュなどの基礎知識も含めて、Redisの学習を進めてみてはいかがでしょうか。


toiroフリーランスは、SHIFTグループがプライムとして参画している独自案件をフリーランスエンジニア向けに紹介する唯一のプラットフォームサービスです。

エージェントによるサポートもありますので、ご利用を検討してみてはいかがでしょうか。