Google Apps Engine: Memcache / JCache работает только в течение срока действия - PullRequest
1 голос
/ 21 февраля 2010

Я использую jsr107 JCache в Google Apps Engine для сохранения данных сайта. Мой код выглядит так:

    public static String read(String link, boolean UTF8) throws Exception {

    URL url = new URL(link);

    String cached = CacheLogic.instance().get(link);

    if (!StringUtil.isEmpty(cached)) {
     return cached;
    }

    // Here i save the website's context into data

    CacheLogic.instance().put(link, data);

    return data;

    }

Мой CacheLogic:

public class CacheLogic {

 private static CacheLogic singleton;
 private Cache cache;
 private final int TTL = 60;

 public static CacheLogic instance() {

  if (singleton == null) {
   singleton = new CacheLogic();
  }

  return singleton;

 }

 private CacheLogic() {

  Map<String, Integer> props = new HashMap<String, Integer>();
  props.put(GCacheFactory.EXPIRATION_DELTA, TTL);

  try {
   CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
   cache = cacheFactory.createCache(props);
  } catch (CacheException e) {
   e.printStackTrace();
  }

 }

 public void put(String key, String value) {
  cache.remove(key);
  cache.put(key, value);
  CacheStatistics stats = cache.getCacheStatistics();
  System.out.println("[CacheLogic] New entry added. Count=" + stats.getObjectCount());
  System.out.println("[CacheLogic] New entry added. size=" + cache.size());
 }

 public String get(String key) {
  return (String) cache.get(key);
 }

}

Я установил время истечения кеша на 60 секунд, и я вызываю read с аргументами вроде 'http://www.google.com/something' или' https://stackoverflow.com/something'.

Вот вещь.

Если call читает метод read с одними и теми же аргументами все время в течение 60 секунд, когда я впервые вызвал его, я всегда получаю кэшированные данные. Совершенная.

Однако, когда прошло более 60 секунд, я получаю нулевое значение. Я прочитал сайт и положил его в кеш. В следующий раз, когда я это укажу, я снова получаю ноль.

Похоже, что memcache никогда не сохраняет данные после истечения времени истечения, независимо от ключа.

Неправильно ли я использовал API?

ОБНОВЛЕНИЕ 1: я пробовал это только локально.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2010

Недавно прочитал пост (не могу найти его сейчас), что при использовании JCache GCacheFactory.EXPIRATION_DELTA истекает весь кеш, и вы должны использовать Низкоуровневый API для истечения срока действия отдельных объектов.

0 голосов
/ 07 марта 2010

Вот практический пример ...

public class CacheLogic {

 private static CacheLogic singleton;
 private Cache cache;
 //private final int TTL = 60;

 public static CacheLogic instance() {

  if (singleton == null) {
   singleton = new CacheLogic();
  }

  return singleton;

 }

 private CacheLogic() {

  //Map<String, Integer> props = new HashMap<String, Integer>();
  //props.put(GCacheFactory.EXPIRATION_DELTA, TTL);

  try {
   CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
   cache = cacheFactory.createCache(/*props*/);
  } catch (CacheException e) {
   e.printStackTrace();
  }

 }

 public void put(String key, String value) {
  cache.remove(key);
  cache.put(key, value);
  CacheStatistics stats = cache.getCacheStatistics();
  System.out.println("[CacheLogic] New entry added. Count=" + stats.getObjectCount());
  System.out.println("[CacheLogic] New entry added. size=" + cache.size());
 }

 public String get(String key) {
  return (String) cache.get(key);
 }

}

По умолчанию объекты, хранящиеся в кеше, будут оставаться в кеше «как можно дольше». Вы устанавливаете объекты, сохраненные в кэше, для удаления через 60 секунд, и все же вас удивляет, что объекты недоступны через 60 секунд .....

...