Upstash Redis SDK v1.0.0リリースのお知らせ:パイプライン対応と型安全性の大幅強化
本日、@upstash/redis v1.0.0を正式リリースしましたのでお知らせします。
@upstash/redisは、サーバーレス環境向けに設計されたコネクションレス(HTTPベース)のRedisクライアントで、Cloudflare WorkersやFastlyと互換性のある唯一のRedisクライアントです。
v1.0.0の主な新機能
v1.0.0は、従来のライブラリを完全に書き直したバージョンです。ユーザーの皆様から特に多かったご要望が「パイプラインのサポート」と「型安全性の向上」でした。これらの新機能の特性上、v1は後方互換性を持ちませんが、基盤となるREST API自体は変更されていないため、旧バージョンも引き続きご利用いただけます。
ほとんどのコマンドは、redis.setex("key", 2, "value")のように、普段お使いのRedisと同じ構文に従います。一方、hsetなどの一部のコマンドについては、(デ)シリアライズの手間を減らすため、より使いやすいAPIを提供しています。
await redis.hset("123", {
id: "123",
name: { first: "andreas" },
});
このコードは内部的にhset 123 id 123 name {"first":"andreas"}としてシリアライズされ、Upstashへ送信されます。オブジェクトは自動的にシリアライズされるため、自分で変換処理を書く必要はありません。
コマンドの使い方がわからない場合は、エディタがIntelliSenseに対応していればTypeScriptが助けになってくれます。また、すべてのコマンドを網羅したテストコードも公開されているので、使用例として参考にできます。
以下が最も重要な変更点です:
- 明示的な認証
- 各プラットフォーム(Node.js、Cloudflare Workers、Fastly)への最適化
- 型システムの強化
- エラーが例外としてスローされる
- パイプラインのサポート
明示的な認証
特定の関数のみをインポートした際に行われる自動認証は、実際の挙動が期待と異なるという問題を引き起こし、本来なら防げたはずのデバッグ作業に時間を浪費する原因となっていました。特に、環境変数の扱いがプラットフォームごとに異なる場合には顕著でした。そのため、クライアントの認証を明示的に行う方式へと変更しました。
多くのユースケースでは、認証情報を環境変数に保存し、Redisクライアントのセットアップ時に一度だけ読み込むことになるかと思います。@upstash/redisではそのためのショートカットを用意しています。UPSTASH_REDIS_REST_URLとUPSTASH_REDIS_REST_TOKENを環境変数として設定し、デプロイ先のプラットフォームで読み込むだけでOKです。正しく設定されていない場合はエラーがスローされます。
Node.js
import { Redis } from "@upstash/redis";
const redis = Redis.fromEnv();
Cloudflare Workers
import { Redis } from "@upstash/redis/cloudflare";
const redis = Redis.fromEnv();
TypeScriptによる型安全な開発
新しいバージョンでは、すべてのコマンドに対して厳密な型がサポートされており、ミスを早期に発見できるようになっています。型指定は任意で、可能な限り型は自動的に推論されます。
import { Redis } from "@upstash/redis";
const redis = new Redis({
/* auth */
});
type User = {
id: string;
email: string;
};
const user = {
id: "abc",
email: "andreas@upstash.com",
};
await redis.set<User>("userKey", user);
const user = await redis.get<User>("userKey");
// -> user は User 型として扱われる
Redisには省略可能な引数を持つ多くのコマンドがあり、組み合わせもさまざまです。TypeScriptを使えば、1行のコードを実行する前に無効な組み合わせを検出できます。
redis.set("key", "value", {
ex: 60, // 60秒後に有効期限切れ
nx: true, // キーが存在しない場合のみ作成
});
エラーハンドリング
以前のバージョンでは、Upstash HTTP APIからの生のレスポンスがそのまま返されるため、エラーの有無を確認してからスローする処理を自分で書く必要がありました。JavaScriptでは通常、何か問題が起きたときには例外がスローされることが期待されるため、今回そのように変更しました。
今後は、コマンドはデータのみを返し、問題が発生した場合は自動的に例外をスローします。
// `v0.2.1`
const { data, error } = await set("key", "value");
if (error) {
throw new Error(error);
}
// '^v1.0.0'
const data = await redis.set("key", "value");
パイプライン
Upstashでは、RedisコマンドをHTTP経由でパイプライン化し、複数のリクエストをまとめて一括送信できます。これにより実行時間を短縮でき、特にサーバーレス関数を使用している場合にはコスト削減にもつながります。
注意: パイプラインの実行はアトミックではありません。パイプライン内の各コマンドは順番に実行されますが、他のクライアントから送信されたコマンドがパイプラインの合間に割り込む可能性があります。
既存のredisインスタンスから新しいパイプラインを作成できます。
import { Redis } from "@upstash/redis";
const redis = new Redis({
/* auth */
});
const p = redis.pipeline();
パイプラインAPIは、複数のコマンドをチェーンできるように設計されています。すべてのコマンドをパイプラインに追加したら、リクエストを送信し、各要素が同じ順序でコマンドに対応する配列として結果を受け取れます。
p.set("key", 2);
// または直接チェーン
p.incr("key").decrby("key", 2);
const res = await p.exec();
// res[0] => "OK" | p.set("key", 2) の結果
// res[1] => 3 | p.incr("key") の結果
// res[2] => 1 | p.decrby("key", 2) の結果
はじめ方
console.upstash.comにアクセスして、新しいデータベースを作成してください。その後、クイックスタートガイドの手順に従ってください。
以前のバージョンをご利用だった方は、GitHub上のMigrate to v1(移行ガイド)を参照するとスムーズに始められます。
今後のロードマップ
Upstash Redisは最近、redis v6.2との互換性アップデートを受け、新しいコマンドの追加や既存コマンドの拡張が行われました。@upstash/redisでもこれらを近日中にサポート予定です。
また、追加のプラットフォームとして、近い将来Denoのサポートも計画しています。
おわりに
今回は大きな変更であり、アップデートには皆様のお手数をおかけしますが、ぜひ使用感をお聞かせください。
Upstash製品をご利用いただく際の体験向上のため、あらゆるフィードバックを歓迎します。バグ報告、機能リクエスト、コントリビューションへの参加、ヘルプが必要な場合など、GitHub、Twitter、またはDiscordコミュニティまでお気軽にお問い合わせください。
-
Serverless Cloud × Next.js × Upstash Redisで始めるサーバーレスアプリ開発
Serverless Cloudは、Serverless Frameworkを開発したチームが手がけるバックエンドプラットフォームです。クラウドランタイム、CLI、SDKをひとつのプラットフォームに統合し、開発者の生産性向上を強力にサポートします。本記事では、Serverless Redis(Upstash)からデータを読み込むNext.jsアプリケーションを構築し、Serverless Cloudへデプロイするまでの一連の流れを解説します。セットアップまず、以下のコマンドでServerless Cloudプロジェクトを初期化します。npm init cloud対話形式のウィザードが起動するの
-
Upstash Redisで実現するNetlify Graphのグローバルキャッシュ
はじめに先日、Netlifyは「Netlify Graph」という新機能を発表しました。同僚が以前から指摘していた不足していたピースに対して、Netlifyがソリューションへ向けて良い一歩を踏み出した形です。Netlify Graphは、開発者がWebアプリ向けのGraphQL API呼び出しを構築するのを支援する機能です。Netlifyダッシュボード上でGraphQLリクエストを準備すれば、ワンクリックでクライアントコードをプロジェクトに注入できます。Netlify Functionsとサードパーティサービスの課題Netlify Functionsをサードパーティサービスと組み合わせて使う場