Redis の概要

概要

Redis は Remote Dictionary Server の略であり、「キー・値」構造の非定型データを保存、管理するためのオープンソースベースの非リレーショナルデータベース管理システムである。2009年に Salvatore Sanfilippo が初めて開発した。2015年から Redis Labs が支援している。さまざまなサービスで Redis が自由に使用されている。

Pareto principle(パレートの法則)

社会で起こる現象の80%は、20%の原因によって発生するという法則である。Web サイトへのアクセスにもパレートの法則がよく当てはまる。

インターネット通信の80%は、わずか20%のサイトへのアクセスと推定され、この20%の Web サイトデータをキャッシュしておけば効率を劇的に向上できる。

とされる。

(インフラエンジニアの教科書 - ネットワーク編, 2017, Gilbut)

したがって、共通で使用されるデータを Redis を利用してキャッシュとして保存しておくことは、リソースを効率的に利用する方法になり得る。

Redis の特徴

  • Redis は key-value store NoSQL DB である。
    • 単純な string に対する key-value 構造をサポート
    • バイナリデータの書き込み
  • Single Thread で動作する。
    • シングルスレッドで動作するため、演算の原子性を保証する。
  • 多様なデータ構造をサポートする。
    • collection サポート: List、Set、Sorted Set、Hash などのデータ構造をサポート
  • 高速
    • 秒間 100,000 QPS レベルの性能を誇る。
  • Disk 保存
    • Disk に永続的に保存できる。
  • レプリケーション(replication)
    • 他のノードへ内容を複製できる master/slave 構造をサポートする。
  • Sharding サポート
    • Redis Cluster を通じてデータ sharding をサポートする。
  • Publish/Subscribe サポート
    • メッセージブローカーとして使用可能
  • Expire(有効期限)
    • key に expire を設定し、古くなったデータを自動削除できる。
  • データのスナップショットまたは AOF ログによって復旧できるため、ある程度の永続性も保証される。
  • Java Spring では、セッション管理やキャッシュによく使用される。

なぜ Collection が重要なのか?

Redis は In-Memory データベース である。つまり、すべてのデータをメモリに保存して照会する。既存のリレーショナルデータベース(Oracle、MySQL)よりはるかに高速だが、その理由はメモリアクセスがディスクアクセスより速いためである。ただし、速いという点は Redis のいくつかの特徴の一部に過ぎない。他の In-Memory データベース、たとえば Memcached との最大の違いは、多様なデータ構造 をサポートする点である。Redis は以下のように、さまざまなデータ構造を Key-Value 形式で保存する。

Redis は基本的に String、Bitmap、Hash、List、Set、Sorted Set を提供しており、バージョンが上がるにつれて現在は Geospatial Index、HyperLogLog、Stream などのデータ型もサポートしている。

では、このように多様なデータ構造を提供することがなぜ重要なのだろうか。それは 開発の利便性と難易度 のためである。

たとえば、リアルタイムランキングサーバーを実装するときにリレーショナル DBMS を利用するなら、DB にデータを保存し、保存された SCORE 値でソートして再度読み出す過程が必要になる。件数が増えると速度が遅くなりがちだが、この過程でディスクを使用するためである。In-memory ベースでサーバー側のデータ処理を直接実装することもできるが、Redis の Sorted-Set を利用する方がより速く簡単な方法である。

Redis Persistence

Redis はディスクにデータを保存する方法として、RDB(Snapshot) と AOF(Append Only File) 方式を使用する。
どちらの方式も内部的に fork() 関数を使用するため、十分なメモリが必要である。

  • RDB(Snapshot)

    • メモリ上のデータをディスクへ移す方式である。
    • スナップショット方式はメモリの状態をそのまま取得するため、特定時点のバックアップと復旧に有利であり、AOF 方式に比べてより速くデータをメモリに読み込める。
    • サーバーがダウンすると、バックアップされたスナップショット間に変更されたデータは失われる。
    • 2つの方式がある。
      • SAVE: blocking 方式で、順次すべての Redis 動作を停止し、その時点の Snapshot を Disk に保存する。
      • BGSAVE: non-blocking 方式で、別プロセスを通じて実行時点のメモリ snapshot をディスクに保存する。
  • AOF(Append Only File)

    • Redis のすべての write/update 演算を log ファイル形式で記録する方法である。
    • サーバーが起動すると、順次演算を再実行してデータを復旧する。
    • 演算処理が実行されるたびに記録するため、現在時点までのログを残すことができる。
    • ログファイルに対して append のみを実行するため write 速度が速く、サーバーがダウンしてもデータ損失が発生しない。
    • すべての演算についてログを残すため、データ量が非常に大きい。
    • サーバー再起動時、すべての演算を再実行するため restart 速度が遅い。

Redis をクラウドで使用

アプリケーション開発に Amazon Web Services や Microsoft Azure を使用する場合、各クラウドサービスは Redis サービスを提供しているため、それを活用できる。

クラウドサービス サービス名
Amazon Web Services Amazon ElastiCache for Redis
Microsoft Azure Azure Redis Cache

もちろん各クラウドサービスのコンピュータインスタンスに直接 Redis をインストールすることもできるが、管理コストを考えるとこれらのサービスを選択するのがよい。

参照