Redis

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

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

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がリリース。新コマンド、オプションを追加。

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

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 (Node.js), Julia, Lua, Nim, Objective-C, OCaml, Perl, PHP, Pure Data, Python, R, Racket, Ruby, Rust, Scala, Smalltalk, Tcl

データタイプ 
Redisではキーと値を紐づけて保存する。しかしRedisと他の構造型ストレージの重要な違いとして、Redisはバイナリ列（文字列, string）だけでなく以下のようなデータタイプをサポートする。Redis ではバイナリ列のことを string と呼んでいるが、特に文字の使用だけに限った物ではない。
 バイナリ列（string）のリスト（両端キューとして利用可能）
 バイナリ列（string）の集合（ソートされない重複のないコレクション）
 バイナリ列（string）のソートされた集合（浮動小数点数のスコアによりソートされた重複のないコレクション）
 バイナリ列（string）のキーと値からなるハッシュテーブル
 ビットマップ
 集合の濃度（元の個数）。分布を表現。

値のデータタイプは、各タイプごとに用意された操作（コマンド）で決定される。RedisはINTERSECTIONやUNION、セットやリストの差分抽出といったサーバーサイド操作をアトミックにサポートする。

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

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

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

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

クラスタリング 

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

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 等に対応。

関連項目 

 NoSQL

脚注

外部リンク 
  
  
 Redis Mailing List Archives 
 Desktop GUI for Redis-Server 
 redisドキュメント日本語訳
 Redis Documentation (Japanese Translation)
 【入門】Redis

分散コンピューティングアーキテクチャ
NoSQLデータベース