Redisの概要
Redis(レディス)は、C言語で書かれたオープンソースのデータベースで、REmote DIctionary Serverを略したものです。
Redisは、イタリアのSalvatore Sanfilippo(サルヴァトーレ・サンフィリッポ)氏により2009年に開発されました。
当初はWebのログをリアルタイムで解析するツールをスケーリングすることが目的でしたが、いろいろなアイデアが追加されたことによりRedisとして誕生しました。
Redisの正確な発音はRedとissを合わせたものとされています。
Salvatore Sanfilippo氏は、2020年6月に開発責任者を辞任しており、現在(2021年9月現在)はRedis社とコミュニティメンバーにより継続して開発が行われています。
従来のRDBMSとは異なり、データをキーとバリューという形式で保存するため、キーバリュー型NoSQLに分類されます(Redisのドキュメントでは、キーバリューストアではなく、データストラクチャーサーバと呼んでいます)。
バリューには文字列や数字の他にリスト、ハッシュ、セット、ソート済みセット、ビットアレー(ビットマップ)、HyperLogLogsを取ることができ、他のキーバリュー型NoSQLと比較しても豊富なデータ構造をサポートしています。
Redisはクエリに対してメモリで応答するため、非常に高速に応答できます。
安価なハードウェアでも1秒間に数万リクエストを処理でき、キャッシュやメッセージングシステムの用途で広く利用されています。
Redisはマスタースレーブ型レプリケーション(データ複製)をすることができ、マスターノードのデータをスレーブノードに複製することができます。
アプリケーションは、スレーブからデータを読むことにより、読み込み負荷分散ができます。
Redisバージョン3からはRedis Clusterという機能が導入され、シャーディング(水平分散)をすることができます。ただし、Redis Clusterの最小推奨構成は、マスタースレーブ型のレプリケーション×3=6台となっています。
この方法では、各ノードがどこにデータが格納されているかを知っており、リクエストが来た時に、自分のノードにデータがないときに、クライアントに対してデータの存在するノードを教える動きになります(下図参照)
Redisのライセンス
Redisのライセンスは、「三条項のBSDライセンス」に基づいて公開され、営利、非営利を問わず、誰でも自由かつ無償で利用・改変・再配布できるようになっています。 一部のサード・パーティー製のソースコードには、異なるBSDまたはBSD互換ライセンスが含まれています。
Redisと同類のソフトウェア
OSSではmemcached、Riak、商用製品ではOracle NoSQL Database、クラウドサービスではAmazon ElastiCache、Microsoft Asure Redis Cache、Google Could Datastoreがあります。
Redisの動作環境
ANSI C言語で書かれており、外部依存性もないため、C言語実行環境であれば動作します。
推奨環境
- Linux (最も推奨)
- FreeBSDやOS XといったPOSIX準拠システム
- SmartOSのようなSolarisシステム(コミュニティーはベストエフォート対応)
コミュニティーではサポートしていない環境
- 64bit Windows
Redisのデータ型と主な操作
格納できるデータ |
例 |
主に可能な操作 |
String |
id : "watanabe" |
CRUD、インクリメント、デクリメント、文字列連結、部分文字列 |
Hashes |
watanabe :{ name : "watanabe" password : "hoge" } |
CRUD、インクリメント、存在確認、 |
Lists |
tweets :["good-morning",
"hello"] |
PUSH、POP、要素数、部分取得、部分削除、他の配列への要素渡し |
Sets |
friends : { "Yamada", "Nomura" } |
CRUD、和集合、積集合、差集合、存在確認、ランダム取得 |
Sorted sets |
friends : { "Nomura", "Yamada" } |
CRUD、順位取得、部分取得 |
Bitmap |
flags: 00101000 |
オフセットを指定した値指定 |
HyperLogLogs |
>pfadd hll a b c d >pfcount hll |
PFADD,PFCOUNT、PFMERGE |
Geospatial |
>GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
|
GEOADD、GEODIST、
GEOHASH、GEOPOS
など
|
Stream(Redis5から) |
>XADD mystream * sensor-id 1234 temperature 19.8
1518951480106-0
|
XADD、XRANGE、XREVRANGE、XACKなど |
Redisの主な機能
非構造データ格納 |
事前にデータの構造を定義すること無く、データを格納できます。 |
---|---|
高速なレスポンス |
データベースに対する問い合わせにはメモリで応答するため、高速なレス
ポンスができます。安価なハードウェアでも1秒間に数万リクエストを処理できるため、キャッシュ層として広く利用されています |
軽量で簡単 |
Redisはひとつのバイナリで完結し、サイズも650Kbyteと非常に軽量です。 |
出版・購読のサポート |
予めクライアントがキー(およびキーパターン)に対して、購読の登録をしていると、そのキー(およびキーパタン)に対してデータの更新(出版)があった際に即座にデータを受診することができます |
レプリケーション(データ複製) |
Redisはマスタースレーブ型レプリケーション(データ複製)をすることができ、マスターノードのデータを非同期でスレーブノードに複製することができます。アプリケーションは、スレーブからデータを読むことにより、読み込み負荷分散ができます。 |
シャーディング(水平分散) |
Version 3から実装されたRedis
Clusterを用いることにより、シャーディングが可能になります |
データ永続化 |
データに対する変更はメモリで応答し、それとは非同期でディスクに書き込まれます。書き込むタイミングについては、前回書き込みからの経過時間と更新回数の2つの値を設定できます。 またデータの更新を追記型ログに書くモードが選択可能で、その場合必ずデータは永続化されますが、応答速度は下がってしまいます。 |
パイプライン |
サーバの応答を待たずにコマンドを発行することができます。 |
期限付き保管 |
データに期限を付けて、期限が切れたデータを自動的に引き落とすことが
できます。 |
データ記憶容量制限 |
データの記憶容量を定め、それよりも多くなった場合に様々なアルゴリズムに従って、データを自動的に追い出すことができます。利用できるアルゴリズムは、LRU、ランダム選定、生存期間順、などを選択することができます。 |
トランザクション |
複数のオペレーション(データ変更、インクリメント、配列への PUSH)を、一貫性を持ちながら実施することができます。 |
LUAスクリプト |
LUAスクリプト言語をクエリ内で評価することができます |
セキュリティ |
Redisはシンプルなクライアント認証のみを提供し、データの暗号化
や、クエリのエスケープは提供したいません。Redisは信頼されたネットワーク内での利用を前提としており、直接インターネットに晒すことは推奨されて
いません。 |
Redisの主な制約
データ容量は物理メモリ量 | Redisは物理メモリ以上のデータ量を扱えません。 (Version 2.0~2.4までの間は仮想メモリという機能が話題に上がっていましたが、2.6から削除されました。) |
トランザクションのロールバック |
トランザクションのロールバックはサポートされていません。「永続化モード」で利用しており、トランザクション中にサーバがダウンした場合、部分的にデータがディスクに書き込まれた状態になります。この場合「redis- check-aof」ツールを用いて部分的に書き込まれた部分を取り除く必要があります。 |
ノードを超えた集合演算 |
水平分散環境において、ノードに分散しているデータに対して集合演算はできません。 |
NRIのRedisサポート(保守/サポートサービス)
Redisのサポート及び各種サービスについてお気軽にお問い合わせください。
Redisのダウンロード
Redisダウンロードページ http://redis.io/download