前回のGAEの「専用Memcacheは共有Memcacheよりも本当に性能が高いのか検証する」が投稿されてからだいぶ時間が経ってしまいましたが、今回はその第二弾です。
前回は「保存容量、読込・書込速度」に観点を置いて調べましたが、今回は「データの残存期間」について違いがあるのかどうかを調べてみました。
※専用Memcache、共有Memcacheの説明や設定方法などは前回冒頭で触れていますので、今回は触れません。
1. フラッシュのタイミング
前回の記事でも少し触れていますが、Memcacheは専用、共有のどちらも永続性やSLAの保証はありませんので、「いつ」という明確なタイミングはわかりません。
※参考URL: https://cloud.google.com/appengine/docs/adminconsole/memcache
明確なタイミングはわからないと前述しましたが、GAE/JのMemcacheServiceではキャッシュ時に有効期限を指定することができます。
※有効期限を指定しても期限内にキャッシュがフラッシュされることはあります。
参考URL: https://cloud.google.com/appengine/docs/java/memcache/#Java_How_cached_data_expires
有効期限の指定方法は下記の3つがあります。
- キャッシュ時からの有効期限をミリ秒単位で指定する
- キャッシュ時からの有効期限を秒単位で指定する
- キャッシュの有効期限を日時で指定する
2. データの残存期間検証
2.1 検証方法
有効期限を指定しないデータと指定したデータの2種類をキャッシュし、
毎分cronでMemcacheの残存内容をメールする。
有効期限は、1分、5分、1時間、10時間、24時間、36時間を設定しました。
2.2 共有Memcacheの残存期間検証結果
- キャッシュ日時: 2014/09/24 16:50:35
- 初回cron実行日時: 2014/09/24 16:52:36
有効期限 | 削除確認経過時間 | 削除確認日時 |
1分 | 2分 | 2014/09/24 16:52 |
5分 | 5分 | 2014/09/24 16:55 |
1時間 | 1時間 | 2014/09/24 17:50 |
10時間 | 10時間 | 2014/09/25 02:50 |
24時間 | 17時間9分 | 2014/09/25 09:59 |
36時間 | 17時間18分 | 2014/09/25 10:08 |
指定なし | 17時間18分 | 2014/09/25 10:08 |
有効期限1分〜10時間までは有効期限まで残存していましたが、
有効期限1日、1.5日、指定なしはキャッシュから約17時間でキャッシュが
削除されてしまいました。
有効期限1.5日と指定なしのキャッシュが同時刻で削除されているので、
たぶんインフラ側で何かしらの理由でキャッシュのフラッシュが実行された
のでしょう。
今回の共有Memcacheの有効期限は現状最大約17時間、ということが言えますね。
2.3 専用Memcacheの残存期間検証結果
- キャッシュ日時: 2014/09/24 16:40:48
- 初回cron実行日時: 2014/09/24 16:42:56
有効期限 | 削除確認経過時間 | 削除確認日時 |
1分 | 2分 | 2014/09/24 16:42 |
5分 | 5分 | 2014/09/24 16:46 |
1時間 | 1時間 | 2014/09/24 17:41 |
10時間 | 10時間 | 2014/09/25 02:40 |
24時間 | 24時間 | 2014/09/25 16:41 |
36時間 | 36時間 | 2014/09/26 04:41 |
指定なし | 56時間36分 | 2014/09/27 01:16 |
有効期限を指定した場合は、全てその時間まで残りました。
有効期限を指定しないものに関しては、56時間36分も残存しました。
ですが、インフラ側の何かしらの事情で消されたのか、何かしらの有効期限で
消えたのか、詳しいことは不明ですね。
ただ、明らかに共有Memcacheよりは長く保持されそう、ということは分かりました。
3. まとめ
以上の検証結果より、残存期間でも専用Memcacheは従来の共有Memcacheよりも
圧倒的に長い時間保持できることが分かりました。
しかし、長い時間データを保持してくれることは分かりましが、最初に触れた通り、
専用Memcacheであってもいつ突然キャッシュがクリアされるか分かりません。
そのことを踏まえると、専用Memcacheの1GB毎にかかる毎月$86.4の課金は少し
割高に感じてしまうかも知れません。
ですが、頻繁にDatastoreへのアクセスがあり、スピーディにデータを取得したいシステムの場合は、大変活躍するAPIになることでしょう。