🐙

[2023年5月版]Redis 再入門 その①: Redis Stackとは

2023/05/15に公開1

Redis 再入門

正直、ただの"キャッシュサーバー"としか思ってなかったRedisですが、Auto-GPTのコード解説で発見してしまいました。Redisでベクトルの類似性検索ができるだなんて…

というわけでRedisがただのキャッシュサーバーではないらしい?というところを深堀してみたいと思います。

キャッシュサーバーとしての Redis

まず Redis 本来の機能である"キャッシュサーバー"としての機能をまず振り返ってみたいと思います。

キャッシュサーバーとは?

まずキャッシュサーバーについてですが、これは、データや情報を一時的に保存し、その情報への後続のリクエストを高速に処理するためのサーバーです。

たとえばWebページ、API呼び出し、データベースクエリの結果など、頻繁にアクセスされるデータを一時的にはキャッシュサーバーに保存しておきます。
データがキャッシュサーバーに存在する場合(キャッシュヒットと呼ばれます)、そのデータはキャッシュから直接返され、データの元のソース(例えば、データベースやWebサーバー)へのアクセスは必要ありません。これによりレスポンス時間が大幅に短縮され、元のソースへの負荷も軽減されます。データがキャッシュサーバーにない場合(キャッシュミスと呼ばれます)、データは元のソースから取得され、後のリクエストのためにキャッシュに保存されます。

キャッシュサーバーは、ウェブサイトのパフォーマンスを向上させ、データベースの負荷を軽減し、エンドユーザーにより速いレスポンス時間を提供するために幅広く使用されています。
WEBサイトをキャッシュする"CDN"サービスなどがまさにキャッシュサーバーの最もインパクトのある例、ではないでしょうか?

Redis の概要

さてRedisについてですが以下の公式ドキュメントを参考に、ざっくり説明いたします。

https://redis.io/docs/about/

Redisはオープンソース(BSDライセンス)のインメモリデータストアで、データベース、キャッシュ、メッセージブローカー、ストリーミングエンジンとして使用されます。様々なデータ構造を提供し、組み込みのレプリケーション、Luaスクリプティング、LRU排出、トランザクション、ディスク永続性、そして高可用性を実現します。また、アトミック操作を支え、最高のパフォーマンスを達成するためにインメモリデータセットで動作します。非同期レプリケーションをサポートし、トランザクション、パブ/サブ、Luaスクリプティングなどを含んでいます。多くのプログラミング言語から使用可能で、Linux、*BSD、Mac OS XなどのPOSIXシステムで動作します。

Redis の機能

続いて Redisの機能についても超ざっくりおさらいしておきましょう。

  1. データ構造: Redisは様々な種類のデータ構造をサポートしています。これには、文字列、リスト、セット、ソート済みセット、ハッシュ、ビットマップ、ハイパーログログ、地理空間インデックス、ストリームが含まれます。

  2. トランザクション: Redisは複数のコマンドを一つのトランザクションとして実行する機能を提供します。

  3. Pub/Sub: Redisは、メッセージングシステムとしての機能を持っており、パブリッシャー/サブスクライバーモデルをサポートしています。

  4. Luaスクリプティング: RedisはLuaスクリプティングをサポートしており、これにより、複雑な論理をサーバー側で実行することが可能となります。

  5. ディスクへの永続化: RedisはRDB(定期的なスナップショット)とAOF(書き込みのログ)の2つの主要なディスクへの永続化メカニズムを提供します。

  6. レプリケーション: Redisはマスター-スレーブレプリケーションをサポートしており、データの冗長性と可用性を高めることができます。

  7. 高可用性: Redis SentinelとRedis Clusterを用いて、自動フェイルオーバーとデータ分割を実現します。

  8. LRUキャッシュの排出: Redisは、キャッシュのメモリが一杯になったときにどのデータを削除するかを決定するためのLRU(Least Recently Used)排出戦略をサポートしています。

  9. 有効期限付きキャッシュ: Redisは、一定期間後に自動的に削除されるキーを設定する機能を提供します。

  10. 各種プログラム言語サポート: Redisは多くのプログラミング言語から利用できます。公式やコミュニティによるクライアントライブラリが存在します。

このようにシンプルながら非常に強力な機能を有しています。特に個人的にはRedisだけでクラスタが構築できるのが非常にありがたいです。
インメモリのキャッシュサーバーとは言いつつも、クラスタ構成によって非常に堅牢な"一時ストレージ"がお手軽に構築できる。
ここがRedisの強みなんじゃないでしょうか。

サポートしているデータ型

Redisでサポートされるデータ型は以下の通りです。

  • Strings: もっとも基本的な型。ただしテキスト以外にもシリアル化されたオブジェクト、バイナリ配列などのバイトシーケンスが格納可能。ビット単位の操作もできる。
  • Lists: Stringsがリンクされたリストです。スタックとキュー、バックグラウンドワーカーのキューなどに利用される。
  • Sets: 一意のStrings (メンバー) の順序付けされていないコレクション。一意アイテムの追跡、リレーションの表現、交差、和集合、差分などの一般的な集合演算が可能です。
  • Hashes: フィールドと値のペアのコレクションとして構造化されたレコードタイプ。基本的なオブジェクトを表現したり、カウンターのグループの保存などができる。
  • Sorted Sets: 関連付けられたスコアによって順序付けされた一意のStrings (メンバー) のコレクション。複数の文字列が同じスコアを持つ場合、文字列は辞書順に並べられる。
  • Streams: 追加専用のログのように機能するデータ構造。ストリームを使用すると、イベントをリアルタイムで記録し、また同時に配信が可能。
  • Geospatial: 地理空間データ。地理空間インデックスを使用すると、座標を保存して検索できる。指定された半径または境界ボックス内の近くの点を見つけるなどが可能。
  • HyperLogLog: HyperLogLog[1] は、セットのカーディナリティを推定するデータ構造です。確率的データ構造として、HyperLogLog は完全な精度と引き換えにスペースの効率的な利用を実現します。Redisでの実装は最大 12 KB を使用し、標準誤差は 0.81% です。
  • Bitmaps: 文字列データ型の拡張機能であり、文字列をビットベクトルのように扱うことが可能。1つ以上の文字列に対してビット単位の演算を実行することなどができる。
  • Bitfields: ビットフィールドを使用すると、任意のビット長の整数値を設定、増分、取得できる。たとえば、符号なし 1 ビット整数から符号付き 63 ビット整数まで、あらゆるものを操作できる。内部ではバイナリでエンコードされた Redis Stringsとして保存されており、アトミックな読み取り、書き込み、インクリメント操作をサポートしているため、カウンターや同様の数値の管理ができる。

以上です。
特に地理空間やストリームなどRedisだけで全然、イケるのがびっくりです。また地味ですがビットマップやビットフィールドなど細かいデータ操作もアトミックにできるのがすごい便利になってます。
Redis、これだけでもめっちゃ進化してまして、若干おなかいっぱいです。

Redis Stack

さて、それではこのキャッシュサーバー Redis をより強力なモノに仕立てる機能群が "Redis Stack"であります。
"ベクトルの類似性検索"もRedis Stackの一つの機能です。

概要と機能

それではさっそく Redis Stack の概要について以下のページを参考に、超ざっくりと概要を述べます。

https://redis.io/docs/stack/

Redis Stackとは、上記の Redis の機能に以下の機能を追加した拡張パックです。

  • 確率的データ構造
  • クエリ可能な JSON ドキュメント
  • ハッシュと JSON ドキュメントにわたるクエリ
  • 全文検索を含む時系列データのサポート (取り込みとクエリ)
  • Cypher クエリ言語を使用したグラフ データ モデル

上記の機能を実現するために、RedisBloomRedisJSONRediSearchRedisGraphRedisTimeSeries の5つのモジュールが同梱されています。

さらに "RedisInsight" という開発ツールも別途、用意されています。以下のような機能を提供します。

  • ブラウザ ツールを使用してデータ構造を視覚的に表示し、名前空間に従ってキーをグループ化します。
  • ほとんどの Redis スタック データ構造で CRUD を使用します。
  • インテリジェントなコマンドのオートコンプリートと複雑なデータの視覚化を備えた高度なコマンドライン インターフェイスである Workbench を活用します。
  • プロファイラー ツールを使用して、Redis へのトラフィックをリアルタイムで分析します。
  • いつでも組み込み Redis CLI を使用できます。
  • メモリ分析ツールを使用してメモリ使用量を分析します。
  • Slowlog ツールを使用してボトルネックを特定し、トラブルシューティングします。

上記の2つの大きな機能群を提供するにあたって以下の2つのパッケージがあります。

  1. Redis Stack Server : このパッケージには、Redis OSS とモジュール拡張機能のみが含まれています。開発者デスクトップ アプリケーションである RedisInsight は含まれていません。このパッケージは運用環境のデプロイに最適であり、ドロップインの置き換えとなることを目的としています (たとえば、すでに Redis OSS をキャッシュとしてデプロイしている場合)。RedisInsight は引き続き個別にダウンロードできます。

  2. Redis Stack : このパッケージには、開発者が必要とするすべてが 1 つのバンドルに含まれています。これには、Redis Stack Server (Redis OSS およびモジュール拡張機能) と RedisInsight デスクトップ アプリケーション (または Docker コンテナーの一部) が含まれます。アプリケーションをローカルに作成し、それが Redis とどのように対話するかを調べたい場合は、これが最適なパッケージです。

ダウンロードページ のトップからダウンロードできる "Redis Stack"は2.のRedisInsightを含んだツール群です。ここから各種OS向けパッケージをダウンロードするか、Dockerで立ち上げるかなどが可能です。
"Redis Stack Server"はダウンロードページ の下部から各種OS向けパッケージがダウンロードできます。もしkはDockerで立ち上げが可能です。

それでは今回はここまでとして、次回は実際に Redis Stackの構築とPythonからの操作を行い、それぞれのモジュールと機能を確かめてみたいと思います!

脚注
  1. HyperLogLogについては右のページがわかりやすいかもです。https://zenn.dev/masatana/articles/3140f10708ddcf ↩︎