RedisMart:Redisで実現するフル機能の小売アプリケーション徹底解説
RedisConfの基調講演デモをご記憶でしょうか?すでにご覧になった方なら、発表された小売アプリケーション「RedisMart」の開発の舞台裏を知るのはきっと楽しいはずです。まだの方は、Yiftach氏とAsh氏によるプレゼンテーションをぜひご覧ください。動画へのリンクを改めて掲載しておきます。
本記事はシリーズの第1回目です。商品カタログ、分散型リアルタイム在庫管理、AI搭載の商品検索という3つの機能の実装方法を通じて、RedisMartの主要な要件とアーキテクチャを解説します。さらに、Redis Enterpriseがこれらすべての機能をどのように支えているのかもご紹介します。
要件定義
ソフトウェア開発でおなじみの流れとして、まず基本となる要件から確認していきましょう。以下は非公式にまとめられたユーザーストーリーです。
小売顧客として:
- 価格帯、他の顧客の評価、ファセット検索など、さまざまな条件で商品を絞り込みながら、カタログや商品詳細へ高速(エンドツーエンドで100ms未満のレイテンシ)にアクセスしたい。応答が遅いと直帰率が跳ね上がってしまいます。
- ブランド名がわからない場合や、以前購入した商品に似たものを探したいときは、画像から商品を検索したい。手持ちのカメラと外観がよく似たモデルを簡単に見つけられたら便利です。
- 安全な配送を受けたい、あるいはオンラインで注文して店舗や店頭で受け取りたい(クリック&コレクト)。
在庫管理者として:
- 優れた出荷体験を顧客に提供するために、正確でリアルタイムな在庫状況を把握したい。
- 人気商品の在庫を確保しつつ、回転の遅い商品の在庫を圧縮するなど、在庫を最適化したい。
- 複数の店舗・物流センター横断の在庫をほぼリアルタイムで把握し、在庫配分を最適化したい。
アーキテクチャ
要件が明確になったところで、Redisがどのように課題解決を支援できるかを見ていきましょう。
- RediSearch:数値フィルター、全文検索、地理インデックス、スコアリング、集約などを組み合わせたリッチな商品検索を可能にします。
- Redis EnterpriseのActive-Active機能:地理的に分散した拠点間でのリアルタイムな在庫レプリケーションを、追加実装なしで実現します。
- RedisAI+RedisGears+RediSearch:データベース統合型の機械学習パイプラインを構築し、リアルタイム推論とベクトル類似検索を支えます。

こうした特徴をもとに、以下のようなシステム設計を描くのはさほど難しくありませんでした。

図のうち、青いボックスは各サービスを、赤いボックスはそれぞれのサービスが利用するデータベースを表しています。
設計では、次のようなマイクロサービスの原則を採用しました。
- サービスごとに独立したデータストアを持つ:各サービスは専用のデータストアを保有し、他サービスのデータストアへ直接アクセスせず、サービスインターフェース経由でデータをやり取りします。
- ポリグロット永続化:各サービスは要件に最適なデータストアを選択します。Redisは複数のモジュールが提供する機能やデータモデルを自由に組み合わせ、用途に合ったデータストアを構築できるデータプラットフォームです。赤いボックスの実装にRedisとそのモジュール群を使ったのは、ごく自然な選択だったと言えます。
実装のポイント
RedisMartは、Webショップアプリケーションが提供するユーザーインターフェースを備えています。顧客向けのフロントエンドUI(小売サイト)と、在庫管理用のバックエンドUIの両方があり、その裏側では複数のサービスが連携しています。
- 購買サービス:予想どおり、顧客の購入処理を担当します。
- 在庫サービス:在庫数の照会に応答し、購入が発生すると数量を減算します。在庫の更新情報は、Redis EnterpriseのActive-Active機能によって他拠点へほぼリアルタイムにレプリケートされます。同時更新への対処にはCRDT(Conflict-free Replicated Data Type)が使われており、今回は「リセット可能な正負カウンター」型を採用することでカウンター値の消失を防止しています。
- 商品カタログサービス:商品情報の提供と、高度な商品検索機能を担います。RediSearchとRedisJSONを導入したRedisデータベースを使用し、RedisJSONによって商品詳細をJSONドキュメントとしてそのまま保存、RediSearchでインデックス作成・クエリ・全文検索を行います。商品の更新もActive-Active機能で複数サイトへ容易に伝播できます。
- 画像認識サービス:画像のベクトル類似検索向けにAIモデルサービング機能を提供します。RedisGears、RedisAI、RediSearchを導入したRedisデータベースを使用し、RedisGearsでデータが存在する場所の近くで実行されるデータパイプラインを構築、RedisAIでモデルのサービングと推論を行い、RediSearchでAIモデルの出力に基づく類似画像検索を実際に実行します。
繰り返しになりますが、本記事はシリーズの第1回目です。個々のサービスの実装詳細については、今後の記事で順次解説していきますので、ぜひお楽しみに。
RedisMartの画面紹介
舞台裏を見たところで、今度はステージ上のアプリケーションの姿を確認してみましょう。

ホームページには主要な商品カテゴリが表示されます。カテゴリをクリックすると、商品カタログサービスへ検索クエリが発行され、該当カテゴリの先頭16件の商品が返却されます。
「Search products」欄では商品の全文検索が可能で、以下のような検索結果ページへ遷移します。

検索結果ページは「ファセット検索」と「結果リスト」の2つのセクションで構成されています。ファセット検索では、メインカテゴリ・サブカテゴリ・価格・評価による絞り込みが可能です。このファセット検索をRediSearchでどう実現しているかは、シリーズ第2回で詳しく取り上げます。ヒントとして、RedisMartのデバッグビューを見てみましょう。

ご覧のとおり、タグと集計(aggregation)が鍵になっています。
画面右上のカメラアイコンをクリックすると、探したい商品の写真を撮影して検索できます。残念ながらDougさんの写真からは、データベース内に別のDougさんを見つけることはできませんでしたが…

…見事にヘッドホンを検出してくれました。

ヘッドホンを購入すると決めたとしましょう。商品を選択したら、RedisMartでショッピングカートに追加できます。チェックアウト時には、配送を選ぶことも、近隣の受取場所で受け取ることも可能です。

この近隣受取機能は、RediSearchのジオ検索が支えています。こちらもデバッグビューで、裏側の仕組みのヒントを確認できます。

顧客が購入を完了すると、在庫サービスが起動して在庫数を減算します。ここでアプリケーションのバックエンド、つまり在庫管理画面に目を向けてみましょう。RedisMartは、各レプリカサイトで即座に在庫更新が反映される様子を可視化します。米国(GCP us-central1)での購入は、一瞬のうちにヨーロッパ(Azure north-europe)へレプリケートされます。

詳細は後続の記事で改めて解説します。ここでのポイントは、ネットワークレイテンシを最小限に抑えながら近隣拠点からデータへアクセスできること、そして複数サイトで同時にデータが更新されてもカウンター値の損失が発生しないことです。
アプリケーションの実際の動作は、以下の動画でご覧いただけます。
まとめ
Redisでフル機能の小売アプリケーションを構築する本ブログシリーズの第1回をお読みいただき、ありがとうございました。ご覧のとおり、Redisリアルタイムデータプラットフォームは、RediSearch+RedisJSONのドキュメントデータベース機能によって商品情報への即時アクセス(100ms未満のエンドツーエンドレイテンシ)を実現します。RediSearch+RedisGears+RedisAIの組み合わせにより、カタログ内から類似商品を探せるAI搭載の画像検索も可能です。さらに、ファセット検索やジオ検索にも対応しました。そして何より、Redis EnterpriseのActive-Active機能をベースに、地理分散型のリアルタイム在庫管理を容易に構築できることをお示ししました。これらすべてにより、Redisリアルタイムプラットフォームは小売企業の購買体験全体の向上、顧客への最高の出荷体験の提供、そしてコスト効率に優れた在庫最適化を強力に支援します。
RedisMart向けに実装した個々のサービスについて詳しく知りたい方は、シリーズ次回の記事をお楽しみに!
自分でも試してみたい方へ。Redisをリアルタイムデータプラットフォームとして使い始めるためのリンクをいくつかご紹介します。
- Redisモジュールの詳細
- github.com/RediSearch
- github.com/RedisJSON
- github.com/RedisGears
- github.com/RedisAI
- Redis Enterprise Cloud
- Active-Active Geo-Distribution
クレジット
このデモアプリケーションにご協力いただいた皆様に、心より感謝申し上げます。
- Yiftach Shoolman氏、Ash Sahu氏:RedisConfでのデモアプリケーション発表
- Redisマーケティングチーム(Udi Gotlieb氏、Ash Sahu氏、Doug Tidwell氏、Bryson Coles氏をはじめとする皆様):デモ要件リストへの貢献、RedisConfの運営、UIデザインの支援、本記事への寄稿
- テクニカルエネーブルメントチーム(Martin Forstner氏、Greg Georges氏、David Maier氏をはじめとする皆様):デモアプリケーションの実装・テスト・設計、本記事への寄稿
- CTOチーム(Leibale Eidelman氏、Guy Korland氏をはじめとする皆様):モジュールおよび画像認識サービスの開発
- プロダクトマネジメントチーム(Pieter Cailliau氏、Emmanuel Keller氏、Jonathan Salomon氏、Amiram Mizne氏をはじめとする皆様):デモ要件リストへの貢献と製品機能の提供
- その他、ここでご紹介しきれなかったすべての皆様
本ブログシリーズを、RedisMartアプリケーションの主任開発者であるMartin Forstner氏に捧げます。彼が最近逝去したことをお伝えすることは、大きな悲しみです。Martinの知識、才能、そしてユーモアのセンスは比類のないものでした。彼は単なるソフトウェアエンジニアではなく、同僚であり、チームメイトであり、メンターであり、かけがえのない友人でした。安らかに眠ってください、Martin。あなたが恋しいです。
-
Cloudflare WorkersとRedisで実現するエッジコンピューティング活用術
エッジコンピューティングは、近年もっとも注目されている技術のひとつです。CDNがファイルをユーザーの近くに配置できるようにしたのと同じように、エッジコンピューティングはアプリケーションそのものをユーザーの近くで実行できるようにします。これにより、開発者はグローバルに分散され、高いパフォーマンスを発揮するアプリケーションを構築できるようになります。 Cloudflare Workersとステートレス性の課題 現在この分野をリードしている製品がCloudflare Workersです。コールドスタートのないサーバーレス実行環境を提供し、Cloudflareのグローバルネットワークを活かすことで、ア
-
Redis GEORADIUSBYMEMBERコマンドの使い方を実例付きで解説 – Redisチュートリアル
このチュートリアルでは、Redisに保存された地理空間データ(ジオスペーシャル値)の中から、特定の範囲内に含まれる要素を取得する方法を学びます。そのために使用するのが GEORADIUSBYMEMBER コマンドです。 GEORADIUSBYMEMBERコマンドとは GEORADIUSBYMEMBERコマンドは、キーに保存された地理空間値(ソート済みセット)のメンバーのうち、指定したメンバーの経度・緯度と半径の引数から算出される円形エリアの境界内にある1つ以上のメンバーを返すために使用します。このエリアは、指定したメンバーの経度・緯度を円の中心位置とし、指定した単位による半径を円の半径として計