Table Of Contents

Previous topic

クイックスタート

Next topic

ライセンス

This Page

README

イントロダクション

RedisはANSI Cで実装された、究極に速く、パワフルなキー・バリュー・ストア型のデータベース&サーバです。Redisは、1つのシンプルな事に対して、さまざまな方法を提供しています。 "redis" というキーに対して、 "antirez" という値を格納することができます。キーのフォーマットは常にシンプルな文字列ですが、値として、次のような様々なデータ型を持つことができるように、パワフルな実装になっています。

それぞれの値の型を操作するための、専用のコマンドがあります。これらのコマンドの最新のリストは コマンドリファレンス に、データ型ごとに分類されて掲載されています。また、Redisのソースには コマンドラインインタフェース が含まれており、サーバと直接対話することができ、このイントロダクションで提供しているサンプルを動かしてみることができます。 クイックスタート のガイドに従うと、動作しているRedisインスタンスの設定が行えるため、これからの説明の通りに動かすことができるようになります。

Redisの強力なパワーの1つが、データ型ごとに最適化された、幅広いコマンドです。コマンドの実行は、サーバーサイドでアトミックに行われます。 リスト型 の例を紹介すると、RedisはO(1)で処理が完了する、リスト操作のコマンドの LPUSHRPUSH と、関連コマンドの LPOPRPOP メソッドを実装しています。

redis> lpush programming_languages C
(integer) 1
redis> lpush programming_languages Ruby
(integer) 2
redis> lpush programming_languages Python
(integer) 3
redis> rpop programming_languages
"C"
redis> lpop programming_languages
"Python"

それぞれのデータ型に対するより複雑な操作も提供されています。再びリストの例を挙げると、 指定した範囲の要素を取得する LRANGE (O(start+n))や、リストをトリムする LTRIM (O(N)) があります。

redis> lpush cities NYC
(integer) 1
redis> lpush cities SF
(integer) 2
redis> lpush cities Tokyo
(integer) 3
redis> lpush cities London
(integer) 4
redis> lpush cities Paris
(integer) 5
redis> lrange cities 0 2
1. "Paris"
2. "London"
3. "Tokyo"
redis> ltrim cities 0 1
OK
redis> lpop cities
"Paris"
redis> lpop cities
"London"

セット型 に対しては、要素の追加と削除、セット同士の積、和、差の演算が行えます。

Redisは、データ構造サーバとしてみることができます。Redisユーザには、仮想的に 抽象データ型 へのインタフェースが提供されているため、具象データ構造とアルゴリズムの実装という手間から逃れることができます。実際、Redisにおいては、アルゴリズムとデータ構造というのは、もっとも良いパフォーマンスが出るように選択するだけです。

全てのデータはメモリに格納されるが、ディスクにも保存される

Redisは全てのデータセットをメモリにロードして保持しますが、同時にディスクにも書き出すため、データセットは永続化されています。そのため、サーバが再起動されても、データは前と同じようにメモリに再ロードされます。

永続化は2種類サポートされています。1つ目はスナップショットと呼ばれているものです。このモードでは、Redisは定期的に非同期にディスクに書き込みにいきます。再起動時は毎回、このダンプファイルから、データセットが読み込まれます。

Redisは、決まった回数の変更が行われたらデータセットを保存しにいくだとか、決まった時間が経過すると保存しにいく、といった設定を行うことができます。例えば、1000回の更新後か、最後の保存から最大で60秒で保存する、というような設定をすることができます。これらの数値は自由に設定できます。

データが非同期に書かれているため、システムのクラッシュが発生すると、最後のいくつかのクエリーが失われる可能性があります。(多くのアプリケーションではこれでも問題はありませんが、すべてではありません。) この問題を解決する方法として、Redisは通常とは異なる、 追記専用ファイルモード という安全な永続化モードをサポートしています。データセットに変更を加えるコマンド(読み込み用コマンドではなく、書き込みコマンド)を受信すると、即座に追記専用のファイルに書き込みます。このコマンドは、サーバが再起動されたときに、再度再生されて、メモリ上のデータセットを再構築します。

Redisの追記専用ファイルのサポートはとても使いやすい機能です。サーバは安全にバックグラウンドで追記専用ファイルの再構築を行うことができますし、長い時間がかかったとしてもブロックしません。これについては、 追記専用ファイルモード のHow Toを参照してください。

簡単マスター/スレーブレプリケーション

どのような永続化モードを使用していたとしても、Redisのサポートする、マスター/スレーブのレプリケーション機能を利用することができます。安全性を高めたり、大量の読み込みリクエストに対応してスケールさせる必要がある場合に使えます。

Redisのレプリケーションのセットアップは簡単です。設定するのにやらなければならないことは、他のサーバのスレーブになるRedisサーバの設定ファイルに、 slaveof 192.168.1.100 6379 という1行を追加するだけです。この機能についてもっと知りたい場合は、 レプリケーションの設定方法 の説明をご覧ください。

「それは永続化されているけど、期限切れです」

Redisはmemcachedと同じぐらい高速なため、筋力増強剤としてmemcachedと同じように使用することができますが、さらに多くの機能を持っています。memcachedと同じく、キーに対するタイムアウト時間を設定し、与えられた時間が過ぎたら自動で削除する、といったことができます。

キー・バリュー型データベースを超えて

これらの機能により、リレーショナルデータベースを必要としない、スケーラブルなアプリケーションのためのメインのDBとして、Redisを使うことができます。私たちは現実世界のサンプルとして、 PHP+Redisを使ったシンプルなTwitterクローン を作りました。リンク先のドキュメントには、シンプルな言葉で設計と、内部の話が説明されています。

複数データベースのサポート

Redisは、1つのデータベースから、他のデータベース自動的にキーを移動する、複数データベースをサポートしています。デフォルトでは、毎コネクションで必ず DB 0 が選択されますが、 SELECT コマンドを使うと、他のデータベースをselectすることができます。 MOVE 操作を使うと、要素を1つのDBから他のDBに自動的に移動することができます。 RANDOMKEY コマンドを使うことで、ロックフリーアルゴリズムの恩恵に授かりながら使用することができます。

Redisについてももっと知りたい!

Redisの使い心地や、どのように動作するかを知りたい場合は、ぜひ、 introduction_to_redis_data_types に挑戦してみてください。

Redisの内部動作についてもう少し知りたい場合はこのまま読み進んでください。

Redisチュートリアル

Note

“公式な”ドキュメントにのみ興味がある場合は、このセクションを読み飛ばすこともできます。

このドキュメントにはRedisのコマンドや、プロトコルの詳細の情報などが書かれています。この手のドキュメントは有用ですが、もしRedisに触れるのが始めてて、概要がつかめていないのであれば、退屈でしかありません。Redisのプロトコルは、シンプルでコンピュータでパースしやすいようになっていますが、 telnet コマンドからも送信しやすいようになっています。このセクションでは、Redisでの遊び方を紹介し、Redisに関する第一印象を持ってもらい、どのように動作するのかを知ってもらうような説明をしていきます。

まず最初に、 make を実行してコンパイルし、 ./redis-server を起動してください。サーバが起動して、標準出力にログを書き出します。より多くの情報を得たい場合には、 redis.conf を編集して logleveldebug にして再起動してください。

自分で変更を加えた設定ファイルを使うには、次のように設定ファイルを指定します。

$ ./redis-server /etc/redis.conf

ただし、この設定ファイルの指定は必ずしも必要では ありません 。設定ファイルを指定しなければ、デフォルトの組み込みの設定を使って起動します。

それでは、指定されたキーに値をセットしてみましょう。

$ telnet localhost 6379
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SET foo 3
bar
+OK

サーバに最初に送った行は、 "set foo 3" です。この行は、「 foo というキーに対して、これから送る3バイトのデータをセットします」という意味です。次の行は "bar" という文字列で、これが3バイトの文字列になります。この2行のコマンドにより、 "foo" というキーに、 "bar" という値がセットされます。とてもシンプルですよね!

Note

コマンドは小文字で送ることもできます。コマンド名は、大文字、小文字の区別はしません。

最初の行と、2番目の行を送信したあとに、末尾に改行コードがあることに注意してください。サーバは、コマンドの終わりや、バイト列の終端が "\n\r" であることを期待します。これはサーバとクライアントから見ると、小さなオーバーヘッドですが、これのおかげで、telnetを使ってコマンドを打って遊びやすくなっています。

サーバとクライアント間のチャットの最後の行は "+OK" となっています。これは問題なくキーに値が格納できたことを表しています。実際、 SET が失敗することはありませんが、 "+OK" がサーバから送られてくることで、サーバがすべての情報を受け取り、コマンドが実装に実行されたことを知ることができます。

それでは、キーの内容を取得してみましょう。

GET foo
$3
bar

SET の場合とよく似ていますね。 "get foo" を送信すると、サーバはまず最初の行として、 $ 文字に続き、キーに格納された値のバイト数を付けて送信してきます。その次に実際のバイト列が送信されます。この場合も、バイト数と実際のデータの間には "\n\r" が付加されています。Redisコミュニティでは、これを「バルクリプライ」と呼んでいます。

それでは、存在しないキーを要求するとどうなるでしょうか?

GET blabla
$-1

キーが存在しない時は、長さの代わりに、 "$-1" という文字列が送信されてきます。バルクリプライにおける-1の長さというのは意味をなさない内容であり、 'nil' の値を指定するために使用され、長さがゼロの値とは区別されます。与えられたキーが存在するかどうかを調べるには、 EXISTS というコマンドを使うことができます。

EXISTS nokey
:0
EXISTS foo
:1

最初に存在しない 'nokey' の存在チェックを行うと、 ':0' という返事が、実際に存在する 'foo' というキーに対してチェックを行うと、 ':1' という結果がサーバから返ってきているのが分かります。コロン(:)から始まるリプライは、数値を返すリプライです。

どうでしょうか?これで基本は理解しました。Redisでサポートしているすべてのコマンドについて知りたい場合は、 コマンドリファレンス を参照してください。また、もしまだ実装されていない言語向けのクライアントライブラリを実装したいと思っているのであれば、 protocol_specification のセクションを参照してください。

ライセンス

RedisはBSDライセンスでリリースされています。詳細については、 ライセンス を参照してください。

クレジット

Redisの開発とメンテナンスは、Salvatore Sanfilippo, アカウント名 ‘antirez’ が行っています。