プラットフォームキャッシュについて

#1.キャッシュとは
キャッシュは一時的なデータ保存技術です。

#2.プラットフォームキャッシュとは

- プラットフォームキャッシュは、後でアクセスできるようにSalesforceセッションと組織のデータを格納するメモリレイヤです。
- Platform Cacheを使用すると、再利用可能なデータはメモリに格納されるため、その後のトランザクションで計算やデータベースにアクセスする必要がなし、高速で実行できます。
- プラットフォームキャッシュは、クラウドアプリケーションのRAMのようなものです。

#3.キャッシュには次の 2 種類があります。

- **セッションキャッシュ**：`個々のユーザセッションのデータを保存します。`
- **組織キャッシュ**　　　：`組織のユーザが再使用するデータを保存します。`

#4.キャッシュ対象として最適なデータ
- セッション全体を通して再利用される
- 静的である (急速に変化しない)
- 取得にコストがかかる(DBアクセスまたは複雑計算など)

#5.プラットフォームキャッシュの考慮事項
- キャッシュは永続的ではありません。データ損失に対する保証はありません。
- 組織で Apex クラスを変更すると、一部または全部のキャッシュが無効になります。
- キャッシュ内のデータは暗号化されません。
- **組織キャッシュ**では、同時に発生する複数の Apex トランザクションで読み取りおよび書き込みを並行して行うことができます。(同時書き込みの場合、キー単位で任意設定される)
- キャッシュの欠落が発生する可能性があります。以前キャッシュした項目が見つからない場合を考慮してコードを作成することをお勧めします。または、キャッシュの欠落をチェックする CacheBuilder インターフェースを使用します。
- セッションキャッシュでは非同期 Apex はサポートされません。たとえば、future メソッドや Apex 一括処理をセッションキャッシュに使用することはできません。
- パーティションは、Salesforce 内の制限に従う必要があります。
- セッションキャッシュには最大 8 時間、値を保存できます。組織キャッシュには最大 48 時間、値を保存できます。

#6.プラットフォームキャッシュの制限
**組織の種別ごとに使用できるプラットフォームキャッシュの容量を次の表に示します。キャッシュを追加購入するには、Salesforce の担当者までお問い合わせください。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/5096fab4-5b87-3162-627f-df71450551c4.png)
**パーティションサイズの制限**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/684674a1-8ef6-66c3-68a1-9445708f85c8.png)
**セッションキャッシュの制限**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/65f43e11-96a9-331e-729e-99972354295b.png)
**組織キャッシュの制限**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/bd31bfc7-fd06-91ae-1fc8-411fda8152ae.png)
※1ローカルキャッシュはアプリケーションサーバのメモリ内のコンテナで、ユーザは要求中にローカルキャッシュとやりとりを行います。
#7.プラットフォームキャッシュを使用してデータの格納と取得
```java:セッションキャッシュ使用例
/////////// Apex 使用例 ///////////
//Add a value to the cache
Integer cartValue = 22;
Cache.Session.put('local.myPartition.CartValue', cartValue);
if (Cache.Session.contains('local.myPartition.CartValue')) {
    Integer cachedCartValue = (Integer)Cache.Session.get('local.myPartition.CartValue');
}

//Use of default partition without namespace and partition
Cache.Session.put('CartValue', 22);
if (Cache.Session.contains('CartValue')) {
    Integer cachedCartValue = (DateTime)Cache.Session.get('CartValue');
}

/////////// Visualforce ページ ///////////
<apex:outputText value="{!$Cache.Session.local.myPartition.CartValue}"/>
```
```java:組織キャッシュ使用例
/////////// Apex 使用例 ///////////
//Add a value to the cache
Integer cartValue = 22;
Cache.Org.put('local.myPartition.CartValue', cartValue);
if (Cache.Org.contains('local.myPartition.CartValue')) {
    Integer cachedCartValue = (Integer)Cache.Org.get('local.myPartition.CartValue');
}

//Use of default partition without namespace and partition
Cache.Org.put('CartValue', 22);
if (Cache.Org.contains('CartValue')) {
    Integer cachedCartValue = (DateTime)Cache.Org.get('CartValue');
}

/////////// Visualforce ページ ///////////
<apex:outputText value="{!$Cache.Org.local.myPartition.CartValue}"/>
```

#8.Resource
- [プラットフォームキャッシュの基礎](https://trailhead.salesforce.com/ja/content/learn/modules/platform_cache)
- [プラットフォームキャッシュのベストプラクティス](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_platform_cache_best_practices.htm)
- [プラットフォームキャッシュの制限](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_platform_cache_limits.htm)
- [神速システムを目指そう！10分で分かる！プラットフォームキャッシュ](https://www.terrasky.co.jp/blog/2015/151104_001498.php)
- [Platform Cache](https://rajvakati.com/2017/06/23/platform-cache/)
- [Platform Cache in Salesforce](http://amitsalesforce.blogspot.com/2018/11/platform-cache-in-salesforce-platform.html)
- [Platform Cache In Salesforce](https://www.biswajeetsamal.com/blog/platform-cache-in-salesforce/)
- [Boost Your App's Performance With Platform Cache ](https://www.youtube.com/watch?v=6VcQUz3l790)