ニコニコ生放送に見る Redis 活用ノウハウ

第1回 インメモリデータストア Redisの概要

この記事を読むのに必要な時間:およそ 2 分

はじめに

株式会社ドワンゴでニコニコ生放送の開発を担当している,小野と申します。本特集では,いわゆる「NoSQL」の一種であるRedisの概要と基本操作,そしてWebアプリケーションでの応用例までを,ニコニコ生放送での事例を交えながら紹介していきます。

Redisとは?

Redisは,Salvatore Sanfilippo氏によって2009年に公開されたインメモリベースのキー・バリュー・ストアです。2010年3月にはVMWareが同氏を雇入れ,同社の支援のもと,コントリビューターのPieter Noordhuis氏と共にフルタイムで開発が進められています。

本記事執筆時点での最新stableはバージョン2.0となり,新しいデータ型の追加やトランザクションのサポート,VM(仮想メモリ)の実装などが追加されました。

また,メモリ効率の向上やスループットの改善が図られたバージョン2.2が間もなくstableとなる模様です。

気になる採用事例ですが,公式サイトによれば,次の有名サイトでも利用されているとのことです。

他にも,国内外のソーシャルゲームのデータストレージとして採用されている事例を耳にします。そしてもちろん,ニコニコ生放送ではフロントエンド・バックエンド問わず大いに活用しています。

Redisの特徴

インメモリベース

すべてのデータがメモリ上に保持されるため,更新・参照が非常に高速です。同じくインメモリの高速性を応用したものにmemcachedがありますが,両者の想定する用途は大きく異なっています。

memcachedが主にデータベースクエリ等に対するキャッシュストレージとしての用途からGETやSET等のシンプルな操作に特化しているのに対し,Redisはそれ自体がデータストアとして利用可能であるように設計されており,更新参照用,管理用のコマンドが100種類以上用意されています。

また,memcachedがLRU(Least Recently Used)順に古いデータを自動削除するのに対し,Redisではコマンドで明示的に削除するか,timeoutを設定しない限りは削除されません。この点からも,あくまでデータストアとしての用途が想定されていることが明らかです※1)。

※1
設定次第では,memcached風のキャッシュストレージとして利用することも可能です。Redis2.1及び2.2からはLRUがサポートされています。

永続化

インメモリベースのデータストアを導入する際の懸念として,クラッシュした際にデータが消えてしまうという問題があります。

Redisは永続化の機構を実装しており,インメモリの高速性を持ちながら,同時にディスクベース・データストアの永続性をも備えているのが特徴です。

Redisの永続化機構は,定期的に(または更新回数などの条件により)メモリ上のデータセットのスナップショットをファイル(.rdb)にダンプし,再起動時にはこのスナップショットの内容をメモリに読み込むことにより,前回ダンプした状態までデータセットを復元します。

このスナップショット方式の永続化では,最後にダンプしてからクラッシュするまでの更新内容は消えてしまいます。アプリケーションの要件によってはこれが許容できない場合もあるでしょう。この場合は,Append Only Fileを有効にすることで,クラッシュ時のデータ喪失を最小限にすることができます。このモードでは,すべての更新コマンドがAppend Only Fileに随時追記され,再起動時にこれらのコマンドを再実行することにより,データを復元します。

なお,誤解のないように強調したいのは,「永続化」といっても,RAM容量より多くのデータを格納できるわけではないということです。あくまで最大容量はRAM容量の制約を受ける点に注意してください。この制約を超えるには,後述する「RedisVM」を使う必要があります。

データ構造

公式サイトの紹介文にもあるように,Redisは「data structure server(データ構造サーバー)」と呼ばれます。その名のとおり,複数の文字列要素からなるデータ構造をバリューとして持つことができ,通常の文字列型のバリューと同じようにキーで参照することができます。

最新の2.0で実装されているデータ構造は,次のとおりです。

  • LIST(連結リスト)
  • SET(重複のない集合)
  • SORTED SET(ソート済みのSET)
  • HASH(連想配列)

このような通常のプログラミングで用いるようなお馴染みのデータ構造をそのままRedis上で表現できるうえ,要素の追加削除,ソートなどの定番の操作もコマンドとして用意されています。

これらのデータ構造と豊富なコマンドを組み合わせることにより,単純なキー・バリュー・ストアでは手間のかかる(あるいは全く不可能な)処理を容易に実装できるのです。

クライアントライブラリ

Redisの備える豊富なコマンドを使いこなすには,クライアントライブラリのサポートが不可欠です。既にRuby, PHP, Java, C++を含む主要な言語でクライアントライブラリが開発されています。お使いの言語のクライアントは公式サイトで確認ください。

どの言語のライブラリでも,大抵はRedisのコマンド名をそのまま関数名やメソッド名にしたものであるため,容易に習得できるはずです。

レプリケーション

複数のRedisインスタンスによるマスタースレーブ・レプリケーションを構成できるため,巨大なリストのソートや数万要素の集合演算などの重いコマンドを実行する場合,スレーブとなるインスタンスを追加することによって参照負荷を分散できます。

または,マスターに障害が起きた際のホットスタンバイとしてスレーブを利用することも考えられます。

RedisVM(バーチャルメモリ)

一部のデータをスワップファイルに書きだすことによって,実際のRAM容量よりも多くのデータを扱えるようにするオプション機能です。

この機能はバージョン2.0で正式にリリースされましたが,その後,動作が不安定になるなどの報告がされているため,導入を検討される際には十分に検証を行ってください。代替として「diskstore」という新しいストレージモデルの開発がはじまっており,Salvatore Sanfilippo氏のメッセージによると,こちらはバージョン2.4でリリースされる予定のようです。

著者プロフィール

小野侑一(おのゆういち)

株式会社ドワンゴ ニコニコ生放送システムリーダー。

ニコニコ生放送での開発経験を通して,ウェブをリアルタイム化する技術の重要性に着目。その成果としてリアルタイムタグ検索やRedisを活用したリアルタイム視聴者集計システムを開発。現在は全文検索のリアルタイム化に注目している。

Twitter@synk

コメント

コメントの記入