2017-02-10 5 views
0

У меня есть кэш со всеми сведениями о клиентах, которые ежедневно загружаются с db. Но перед загрузкой ежедневных данных клиента мне нужно удалить все предыдущие записи в кеше.Java Guava Cache: Как очистить все записи кэша?

В настоящее время я делаю:

public enum PeriodicUpdater { 

    TIMER; 
    private final AtomicBoolean isPublishing = new AtomicBoolean(false); 
    private final long   period  = TimeUnit.DAYS.toMillis(1); 

    @Autowired 
    @Qualifier("TestUtils") @Setter 
    private TestUtils testUtils; 

    public synchronized boolean initialize() { 
     return initialize(period, period); 
    } 


    boolean initialize(long delay, long period) { 
     if (isPublishing.get()) { 
      return false; 
     } 
     TimerTask task = new TimerTask() { 

      @Override public void run() { 
       try { 

        String path = getFile(); 
        if(TestUtils.getFileNameCache().getIfPresent(path) == null) { 
         TestUtils.setFileNameCache(testUtils.buildFileCache(path)); 
        } 
       } catch (Exception e) { 
        log.warn("Failed!", e); 
       } 
      } 
     }; 
     Timer timer = new Timer("PeriodicUpdater", true); // daemon=true 
     timer.schedule(task, delay, period); 
     isPublishing.set(true); 
     return true; 
    } 
} 

Я использую кэш здесь:

public class TestUtils { 

     private static Cache<String, Map<String, List<String>>> fileCache = CacheBuilder 
       .newBuilder() 
       .expireAfterWrite(4, TimeUnit.DAYS) 
       .build(); 


    public TestUtils() { 

      String path = getFile(); 
      fileNameCache = buildFileCache(path); 
      } 

    public Cache<String, String> buildFileCache(String path) { 

      Cache<String, String> fileList = CacheBuilder 
        .newBuilder() 
        .expireAfterWrite(4, TimeUnit.DAYS) 
        .build(); 

      fileList.put(path, new Date().toString()); 

      return fileList; 
     } 
/* doing some stuff with the cache */ 

     } 

Является ли это правильно делать? Я не вижу, как кеш очищается. Может ли кто-нибудь исправить меня, если я ошибаюсь?

+1

'Cache' имеет метод' invalidateAll(), который очищает все записи. Я не вижу, чтобы вы это называли. – shmosel

+0

Поскольку вы используете библиотеку google, я отброшу это примечание на [горизонтальное выравнивание] (https://google.github.io/ styleleguide/javaguide.html # s4.6.3-horizontal-alignment) из руководства по стилю Java в Google. – shmosel

+1

Использование библиотеки google и принятие стиля кодирования Google не имеют отношения к делу. (Хотя я нашел горизонтальное выравнивание OP тоже немного тревожным: P) –

ответ

0

Cache.invalidateAll() очистит все записи, находящиеся в кэше.

При этом, если вы намерены ежедневно перезагружать записи, почему вы заканчиваете только содержимое кеша каждые четыре дня? (.expireAfterWrite(4, TimeUnit.DAYS). Просто изменяя 4 к 1 будет перезагружать содержимое раз в день.

Кроме того, как Адриан Shum упомянула вы злоупотребляете перечисления. public enum PeriodicUpdater почти наверняка будет public class PeriodicUpdater.