我已经使用 JCache API 设置了一个 Memcache 来与之交互。缓存构建如下:
import javax.cache.Cache;
import javax.cache.CacheException;
import javax.cache.CacheManager;
TreeMap<String, String> name2Id = Maps.newTreeMap();
...
if (cache == null) {
@SuppressWarnings("rawtypes")
Map properties = Collections.emptyMap();
cache = CacheManager.getInstance().getCacheFactory().createCache(properties);
CacheManager.getInstance().registerCache(dropDownCache, cache);
log.fine("Registering cache: " + dropDownCache);
}
cache.put(innerCache, name2Id);
我的缓存使用名称“dropDownCache”注册。缓存包含一个键,“innerCache”,其值包含一个映射。该地图包含一组键值,代表下拉菜单的索引内容。
我有一个 cron 作业/任务每分钟都会访问缓存,以确保缓存不会被驱逐。根据文档,我认为我不需要这样做,因为我没有指定驱逐时间,所以密钥永远不会过期。但是,它确实向我表明,在很长一段时间内,缓存很少被驱逐。
问题是,当我自己或其他用户实际使用下拉菜单访问 webapp 上的页面时。当页面出现时,下拉菜单最终会从数据存储中加载,因为注册的缓存不再存在。缓存最终经常丢失,我不明白为什么这与我在 cron 作业/任务中看到的形成鲜明对比。
也许将 Map 作为键存储是不合适的?不过这似乎是合理的。
任何帮助找出我的缓存被驱逐的原因都会有很大帮助。或者有没有办法弄清楚它被驱逐的确切原因?