Redis

Redisは、ネットワーク接続された永続化可能なインメモリデータベース。連想配列、リスト、セットなどのデータ構造を扱える。いわゆるNoSQLデータベースの一つ。オープンソースソフトウェアプロジェクトであり、Redis Labsがスポンサーとなって開発されている。

1. 歴史
-----

Redisの名称はenを意味している。元々の開発者はVMware所属のエンジニアSalvatore Sanfilippoである。2013年5月からは、RedisはVMwareをスピンオフしたPivotal Softwareにスポンサーされるようになった。2015年6月からは、Redis Labsがスポンサーとなっている。

DB-Engines.comの月間ランキングでは、Redisはしばしば最もポピュラーなキー・バリュー型データベースとして評されている。また、Redisは2015年のユーザーレビューによる満足度と市場でのプレゼンスの評価でNoSQLデータベースで4位を、Docker等の各種コンテナ上で使われているNoSQLデータベースとして1位を、さらに上位50デベロッパーツール&サービスにおけるNoSQLデータベースとしても1位を獲得している。

2017年09月 - RedisEnterpriseがRedis 4.0をサポート開始。
2017年11月 - RedisEnterprise 5.0を提供開始。
2018年10月 - Redis5.0がリリース。Redis Streamが導入される。
2020年04月 - Redis6.0がリリース。ACLのサポートを拡大。
2020年04月 - RedisEnterprise 6.0を提供開始。
2022年04月 - Redis7.0がリリース。新コマンド、オプションを追加。

2. 対応するプログラミング言語
----------------

以下のような数多くのプログラミング言語からの使用が可能である。

ActionScript, Bash, C, C++, Chicken Scheme, Clojure, Common Lisp, C#, Crystal, D, Dart, Delphi, Deno, Elixir, Emacs Lisp, Erlang, gawk, GNU Prolog, Go, Haskell, Haxe, Io, Java, JavaScript , Julia, Lua, Nim, Objective-C, OCaml, Perl, PHP, Pure Data, Python, R, Racket, Ruby, Rust, Scala, Smalltalk, Tcl

3. データタイプ
---------

Redisではキーと値を紐づけて保存する。しかしRedisと他の構造型ストレージの重要な違いとして、Redisはバイナリ列だけでなく以下のようなデータタイプをサポートする。Redis ではバイナリ列のことを string と呼んでいるが、特に文字の使用だけに限った物ではない。

バイナリ列のリスト
バイナリ列の集合
バイナリ列のソートされた集合
バイナリ列のキーと値からなるハッシュテーブル
ビットマップ
集合の濃度。分布を表現。値のデータタイプは、各タイプごとに用意された操作で決定される。RedisはINTERSECTIONやUNION、セットやリストの差分抽出といったサーバーサイド操作をアトミックにサポートする。

4. 永続性
------

Redisでは一般的に全てのデータはメモリ上に格納される。バージョン2.4よりバーチャルメモリと名付けられたデータをディスク上に格納する機構が使用可能となったが、これは後に非推奨となっている。永続性を実現するための方法としては、3.2現在では2つの手段が用意されている。1つ目はスナップショットと呼ばれるもので、スナップショットではメモリ上のデータは非同期で時折RDBダンプの形式でディスク上に書きこまれる。もう1つの手段が、1.1から存在するAOF  と呼ばれるもので、こちらはメモリ上のデータが変更されるごとにトランザクションログが書きこまれる安全な方式となっている。Redisはトランザクションログの肥大化防止のためにバックグラウンドでこれを再生成することができる。

デフォルトでは、Redisは2秒間隔でデータをファイルシステムに書きこむようになっているが、必要であればより安全なオプションを使用することもできる。デフォルト設定でシステムが完全に失敗した場合でも、失われるデータは数秒間分に限られる。

5. レプリケーション
-----------

Redisはマスター・レプリカ・レプリケーションをサポートする。Redisサーバーのデータは、複数台のレプリカに複製できます。レプリカは、他のレプリカのマスターになることができます。これにより、Redisは単一ルートのレプリケーションツリーを実装できます。Redisのレプリカには書き込みを許可する設定も可能で、その場合インスタンス間の不整合を許容する形になる。Redisは出版-購読型モデル  を完全に実装しており、マスターで出版  されたメッセージは、レプリカに接続して購読  しているクライアントにも到達する。レプリケーションは、読込みの拡張性とデータの冗長性向上に有効である。

6. 性能
-----

データの永続性が必要ない場合において、Redisはメモリ上のみで動作することが可能であり、トランザクションのコミットごとにディスクへの書き込みが発生するデータベースと比べて性能的に優位である。Redisの操作はシングルスレッド上のシングルプロセスとして動作する。そのため、1つのRedisインスタンスでは例えばストアドプロシージャのように並列に処理を実行することはできない。

7. クラスタリング
----------

Redisプロジェクトはクラスター仕様を持っており、開発者のSanfilippoはRedis clusterの製品版ではキー空間の自動パーティショニングとホットリシャーディングをサポート、ただしシングルキー操作のみに対応、という投稿を行っている。将来のバージョンでは、1000以上のノードをサポートし、ハートビート と障害検知によりフォールトトレランスを実現、スレーブのマスターへの昇格、全ノードへの出版-購読モデルなどが構想されている。

8. Redis Stack
--------------

Redis に加えて下記の物を加えた物を Redis Stack として配布している。これらのソフトウェアはオープンソースではなく、ソースアベイラブルで配布されている。

RedisInsight - Redis のデータ内容を見られたりする管理ツール
RedisJSON - JSONデータベース
RediSearch - 全文検索、緯度経度検索、ベクトルデータベースによる類似文章検索など
RedisTimeSeries - 時系列データベース
RedisBloom - 確率分布の扱い以下はかつて Redis Stack に含まれていた物。

RedisGraph - グラフデータベース。Cypherをクエリ言語として採用している。2023年7月5日にサポート終了が発表された。Redis Stack には含まれていない関連プロジェクトとして以下のものがある。

RedisGears - Python, Java などの関数を Redis 上で実行する
RedisAI - 深層学習を Redis 上で実行する。TensorFlow, PyTorch, ONNX Runtime 等に対応。

9. 関連項目
-------

NoSQL

10. 脚注
------

11. 外部リンク
---------

antirez/redis}}
[1]
[2]
[3]
[4]
[5]