gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:57 29 4
gpt4 key购买 nike

我正在使用 spring 缓存抽象来缓存服务层中的对象。这适用于简单的 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) {
...
}

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

public long countAllMessages() {
...
}

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

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

@Cacheable(cacheName)
public List<Message> findAllMessages() {
...
}

我可以让 count 方法像这样调用 find all 方法:

public long countAllMessages() {
return findAllMessages().size();
}

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

最佳答案

Spring 缓存抽象目前不提供直接访问有关底层缓存统计信息的方法。例如,没有直接的方法来获取所有缓存的大小、缓存对象的键等。它是比那更高层次的抽象。但是,您可以通过 Cache#getNativeCache() 访问底层的 native 缓存类。方法。从 CacheManager 类中获取 Cache 的实例将使您能够访问此方法。假设您知道由 CacheManager 管理的 Cache 实例的底层类型,您可以将它们转换为适当的类型并获得对每个类型的帮助器方法的访问权(假设有)。

例如,如果您的底层缓存存储是 EHCache,您可以通过调用 CacheManager#getCache("messages") 获取名为“messages”的缓存实例.然后您就可以检查类型并将类型转换为 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;
}
}

关于java - 如何使用 spring 缓存抽象返回条目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14035799/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com