Node.js向けRedis OM入門:JavaScript/TypeScriptのための高速オブジェクトマッピング
JavaScriptとTypeScriptのための高速かつ手軽なオブジェクトマッピング
私たちはあるものを作りました。正確に言えば、チームのメンバー数人それぞれが作り、私はそのNode.js版を担当しました。注目に値するかなりクールなものであり、私自身も大いにワクワクしています。その名は「Redis OM for Node.js」です。
Redis OMとは何でしょうか?Redis OMは、Redisのデータ構造をそのままコードにマッピングすることで、Redisを簡単に扱えるようにするライブラリです。「OM」はオブジェクトマッピング(object mapping)の略ですが、将来的にはそれ以上のことにも取り組む予定です。
それでは、詳しく見ていきましょう。
「速い」よりさらに速く
ご存じの通り、Redisは非常に高速なデータストアであり、プログラムが扱いたくなるようなデータ――ハッシュ、リスト、セットなど――を格納できます。これらはプログラマーにとって自然に思考できるデータ構造です。Redisを知らない技術者に説明するとき、私はこう伝えています。「Redisとは、大学で学んだあのデータ構造たちに、通信プロトコルを付けただけのものだ」と。
さらにモジュールを使えば、Redisはもっと強力になります。モジュールはプログラムから扱える新しいデータ構造をもたらします。RedisBloomはブルームフィルタやクックーフィルタといった確率的データ構造を追加し、RedisGraphはCypherによるグラフの保存と検索を可能にし、RedisAIはAI処理に活用できるテンソルを提供します。どれも非常に有用です。
特に注目すべき2つのモジュール
中でも、Redisを「すべてのプログラマーが望む強力なインメモリデータベース」へと進化させてくれるのが、RedisJSONとRediSearchの2つです。
RedisJSONは階層構造を実現します。ハッシュは優れていますが、ハッシュの中にさらにハッシュを埋め込みたい場合はどうでしょう?RedisJSONなら、階層的なデータをJSONドキュメントとして保存できます。
一方、RediSearchは、欲しいデータ構造を見つけ出すための機能です。セットを使って手動でインデックスを作ることもできますが、その方法は限定的で手間がかかります。RediSearchなら、クエリを書くだけで目的のデータに直接アクセスできます。
この2つを組み合わせれば、Redisはなかなか優れたドキュメントデータベースになります。求める階層構造と、その中から関心のあるデータを探し出す能力の両方を手に入れられるのです。まさに一石二鳥です。
実際、この組み合わせはあまりに魅力的だったため、私たちは両者を統合し、「RedisJSON」という名前で提供することにしました。
Node.js版Redis OM
RediSearchのクエリ言語は強力です。非常に強力です。Redis内のハッシュやJSONドキュメントを、多様かつ高度な方法で検索できます。そのパワーが必要な場面では素晴らしいのですが、常に必要とは限りません。私は正直なところ「怠惰な開発者」です。できるだけ簡単に(ただし必要以上に複雑にはせずに)扱いたいのです。
Node.js版Redis OMを書いたのは、まさに物事をできる限りシンプルにするためでした。Redis OMは、ハッシュやJSONドキュメントを自分で定義したクラスにマッピングすることで、Node.jsアプリケーションへのRedis導入を格段に簡単にします。複雑なコマンドは不要。流れるようなインターフェースを持つ、純粋なコードだけです。
基本的な使い方は次の3ステップです。
1. エンティティを定義する
まず、アプリケーションで扱うデータに対応するエンティティクラスを定義します。
2. エンティティを作成して保存する
新しいエンティティのインスタンスを生成し、Redisに保存します。
3. 条件に合うエンティティを検索する
そして、指定した条件に一致するエンティティを検索します。
このライブラリを書いた本人なので贔屓目があるのは承知の上ですが、これはかなりクールだと思いませんか?ここからは、このシンタックスがどのように動作するのかを詳しく見ていきましょう。
仕組み:4つの重要クラス
Node.js版Redis OMで理解しておくべきクラスは4つあります。Entity、Schema、Client、Repositoryです。
Entity(エンティティ)は、アプリケーションで実際に扱うクラスです。作成・読み取り・更新・削除(CRUD)の対象となり、検索されるのもこれらのクラスです。Entityを継承したクラスはすべてエンティティとして扱われます。通常は1行のコードで定義できますが、必要に応じて独自のロジックを追加することも可能です。
Schema(スキーマ)は、エンティティの持つフィールド、その型、そしてRedis内部へのマッピング方法を定義します。デフォルトではエンティティはRedisのハッシュにマッピングされますが、JSONドキュメントにマッピングすることもできます。
Schemaを作成すると、渡されたEntityが自動的に修飾され、定義したプロパティに対応するゲッターとセッターが追加されます。これらのゲッターとセッターが受け入れ、返す型は、スキーマ定義時のtypeプロパティによって決まります。
Client(クライアント)は、Redisへの接続を担います。Clientには、接続を開く・閉じるメソッドや、Redisに対して生のコマンドを直接実行するメソッドが用意されています。日常的には主にopenとcloseを使用します。
Repositoryをインスタンス化するには、SchemaとClientが必要です。Repository(リポジトリ)は、エンティティの読み書きや削除、さらには検索を行うための手段を提供します。
Repositoryが手に入れば、エンティティの作成・読み取り・更新・削除が自由自在に行えます。ここでは例として、私のお気に入りのアルバム(Mushroomheadの作品)のデータを使ってみましょう。
もちろん、Repositoryはエンティティの検索にも利用できます。
コピペしてすぐ試せるよう、サンプルコード全体を1つのブロックにまとめたものもGitHubで公開しています。
以上が、Node.js版Redis OMの全体像です。
まとめ
本記事では、Node.js版Redis OMで何ができるのかを駆け足で紹介しました。さらに学びたい方のために、Redis OMを使ってシンプルなサービスを構築するチュートリアルを用意しています。また、より深く知りたい方は(ぜひそうしてください)、GitHub上のREADMEとAPIドキュメントを参照してください。
もちろん、これはまだ世の中で広く試されていない新しいソフトウェアです。あなたこそがその「荒野」での最初の挑戦者です。ぜひ試してみてください。触って回し、思い切って壊そうとしてみてください。何があり、何が足りないのかを見極めてください。バグを発見したり、理想的な機能のアイデアが浮かんだら、Issueを立てるかプルリクエストを送ってぜひ教えてください。Redis OMをより良いものにするためのご協力を心からお待ちしています。ありがとうございます!
-
Redisを正しく使いこなすための10の実践テクニック
Redisは現在、技術コミュニティで非常に高い注目を集めています。Salvatore Sanfilippo(Antirez)氏の個人的な小さなプロジェクトとして始まったRedisは、今やインメモリデータストレージの業界標準へと成長しました。普及に伴い、Redisを適切に運用するためのベストプラクティスも確立されつつあります。本記事では、Redisを正しく活用するための10のヒントをわかりやすく解説します。 1. KEYS * の使用をやめる 冒頭から強い口調で申し訳ありませんが、これはおそらく最も重要なポイントです。Redisインスタンスのcommandstatsを確認すると、KEYSコマン
-
StrapiにUpstash Redisでサーバーレスキャッシングを導入する方法
プロジェクトを期限内に納品するには、既存の技術をできる限り活用することが重要です。独自実装につながる判断をするたびに、そのソリューションを自前でメンテナンスし続けるコストも考慮しなければなりません。だからこそ、Strapiのようなオープンソースツールは、次のプロジェクトのREST API構築に最適な選択肢となるのです。 Strapiは最先端のヘッドレスCMSです。グラフィカルなインターフェースでスキーマを定義できるため、技術者以外の人でもデータモデリングが可能です。開発チームはバックエンドの実装を気にすることなく、Web・モバイルアプリの構築や新機能の提供に集中できます。何しろ、大規模なオープ