AWS認定資格 WEB問題集&徹底解説

デベロッパー–アソシエイト

正解 B問題
要復習(もう一度解きたい問題) 1 2 3 4
合格に向けて、もっと深く学習する
豊富な問題と詳細な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.
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 を引いたらそれは遅延読み込みではない。
正解への思考ルート 問題文から要件を抽出し、選択肢の適否を判断するのがポイントです。
要件 判断ポイント
遅延読み込み(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) の選択が正解軸に。
関連サービスの解説 Amazon DynamoDB
Amazon ElastiCache
Amazon RDS
+ 質問 / コメント
解答・解説に疑問がある場合や、よりよい解説がある場合など、お気軽にコメントください。ただし、短文コメントは表示されません。また、中傷などコメントの内容によっては、会員機能を停止させて頂きます。教え学び合える場になれば嬉しいです。(コメント投稿にはログインが必要です)
正答率 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)
    

(会員限定)当問題の評価をお願いします。改善に活用します。