StrapiにUpstash Redisでサーバーレスキャッシングを導入する方法
プロジェクトを期限内に納品するには、既存の技術をできる限り活用することが重要です。独自実装につながる判断をするたびに、そのソリューションを自前でメンテナンスし続けるコストも考慮しなければなりません。だからこそ、Strapiのようなオープンソースツールは、次のプロジェクトのREST API構築に最適な選択肢となるのです。
Strapiは最先端のヘッドレスCMSです。グラフィカルなインターフェースでスキーマを定義できるため、技術者以外の人でもデータモデリングが可能です。開発チームはバックエンドの実装を気にすることなく、Web・モバイルアプリの構築や新機能の提供に集中できます。何しろ、大規模なオープンソースコミュニティがStrapiのメンテナンスを行っているのですから。
バックエンドの高速化
SQLiteを使用している場合、Strapiは比較的迅速にレスポンスを返しますが、データ量やユーザー数が増えると、これが最善の構成とは言えなくなるかもしれません。市場投入後には、世界各地に散らばる何千ものユーザーを抱えることになる可能性もあります。
その負荷に対応するには、Strapi本体とデータベースの両方をスケールアウトする必要があります。しかし、何かキャッシュを差し込むだけで済んだら便利だと思いませんか?
REST Cacheの登場
StrapiのREST Cacheは、Strapiプラグインのコレクションです。これらを活用すると、StrapiアプリにLRUキャッシュを追加でき、実際のデータベースへのリクエストを大幅に削減できます。
メモリ、Couchbase、Redisがサポートされており、カスタムプロバイダーを自作することも可能です。中でも注目したいのがRedisキャッシュプロバイダーで、これを使えば数分でUpstash Redisに接続できます!
Upstash Redisは、通常Redisを使うほとんどのシナリオで利用できます。最大の違いは、数クリックでセットアップできる点です。さらにグローバルレプリケーションにも対応しているため、Strapiインスタンスは自動的に最寄りのレプリカへルーティングされます。これは高速なキャッシュを実現するうえで非常に重要です。しかもサーバーレスなので、使用した分だけの課金で済みます。
それでは、Upstash RedisでStrapiを動かす具体的な手順を見ていきましょう!
前提条件
このチュートリアルでは、UpstashアカウントとNode.jsのインストールが必要です。加えて、Strapiが推奨するパッケージマネージャーであるYarnも用意してください。
Strapiプロジェクトの作成
すでにStrapiプロジェクトをお持ちの場合は、「REST Cacheの追加」セクションまで読み飛ばして構いません。以下の手順は、動作確認用のデータを準備するためのものです。
まず、Strapiで新しいバックエンドを作成します。次のコマンドを実行してください。
$ npx create-strapi-app@latest strapi-upstash-redis-cache
コマンドが完了すると、Strapiがブラウザを開き、管理者ログイン情報の入力を求められます。ここでデータモデルと最初のコンテンツを作成していきます。
Content-Type Builderによるデータモデリング
ログイン後、StrapiのContent-Type Builderを使って最初のデータコレクションをモデル化できます。図1は、Strapi管理コンソールでContent-Type Builderを選択できる場所を示しています。

「Create new collection type」リンクをクリックして新しいタイプを作成します。名前は「Article」とし、シンプルなテキストフィールドを2つ追加しましょう。1つは短文テキスト用の「title」、もう1つは長文テキスト用の「content」です。
図2は、「Save」ボタンをクリックする前のタイプ設定の画面です。

続いて、このコンテンツタイプの実際のインスタンス(記事データ)を作成します。
Content Managerでのコンテンツ作成
Content Managerの場所は図1で確認できます。そこへ移動し、右上の「Create new entry」ボタンをクリックしてください。
図3に、新しいコンテンツエントリーのUIが表示されています。「Save」と「Publish」ボタンのクリックを忘れないようにしましょう。公開しないまま保存すると、公開APIからアクセスできない非公開ドラフトになってしまいます。

コンテンツタイプへの権限設定
これで記事タイプと実際の記事データは揃いましたが、まだ外部からアクセスできません。これを変更するには、publicロールの権限を更新する必要があります。図4は、ナビゲーション内での位置を示しています。

publicロールをクリックし、次に「Article」の権限を開きます。ここで「find」と「findOne」を選択して「Save」をクリックすれば、APIにアクセスした誰もが全記事の一覧表示と個別記事の取得を行えるようになります。
ブラウザでarticlesリソースを開くと、作成した記事が表示されるはずです。デフォルトのStrapi設定では、次のURLでリソースにアクセスできます。
https://localhost:1337/api/articles
レスポンスは次のようになります。
{
"data": [
{
"id": 2,
"attributes": {
"title": "My First Article",
"content": "This is an article!",
"createdAt": "2022-04-06T15:29:48.104Z",
"updatedAt": "2022-04-06T15:29:48.949Z",
"publishedAt": "2022-04-06T15:29:48.948Z"
}
}
],
"meta": {
"pagination": {
"page": 1,
"pageSize": 25,
"pageCount": 1,
"total": 1
}
}
}
REST Cacheの追加
さあ、いよいよUpstash Redisによるキャッシングを追加するパートです!
そのために、まず3つのパッケージをインストールします。
yarn add strapi-plugin-redis \
strapi-plugin-rest-cache \
strapi-provider-rest-cache-redis
この3つのパッケージにより、StrapiがUpstash Redisデータベースへデータを送信できるようになります。
Upstash Redisデータベースの作成
キャッシュを正しく設定するには、Redisインスタンスへの接続URLが必要です。そのために、Upstash Redisデータベースを作成しましょう。ブラウザでUpstash Consoleを開き、「Create database」ボタンをクリックしてください。
作成処理は数秒で完了します。完了後、「Node」タブを選択し、図5のコード例からデータベースURLをコピーしてください。

REST Cacheの設定
RESTキャッシュを設定するには、config/plugins.jsというファイルを以下の内容で作成します。
config/plugins.js
module.exports = {
redis: {
config: {
connections: {
default: { connection: "REDIS_URL" },
},
},
},
"rest-cache": {
config: {
provider: { name: "redis" },
strategy: {
contentTypes: [{ contentType: "api::article.article", hitpass: false }],
//debug: true,
},
},
},
};
redisフィールドでは、Upstash Redisデータベースへの接続を設定します。先ほどコピーしたURLには、Strapiが必要とする認証情報がすべて含まれています。
rest-cacheフィールドでは、キャッシュが使用するプロバイダーと、キャッシュ対象のコンテンツタイプを指定します。今回は記事コンテンツタイプのみです。hitpass: falseを指定することで、認証が行われた場合でもコンテンツが常にキャッシュされるようになります。
debug: trueのコメントを解除すると、デバッグ出力が表示され、キャッシュが正常に機能しているかどうかを簡単に確認できます。
なお、StrapiはデフォルトでSQLiteを使用しており、開発マシン上でインプロセス動作するため、地理的に離れた場所にデプロイされたUpstash Redisよりも速く感じられることがあります。ただし、本番環境で実際のデータベースサーバーを使用する場合は状況が大きく異なり、キャッシュの効果が明確に現れます。
キャッシュのテスト
すべての設定が完了したら、開発サーバーを再起動します。
yarn run develop
サーバーが起動したら、次のURLで再度アクセスしてみましょう。
https://localhost:1337/api/articles
最初のリクエストはデータベースが処理し、それ以降のリクエストはUpstash Redisが高速に応答します。
まとめ
Upstash Redisを活用すれば、Strapiデプロイの高速化はほんの数分で実現できます。Upstash Consoleが発行するURLを設定ファイルに貼り付けるだけで、面倒なセットアップは一切不要です。
さらに、最初のUpstash Redisデータベースは無料で利用でき、クレジットカードの登録も不要です。ぜひ一度試してみてください!
-
エッジキャッシングで実現する、世界どこでも5ミリ秒のRedisレイテンシ
Redisでは、データベースとクライアントが同じリージョン内にあれば、1ミリ秒のレイテンシは容易に実現できます。しかし、クライアントが世界中に分散している場合、レイテンシは100ミリ秒を超えてしまいます。この課題を解決するために開発されたのが「Edge Caching(エッジキャッシング)」です。 エッジキャッシングとは エッジキャッシングでは、CDNと同じようにREST APIのレスポンスが世界各地のエッジロケーションにキャッシュされます。エッジキャッシングを有効にすると、平均5ミリ秒というグローバルレイテンシを実現できます。実際に、10の異なるリージョンに配置したクライアントからレイテンシ
-
UpstashのPipeline APIでサーバーレスRedisを高速化:複数コマンドを1リクエストで実行
Upstashは、ネイティブなRedis APIに加えてREST APIもサポートしており、開発者はサーバーレス関数やエッジ関数から接続の問題を気にせずRedisへアクセスできます。しかし、同じ関数内で複数のRedisコマンドを実行する場合、その回数だけデータベースへの呼び出しが発生してしまうという課題がありました。 そこで、コミュニティメンバーの一人である@MasterGates氏が、Discordチャンネルで素晴らしい提案をしてくれました。それが「Pipeline API」です。 Pipeline APIとは Pipeline APIは、RedisのPIPELINEコマンドをREST A