まえがき
一時的なデータの置き場所を検討する際に「リレーショナルデータベースに退避する」「Redisに退避する」の2つが案として出てきたため、それぞれの優劣を整理しつつどちらを選ぶべきか検討してみたいと思います。
例示
以下のような架空のECサイトを例とします。
- カートに商品を入れた後、決済が完了したら購入処理を行う
- 決済は外部決済システムのAPIをリクエストする
- APIのリクエストを行う前に入力内容をどこかに退避しておく
- 決済システムは処理結果をWebhookで通知する
- Webhookを受け取ったら処理結果を確認し、決裁が成功している場合は顧客の入力内容をデータベースに保存する
一時的な入力内容の退避場所としてリレーショナルデータベースとRedisのどちらを選ぶべきか検討していきます。
リレーショナルデータベースとRedisの比較
リレーショナルデータベースが優れているもの
データの永続化
データベースに保存されたレコードはよほどなことが起きなければ消失しません。
一方、Redisはデフォルトではメモリ上で動いています。
ですので、保存されたデータはサーバの停止などで消失する可能性があります。
なお、Redisにデータを永続化する仕組みはありますが、完全な永続化は保証されていません。
データ整合性
トランザクション管理が厳密に行われているのはリレーショナルデータベースです。
ACID特性が保証されており、部分ロールバックなどもサポートされていることが多いです。
Redisはシンプルなトランザクションコマンドが用意されていますが、完全なACID特性を保証していません。
Redisが優れているもの
パフォーマンス
Redisは高速な読み書きを得意としており、その特性を活かしてキャッシュなどに用いられます。
リアルタイム性が求められる処理、あるいは一度に大量の利用者が発生するシステムなどはRedisを使うことでレスポンスの向上に役立てています。
保存可能なデータ構造
Redisは文字列の他にリスト、セット、ハッシュなどのデータ構造が用意されています。
リレーショナルデータベースで同じデータ構造を格納しようとした場合は、
- シリアライズして格納する
- キーバリューで格納できるテーブルを用意して、複数レコードに格納する
などの対応が必要となります。
今回の例における判断
本来はパフォーマンスについて考えるためにどのくらい集中アクセスが来るか等の条件が必要ですが、それよりも下記が重要であるため今回は割愛します。
今回の仕組みの場合、退避してからWebhookのリクエストが届くまでに、入力内容が消えてしまうことが大きな問題となります。
そのため、データの永続化が求められており、リレーショナルデータベースへを選択するほうが好ましいと考えます。
判断を行うために必要な情報
今回の内容を経て、リレーショナルデータベースとRedisのどちらを使うべきかを判断するために以下の情報が必要だと感じましたので最後に記します。
- データは消えても問題ないか
- データの整合性がどのくらい求められているか
- 保存するデータの構造
- 保存するデータのサイズ
- データにアクセスする頻度
- 利用者の数
- スケーリングを行うか