为什么GAE内存缓存不断重置?

时间:2015-03-13 00:38:16

标签: java google-app-engine memcached

我正在使用memcache仅使用使用字符串值创建的键来存储整数值。我没有定义到期值,只要谷歌文档可以说,这些值就会挂起。但问题是最老的物品最多停留4小时。通常不到2小时。突然间,一切都变为零。这是代码:

Key mKey=null;
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();

    try {
        mKey=KeyFactory.createKey("device",deviceNo);
        if (memcache.get(mKey)==null) {
        Query query = mgr.createQuery("select d.insDate from TrialCheck d where d.DeviceId = :deviceNo");
        resultList.addAll(query.setParameter("deviceNo", deviceNo).getResultList());
            if (resultList.size()<1){
                resultList.add(0);
            } else {
                for (Integer d:resultList) {
                    memcache.put(mKey, d);
                }
            }
        } else {
            Integer installDate = (Integer) memcache.get(mKey);
            resultList.add(installDate);
        }

我读了一些帖子说它是关于实例发生故障,但我看不到实例和memcache重置之间的任何关联。这种行为对于共享内存缓存是正常的还是代码有问题?

1 个答案:

答案 0 :(得分:3)

共享内存缓存以尽力而为的方式提供缓存容量,并且受App Engine提供的所有应用程序的总体需求的影响。专用的内存缓存提供专门为您的应用程序分配的固定缓存容量。

https://cloud.google.com/appengine/docs/adminconsole/memcache

同样在您的代码中,您将从缓存中获取该项目两次。您调用memcache.get(mKey)来检查它是否为null。如果不为null,则再次将其从缓存中取出并转换为Integer。将第一个memcache.get(mKey)设置为稍后可以使用的变量,因为您可能会遇到缓存在第一个和第二个get之间到期的可能性。

相关问题