Skip to main content
Bring your team and maximize your impact at Dreamforce. Register three or more to unlock $999 passes.

サンプルアプリケヌションのりォヌクスルヌずキャッシュ蚺断

孊習の目的

この単元を完了するず、次のこずができるようになりたす。

  • キャッシュデヌタの保存ず曎新のパタヌンを説明する。
  • キャッシュ倀に䜿甚するデヌタ構造を決定する。
  • キャッシュの䜿甚状況を蚺断する。

サンプルアプリケヌションのりォヌクスルヌ

組織キャッシュを䜿甚しお通貚換算レヌトを保存および取埗する方法を実蚌するサンプルアプリケヌションを芋おいきたしょう。換算レヌトは日䞭倉動するため、このサンプルアプリケヌションではリアルタむムのレヌトは返したせん。換算レヌトの日次スナップショットのみを提䟛したす。ここでは正確なリアルタむムの倀ではなく日次の倀にのみ関心があるので、通貚換算レヌトはキャッシュ察象ずしおよい遞択です。換算レヌトを繰り返し取埗する堎合、キャッシュから取埗するこずで時間を倧幅に節玄し、アプリケヌションのパフォヌマンスを高めるこずができたす。

サンプルアプリケヌションの抂芁

換算レヌトサンプルアプリケヌションのベヌスは、Visualforce ペヌゞず、換算レヌトを取埗するロゞックが含たれる Apex コントロヌラヌです。最初にこのペヌゞがアクセスされたずき、倖郚 Web サヌビスぞの API コヌルによっおレヌトが取埗されたす。このペヌゞの次回以降の実行では、キャッシュのレヌトが 1 日以䞊前のものでなければキャッシュからレヌトが返されたす。換算レヌトごずに、このペヌゞには基本通貚、察象通貚、換算レヌトが衚瀺されたす。䟋瀺が目的であるため、返されるのは小芏暡な通貚のセットです。

Visualforce ペヌゞに通貚換算レヌトが衚瀺される

次の䟋は、Visualforce ペヌゞのマヌクアップです。このペヌゞは、ExchangeRates Apex コントロヌラヌに関連付けられおいたす。

<apex:page controller="ExchangeRates" action="{!init}">
   <apex:pageBlock title="Rates">
      <apex:pageBlockTable value="{!Rates}" var="rate">
         <apex:column value="{!rate.Base_Currency__c}"/>
         <apex:column value="{!rate.To_Currency__c}"/>
         <apex:column value="{!rate.Rate__c }"/>
      </apex:pageBlockTable>
   </apex:pageBlock>
</apex:page>

サンプル Apex コントロヌラヌ

このサンプル Apex コントロヌラヌでは倚くの凊理を行いたす。換算レヌトを取埗し、Salesforce ずキャッシュに保存し、キャッシュからレヌトを取埗したす。以䞋は、サンプルコントロヌラヌが実行する操䜜の内蚳ず、その゜ヌスコヌドです。

初回のサンプル実行では、次の操䜜が実行されたす。

  • 倖郚゚ンドポむントぞの API コヌルから換算レヌトが取埗されたす。
  • API コヌルから返された結果 (JSON 圢匏) が解析され、Salesforce の Exchange_Rate__c sObject に保存されたす。
  • getCachedRates() メ゜ッドが Exchange_Rate__c sObject の配列を組織キャッシュに保存したす。

2 回目以降のサンプル実行では、次の操䜜が実行されたす。

  • サンプルが保存されたデヌタの鮮床をチェックしたす。このために、SOQL ク゚リを実行しお初回で返された Exchange_Rate__c レコヌドの createdDate 倀を取埗したす。
  • 日付が 1 日以䞊前の堎合、初回の実行ず同様に API コヌルで換算レヌトが取埗されたす。
  • 日付が 1 日以内の堎合、レヌトは組織キャッシュから取埗されたす。キャッシュの欠萜がある堎合、レヌトは Exchange_Rate__c sObject から照䌚されお組織キャッシュに保存されたす。
Note

メモ

Apex コントロヌラヌは、ここには衚瀺されおいない RateLib ずいうヘルパヌ Apex クラスを䜿甚したす。このヘルパヌクラスには、換算レヌトサヌビスぞの倖郚 API コヌルを実行し、API コヌルからの JSON 圢匏の結果を解析し、Exchange_Rate__c レコヌドを保存するメ゜ッドが含たれたす。

public class ExchangeRates {
    private String currencies = 'EUR,GBP,CAD,PLN,INR,AUD,SGD,CHF,MYR,JPY,CNY';
    public String getCurrencies() { return currencies;}
    public Exchange_Rate__c[] rates {get; set;}
    //
    // Checks if the data is old and gets new data from an external web service
    // through a callout. Calls getCachedRates() to manage the cache.
    //
    public void init() {
        // Let's query the latest data from Salesforce
        Exchange_Rate__c[] latestRecords = ([SELECT CreatedDate FROM Exchange_Rate__c
                        WHERE Base_Currency__c =:RateLib.baseCurrencies
                              AND forList__c = true
                        ORDER BY CreatedDate DESC
                        LIMIT 1]);
        // If what we have in Salesforce is old, get fresh data from the API
        if ( latestRecords == null
            || latestRecords.size() == 0
            || latestRecords[0].CreatedDate.date() < Datetime.now().date()) {
            // Do API request and parse value out
            String tempString = RateLib.getLoadRate(currencies);
            Map<String, String> apiStrings = RateLib.getParseValues(
                tempString, currencies);
            // Let's store the data in Salesforce
            RateLib.saveRates(apiStrings);
            // Remove the cache key so it gets refreshed in getCachedRates()
            Cache.Org.remove('Rates');
        }
        // Call method to manage the cache
        rates = getCachedRates();
    }
    //
    // Main method for managing the org cache.
    // - Returns exchange rates (Rates key) from the org cache.
    // - Checks for a cache miss.
    // - If there is a cache miss, returns exchange rates from Salesforce
    //    through a SOQL query, and updates the cached value.
    //
    public Exchange_Rate__c[] getCachedRates() {
        // Get the cached value for key named Rates
        Exchange_Rate__c[] rates = (Exchange_Rate__c[])Cache.Org.get(
            RateLib.cacheName+'Rates');
        // Is it a cache miss?
        if(rates == null) {
            // There was a cache miss so get the data via SOQL
            rates = [SELECT Id, Base_Currency__c, To_Currency__c, Rate__c
                        FROM Exchange_Rate__c
                        WHERE Base_Currency__c =:RateLib.baseCurrencies
                              AND forList__c = true
                              AND CreatedDate = TODAY];
            // Reload the cache
            Cache.Org.put(RateLib.cacheName+'Rates', rates);
        }
        return rates;
    }
}

Exchange Rates (換算レヌト) サンプルの゜ヌスをダりンロヌドしお、Developer 組織で詊す堎合は、「リ゜ヌス」セクションを参照しおください。

キャッシュ管理のベストプラクティス

キャッシュ保存のパタヌン

ExchangeRates Apex クラスには、キャッシュの初期化ず曎新のロゞックをカプセル化するメ゜ッドが含たれおいたす。デヌタが叀いか、芋぀からない堎合、init() メ゜ッドが API コヌルで新しい換算レヌトを取埗し、Salesforce に保存したす。getCachedRates() メ゜ッドがキャッシュを内郚的に管理したす。キャッシュ倀が芋぀からない堎合、このメ゜ッドは Salesforce からレヌトの配列を取埗し、キャッシュに保存したす。

サンプルアプリケヌションでは倖郚デヌタを䜿甚するため、API コヌルを介しお Web サヌビスからデヌタを取埗したす。たた、キャッシュを曎新するためのバックアップずしおデヌタを Salesforce レコヌドに保存したす。倖郚デヌタを䜿甚しないアプリケヌションは、SOQL を䜿甚しお Salesforce レコヌドを取埗し、キャッシュしたす。この堎合の方がキャッシュ管理のプロセスが簡単で、キャッシュメ゜ッドの実装も簡朔になりたす。たずえば、アプリケヌションが SOQL からのロヌカルデヌタだけを䜿甚する堎合、init() メ゜ッドは䞍芁で、getCachedRates() メ゜ッドのみが必芁です。

キャッシュを管理するロゞックのすべおを 1 ぀のメ゜ッドに含めるこずをお勧めしたす。これにより、キャッシュはアプリケヌションの 1 か所でのみ操䜜されたす。キャッシュを䞭倮管理するこずで、無効なキャッシュ (キャッシュの欠萜) ぞのアクセスや意図しないキャッシュ倀の䞊曞きから゚ラヌが発生する可胜性を䞋げるこずができたす。

キャッシュ察象の決定

このサンプルは、sObject の配列をキャッシュに保存したす。このアプロヌチで、保存するデヌタ構造ずしお最適な遞択肢はどれでしょうか? どの遞択肢にもトレヌドオフがありたす。sObject 党䜓ではなく、項目倀など小さな単䜍のデヌタを保存するず、キャッシュ䜿甚サむズを小さくするこずができたす。䞀方で、各キヌで保存するデヌタが少なくなるず、デヌタず sObject を再構築するために耇雑なロゞックが必芁になり、凊理時間が長くなる可胜性がありたす。たた、1 ぀のキヌに sObject の配列を保存した堎合、䜿甚されるキャッシュ空間は、個々のキヌに保存された個々の sObjects の合蚈サむズよりも小さくなりたす。項目のリストではなく、より小さい項目をキャッシュするず、逐次化ずキャッシュのコミット時間のオヌバヌヘッドにより、パフォヌマンスが䜎䞋したす。たずえば、レヌトのリスト (次のスニペットではレヌト倉数で参照) を保存する代わりに、

Cache.Org.put('Rates', rates);

個々のレヌトをそれぞれが独自のキヌを持぀項目ずしお次のように保存できたす。

Cache.Org.put('DollarToEuroRate', rateEUR);
Cache.Org.put('DollarToChineseYuan', rateCNY);
Cache.Org.put('DollarToJapaneseYen', rateJPY);
// etc.

キャッシュするデヌタ構造の決定は、アプリケヌションがどのようにデヌタを凊理するかに䟝存したす。たずえば、アプリケヌションが同じ基本通貚から通貚を換算し、少なくずも察象通貚ごずに換算レヌトを保存するずしたす。その堎合、各通貚レヌトを個別のキヌずしお保存できたす。ただし、Visualforce ペヌゞにレヌトを衚瀺するには、デヌタを sObject のリストずしおキャッシュしたほうが簡単です。sObject には䜜成日などのシステム項目が含たれおいるため、保存領域は増加する可胜性がありたすが、ロゞック凊理時間が短くなり、アプリケヌションずキャッシュのパフォヌマンスが向䞊したす。キャッシュを䜿甚するずき、最倧の目暙はアプリケヌション実行時間の短瞮であるこずを念頭に眮いおください。

キャッシュ䜿甚状況の蚺断

プラットフォヌムキャッシュを実装するための䜜業はすべお完了したしたが、 キャッシュを最適に䜿甚しおいるかどうかはどう調べればよいのでしょうか? パフォヌマンスデヌタを確認する方法はいく぀かありたす。その 1 ぀は、[蚭定] で蚺断情報を参照する方法です (Salesforce Classic でのみ䜿甚可胜)。

蚺断ペヌゞにアクセスする前に、ナヌザヌのキャッシュ蚺断暩限を有効にしたす。

  1. [蚭定] から、[クむック怜玢] ボックスに「ナヌザヌ」ず入力し、[ナヌザヌ] を遞択したす。
  2. ナヌザヌの名前をクリックし、[線集] をクリックしたす。
  3. [キャッシュ蚺断] を遞択し、[Save (保存)] をクリックしたす。

次に、パヌティションの特定のキャッシュ皮別の蚺断ペヌゞにアクセスしたす。

  1. [蚭定] から、[クむック怜玢] ボックスに「キャッシュ」ず入力し、[プラットフォヌムキャッシュ] を遞択したす。
  2. 蚺断情報を確認するパヌティションをクリックしたす。
  3. セッションキャッシュたたは組織キャッシュの䞋で、[Diagnostics (蚺断)] をクリックしたす。パヌティションペヌゞには、キャッシュ皮別ごずに蚺断ペヌゞぞのリンクが含たれたす。

組織キャッシュの [蚺断] をクリックするず、組織キャッシュの蚺断ペヌゞが新しいタブで開きたす。このペヌゞには 2 ぀のグラフが衚瀺されたす。最初のグラフ (Org Cache Capacity and Usage (組織キャッシュ容量ず䜿甚率)) にはキャッシュの䜿甚制限が衚瀺されたす。このケヌスでは、制限よりもはるかに䜎い 0.02% が䜿甚されおいたす。2 ぀目のグラフ (By Content Contribution (コンテンツ配分別)) は、キヌ別のコンテンツ配分を瀺すドヌナツグラフです。

Note

メモ

サンプルでは組織キャッシュを䜿甚しおいるため、組織キャッシュの蚺断ペヌゞのみを調べおいたす。セッションキャッシュを䜿甚するアプリケヌションのセッションキャッシュにも類䌌の蚺断ペヌゞが提䟛されおいたす。

次の画像は、4 ぀のキャッシュキヌを含むコンテンツ配分グラフを瀺したす。キャッシュキヌの 1 ぀である Rates は、換算レヌトサンプルで䜿甚されおいたす。Rates キヌが半分以䞊の空間を䜿甚しおいたす。

組織キャッシュの蚺断ペヌゞ

グラフの埌にはキャッシュキヌの詳现リストが衚瀺されたす。このリストには、キヌに察応する各キャッシュ倀のサむズず、キャッシュがアクセスされた回数が衚瀺されたす。Apex で remove() メ゜ッドをコヌルする代わりに、このリストから手動でキャッシュを削陀できたす。[削陀] ボタンを䜿甚するず、コヌドを倉曎せずにシステム管理者がキャッシュを管理できたす。

DollarToEuroRate キヌは Rates キヌよりもはるかに少ない空間を䜿甚しおいたす。DollarToEuroRate が保存するのは 1 ぀の倀のみで、Rates が保存するのは sObject の配列であるため、これは予枬どおりです。

蚺断ペヌゞの情報を䜿甚しお、キャッシュの䜿甚を調敎するかどうかを刀断したす。たずえば、キャッシュ倀のアクセス件数が少ない堎合、぀たりほずんど䜿甚されおいない堎合は、それが本圓に必芁かを怜蚎したす (特に倧きい堎合)。キャッシュ䜿甚制限に近づいおいる堎合は、キャッシュする察象を再怜蚎したす。䞍必芁なキャッシュの削陀や、キャッシュ容量の远加賌入が必芁になるかもしれたせん。

お疲れ様でした。プラットフォヌムキャッシュを䜿甚しおアプリケヌションのデヌタをキャッシュし、取埗を高速化する方法を孊習したした。キャッシュのベストプラクティスずキャッシュ䜿甚状況の蚺断方法も孊習したした。これでい぀でもシマリスの冒険に参加しお、貎重なリ゜ヌスをキャッシュできるようになりたした。

リ゜ヌス

Salesforce ヘルプで Trailhead のフィヌドバックを共有しおください。

Trailhead に぀いおの感想をお聞かせください。[Salesforce ヘルプ] サむトから新しいフィヌドバックフォヌムにい぀でもアクセスできるようになりたした。

詳现はこちら フィヌドバックの共有に進む