如何使用spring缓存抽象返回条目数

Sol*_*ris 8 java spring caching

我使用spring cache abstraction来缓存服务层中的对象.这适用于简单的get/put操作,如下所示:

static private final String cacheName = "messages";

@CacheEvict(value=cacheName, key="#message.id")
public void deleteMessage(Message message) {
...
}

@Cacheable(value=cacheName, key="#id")
public Message findMessage(Long id) {
...
}

@CachePut(value=cacheName, key="#message.id")
public void saveMessage(Message message) {
...
}

@CachePut(value=cacheName, key="#message.id")
public Message updateMessage(Message message) {
...
}
Run Code Online (Sandbox Code Playgroud)

但是,我将使用什么注释用于以下方法:

public long countAllMessages() {
...
}
Run Code Online (Sandbox Code Playgroud)

由于所有对象都在缓存中,因此应该有一种方法可以从缓存中获取答案,而不必转到存储库层.

此外,缓存正在应用于以下方法:

@Cacheable(cacheName)
public List<Message> findAllMessages() {
...
}
Run Code Online (Sandbox Code Playgroud)

我可以使count方法调用find all方法,如下所示:

public long countAllMessages() {
    return findAllMessages().size();
}
Run Code Online (Sandbox Code Playgroud)

但是在禁用缓存的情况下这不会有效,因为调用会从db加载所有记录而不是执行SELECT COUNT(*)...

Jas*_*Day 12

Spring缓存抽象目前不提供访问底层缓存的统计信息的直接方法.例如,没有直接的方法来获取所有缓存的大小,缓存对象的键等.它是一个更高级别的抽象.但是,您可以通过Cache#getNativeCache()方法访问底层本机缓存类.从CacheManager类中获取Cache实例将允许您访问此方法.假设您知道CacheManager管理的Cache实例的基础类型,您可以将它们转换为适当的类型,并获得对每个类型的辅助方法的访问权限(假设有任何).

例如,如果底层缓存存储是EHCache,则可以通过调用CacheManager#getCache("messages")来获取名为"messages"的Cache实例.然后,您可以检查类型并将类型转换为net.sf.ehcache.Ehcache,您可以从中调用各种统计信息辅助方法(例如getStatistics()).

这是一个通过CacheManager管理的所有缓存的示例,检查它们是否为net.sf.ehcache.Ehcache类型,然后获取其统计信息.

public class EhCacheStatistics {
  private CacheManager cacheManager;

  @Inject
  public void setCacheManager(CacheManager cacheManager) {
    this.cacheManager = cacheManager;
  }

  public long getTotalEhCacheSize() {
    long totalSize = 0l;
    for (String cacheName : cacheManager.getCacheNames()) {
      Cache cache = cacheManager.getCache(cacheName);
      Object nativeCache = cache.getNativeCache();
      if (nativeCache instanceof net.sf.ehcache.Ehcache) {
        net.sf.ehcache.Ehcache ehCache = (net.sf.ehcache.Ehcache) nativeCache;
        totalSize += ehCache.getStatistics().getObjectCount();
      }
    }
    return totalSize;
  }
}
Run Code Online (Sandbox Code Playgroud)