Redis OM Springの紹介 – RedisとSpringのためのオブジェクトマッピング
RedisとSpringのためのオブジェクトマッピング、さらにその先へ
Redis OM Springは、Springアプリケーションでドメインをモデル化し、データをRedisへ永続化するための新しいクライアントライブラリです。オープンソース版のRedisでも動作しますが、RedisJSONと組み合わせることで、インデックス作成やクエリに関する多くの追加機能を利用できます。
Redisは、そのモジュール群と組み合わせることで、世界最速クラスのデータプラットフォームとなります。しかしその高速性を活かすことは、必ずしも容易ではありませんでした。Redis OM Springは優れた開発者体験を提供します。本記事では、Redis OM Springで何が構築できるのかをご紹介します。
開発の背景
開発者にとって、強力でありながらシンプルな技術に出会うことは稀です。OSS版のRedisだけでも、エンタープライズアプリケーションに必要なさまざまなデータ処理やメッセージングタスクを実行するための、豊富なデータ構造とコマンドが用意されています。
同様に、エンタープライズJava開発の世界では、Springが長年にわたり、大規模で機能豊富なアプリケーション構築の複雑さを克服してきました。この分野においてRedisは、優れたSpring Data Redisによってサポートされており、OSS版Redisとの対話のための低レベル・高レベル両方の抽象化を提供しています。
ただし、Spring Data RedisにはRedisモジュールをサポートしていないという課題があります。Redis社では、検索、JSONのインデックス作成とクエリ、グラフデータ、時系列データ、サーバーサイド計算フレームワーク(Redis Gears)など、Redisのコアデータ構造を拡張する複数の革新的なモジュールを開発しています。私たちはこれらのモジュールを最大限に活用し、より幅広い機能を提供するためにRedis OM Springを構築しました。
Redis OM Springとは
Redis OMファミリーのクライアントライブラリは、選択した言語やプラットフォームに合わせて自然な形で実装された高レベルの抽象化を提供することを目指しています。現在、Node.js、Python、.NET、Springの各コミュニティに対応しています。Redis OM Springにより、開発者はSpring Bootアプリケーションに簡単にRedisのパワーを取り込めます。
具体的には、Redis OM Springは、Spring Data Redis(SDR)フレームワークの上に構築された、堅牢なリポジトリとカスタムオブジェクトマッピングの抽象化を提供します。
現在のプレビューリリースでは、Spring Data Redisのすべての機能に加えて、以下の機能を提供しています。
- JavaからJSONへのマッピング
- 強化されたHashマッピング
- 自動検索インデックス生成
- RediSearchをバックエンドとするSpring Dataリポジトリ
JavaからJSONへのマッピング
RedisJSONを使用してRedisに保存されたJSONドキュメントへJavaオブジェクトをマッピングするには、@Documentアノテーションを使用します。他のSpring Dataエンティティマッピングアノテーションと同様に、クラス宣言に追加します。例えば、Company型のオブジェクトをマッピングしたい場合は、以下のように@Documentを追加するだけです。
このクラスの本体にはいくつかのアノテーションが含まれています。@IdはSpring Data由来のもので、idプロパティをJSONドキュメントを格納するRedisキーとして宣言します。
Spring Dataファミリーのライブラリで最も人気のある機能といえば、宣言的なData Repositoryでしょう。続く2つのアノテーションにより、RediSearchを使ってJSONドキュメントのインデックスを作成できます。これはRedisDocumentRepositoryインターフェースを通じて公開されます。
空のリポジトリ宣言だけで、POJOに対する基本的なCRUD操作、ページネーション、ソートが利用可能になります。
Redis OM Springは、@Indexedまたは@Searchableアノテーションが付いたPOJOフィールドをもとにインデックススキーマを構築します。Company POJOの場合、nameプロパティには「searchable」が指定されているため、そのフィールドに対する全文検索機能が得られます。これはスキーマフィールド定義 $.name AS name TEXT に反映されています。
一方、tagsフィールドには「indexable」が指定されており、TAG型のインデックスフィールドが生成されます。つまり、フィールドの完全一致値でCompanyを検索できます。これもスキーマフィールド定義 $.tags[*] AS tags TAG に反映されています。
シンプルな動的クエリの作成
おそらくRedis OM Springの最も魅力的な機能は、リポジトリインターフェースから実行時に自動的にリポジトリ実装を生成できる点です。適切なフィールドにインデックスが付与されていれば、追加のコードを一切書かずに、以下のようなすべてのクエリを実現できます。
リポジトリプロキシには、メソッド名からストア固有のクエリを導出する方法が2つあります。
- メソッド名から直接クエリを導出する
@Queryまたは@Aggregationアノテーションで手動定義したクエリを使用する
ここで、リポジトリインターフェースに追加されたいくつかのメソッド宣言を見てみましょう。
findOneByName
Redis OM Springは、メソッド名とパラメータから適切なクエリを生成します。また、メソッドの戻り値の型に基づいて、結果のパッケージ化と返却方法を決定します。
findOneByNameはOptional<Company>を返します。「findOne」という名前は、結果が複数存在する場合でも1件のみ返されることを意味します。ライブラリはメソッド名を解析して、必要なパラメータの数を判断します。例えば、メソッド名の「ByName」部分は、nameという単一のパラメータを期待していることを示しています。
findByLocationNear
Redis OM Springは、地理空間データを扱うためのGeoJSON型をサポートしています。クエリで「near」キーワードを使用すると、Point(org.springframework.data.geo.Point)とDistance(org.springframework.data.geo.Distance)型をパラメータとして受け取るようコードに指示することになります。
リポジトリの使用
他のSpring Dataリポジトリと同様に、リポジトリは別のSpringコンポーネントへ注入して使用できます。
まとめ
これはRedis OM Springのプレビューリリースです。今後も構築すべき機能は数多くありますが、今こそ皆さんの協力が必要です。READMEでSpringアプリケーションへの導入方法の詳細をご確認ください。フィードバック、プルリクエスト、Issueを心よりお待ちしています。
-
Redisのパフォーマンスを考える:「遅くしない」という発想が鍵
シンプルなキャッシュ用途からテラバイト級の大規模構成まで、さまざまなユースケースでRedisを活用する多くの方々や企業と対話する機会に恵まれています。その中で、最もよく質問されるトピックが「パフォーマンス」です。Redisのパフォーマンスへの向き合い方は、他のシステムとは大きく異なります。多くのデータベースサーバーでは「パフォーマンスを向上させる」ことを目指しますが、Redisの場合、目標は「遅くしないこと」です。これは根本的に異なるアプローチであり、それを活かすには別のマインドセットが必要です。パフォーマンス指標――レイテンシこそが王様Redisを運用するうえで主に関心を寄せるべきパフォーマ
-
Fastly ComputeでUpstash Redisを活用する方法
この記事では古いバージョンのFastly CLIを使用しています。最新の手順については、こちらの記事をご確認ください。 この記事では、Fastly Compute@Edge上で動作するシンプルなアプリケーションを作成します。このアプリケーションはUpstash Redisにアクセスし、ページビュー数を記録します。 モチベーション エッジコンピューティングは、近年最も注目されているトレンドのひとつです。CloudflareやFastlyといったCDNサービスは、ユーザーが自社のエッジインフラストラクチャ上でアプリケーションを実行できるようにしました。これにより、開発者はグローバルに分散した高