AWS認定資格 WEB問題集&徹底解説
デベロッパー–アソシエイト
合格に向けて、もっと深く学習する
豊富な問題と詳細なAWSサービス解説を、24時間無料でお試しいただけます
問題文と選択肢
デベロッパーが会社の既存のレコードストレージアプリケーションに Amazon ElastiCache for Memcached を追加しようとしています。デベロッパーは、一般的なレコード処理パターンの分析に基づいて遅延読み込み (Lazy Loading) を使用することにしました。
遅延読み込みを正しく実装する擬似コードの例はどれですか。
遅延読み込みを正しく実装する擬似コードの例はどれですか。
record_value = db.query("UPDATE Records SET Details = {1} WHERE ID == {0}", record_key, record_value) cache.set (record_key, record_value)record_value = cache.get(record_key) if (record_value == NULL) record_value = db.query("SELECT Details FROM Records WHERE ID == {0}", record_key) cache.set (record_key, record_value)record_value = cache.get (record_key) db.query("UPDATE Records SET Details = {1} WHERE ID == {0}", record_key, record_value)record_value = db.query("SELECT Details FROM Records WHERE ID == {0}", record_key) if (record_value != NULL) cache.set (record_key, record_value)
解説
頻出度★★★★★
この問題は、「遅延読み込み(Lazy Loading)」の定義そのものを問うもので、まずキャッシュを見て、ミス(NULL)のときだけ DB から読み、その結果をキャッシュに書くという順序のコードを選べるかがポイント
A.
record_value = db.query("UPDATE Records SET Details = {1} WHERE ID == {0}",
record_key, record_value)
cache.set (record_key, record_value)
DB に UPDATE(書き込み)を実行してからキャッシュを更新しており、これは書き込み時にキャッシュも更新する ライトスルー(Write-Through)の形。
キャッシュを先に参照する動作がまったく無いため、遅延読み込みではない。
ライトスルーはキャッシュを常に最新に保てる利点があるが、本問が求めているパターンとは別物。
正解 B.
B.
record_value = cache.get(record_key)
if (record_value == NULL)
record_value = db.query("SELECT Details FROM Records WHERE ID == {0}",
record_key)
cache.set (record_key, record_value)
まず cache.get でキャッシュを参照し、値が NULL(キャッシュミス)だったときだけ DB に SELECT を投げ、取得した値を cache.set でキャッシュに書き戻している。
これが遅延読み込み(Lazy Loading/Cache-Aside)の教科書どおりの実装で、実際に要求されたデータだけがキャッシュに載るためキャッシュ容量を無駄にしない。
キャッシュヒット時は DB にアクセスしないため、読み取り負荷とレイテンシーを削減できる、唯一の正解。
C.
record_value = cache.get (record_key)
db.query("UPDATE Records SET Details = {1} WHERE ID == {0}", record_key,
record_value)
キャッシュから取得した値をそのまま DB に UPDATE しており、キャッシュミス時の DB 読み取りも、キャッシュへの書き戻しも存在しない。
そもそもデータを読み出す処理として成立しておらず(ミス時は NULL を書き込むことになる)、キャッシュ戦略以前にロジックとして誤り。
遅延読み込みとは無関係な処理。
D.
record_value = db.query("SELECT Details FROM Records WHERE ID == {0}",
record_key)
if (record_value != NULL)
cache.set (record_key, record_value)
キャッシュを一切参照せず、毎回必ず DB に SELECT を実行してからキャッシュに書き込んでいる。
キャッシュがヒットしても DB アクセスが発生するため、キャッシュを置く意味(DB 負荷とレイテンシーの削減)がまったく得られない。
「cache.set がある」だけで正解に見せかけた誤答で、遅延読み込みの要件(キャッシュミス時のみ DB を読む)を満たさない。
構成図
アプリケーション ──1. cache.get──▶ ElastiCache
▲ │
│ ヒットなら値を返す │ ミス(NULL)
│ ▼
└──3. cache.set で書き戻す──── データベース(2. SELECT)
これだけ覚える(記憶フック)
遅延読み込み=キャッシュを引く → 無ければ DB → キャッシュに入れる。先に DB を引いたらそれは遅延読み込みではない。
遅延読み込み=キャッシュを引く → 無ければ DB → キャッシュに入れる。先に DB を引いたらそれは遅延読み込みではない。
正解への思考ルート
問題文から要件を抽出し、選択肢の適否を判断するのがポイントです。| 要件 | 判断ポイント |
|---|---|
| 遅延読み込み(Lazy Loading)を実装する | 処理の起点が cache.get であることが絶対条件。DB クエリから始まるコードは候補外 →選択肢(A・D)を消す |
| キャッシュミス時のみ DB を読む | if (record_value == NULL) の分岐で DB クエリを囲っているかを確認する →選択肢(B)が正解 |
| 取得した値をキャッシュに書き戻す | DB から読んだ値を cache.set で登録し、次回以降はヒットさせる →選択肢(B)が正解 |
| 読み取り処理として成立しているか | キャッシュの値を DB に UPDATE しているだけのコードは、読み取りでもキャッシュ戦略でもない →選択肢(C)を消す |
ひっかけポイント
- 選択肢 D は「DB から読む → cache.set」で一見キャッシュを使っているように見えるが、キャッシュを読む処理が無いため毎回 DB にアクセスする。cache.set があるかどうかで判断しないこと
- 選択肢 A は ライトスルー(Write-Through)のパターン。設問が「書き込み時にキャッシュも最新にしたい」なら正解になり得るが、本問は遅延読み込みを指定している
- 遅延読み込みの弱点は初回アクセスが必ず遅い(キャッシュミス)ことと古いデータが残り得ること。この弱点への対策を問う出題もある(TTL・ライトスルーの併用)
- NULL 判定の向きに注意。正解は == NULL のときに DB を読む。選択肢 D の != NULL は DB から取れたときにキャッシュへ入れる判定であり、意味が違う
出題バリエーション
同じ知識が本番では条件を変えて出題されます。| 問題文がこう変わったら | 正解はこう変わる |
|---|---|
| 「書き込みのたびにキャッシュも更新して、常に最新のデータを返したい」 | ライトスルー(Write-Through)が正解に変わる(選択肢 A 型のコード)。 |
| 「キャッシュに古いデータが残るのを防ぎたい」 | TTL(有効期限)の設定や、更新時のキャッシュ削除(無効化)が正解軸に。 |
| 「ライトスルーで使われないデータまでキャッシュに載るのを避けたい」 | 遅延読み込みとの併用(ライトスルー+TTL)が問われる。 |
| 「キャッシュ自体にレプリケーションやフェイルオーバー、暗号化が必要」 | Memcached では要件を満たせず、ElastiCache for Redis (Valkey) の選択が正解軸に。 |
+ 質問 / コメント
解答・解説に疑問がある場合や、よりよい解説がある場合など、お気軽にコメントください。ただし、短文コメントは表示されません。また、中傷などコメントの内容によっては、会員機能を停止させて頂きます。教え学び合える場になれば嬉しいです。(コメント投稿にはログインが必要です)
正答率 70%
No.4 解説
デベロッパーが会社の既存のレコードストレージアプリケーションに Amazon ElastiCache for Memcached を追加しようとしています。デベロッパーは、一般的なレコード処理パターンの分析に基づいて遅延読み込み (Lazy Loading) を使用することにしました。
遅延読み込みを正しく実装する擬似コードの例はどれですか。
遅延読み込みを正しく実装する擬似コードの例はどれですか。
record_value = db.query("UPDATE Records SET Details = {1} WHERE ID == {0}", record_key, record_value) cache.set (record_key, record_value)record_value = cache.get(record_key) if (record_value == NULL) record_value = db.query("SELECT Details FROM Records WHERE ID == {0}", record_key) cache.set (record_key, record_value)record_value = cache.get (record_key) db.query("UPDATE Records SET Details = {1} WHERE ID == {0}", record_key, record_value)record_value = db.query("SELECT Details FROM Records WHERE ID == {0}", record_key) if (record_value != NULL) cache.set (record_key, record_value)