java—如何迭代缓存条目

z9smfwbn  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(559)

我在独立环境中使用spring3.1。我正在使用@cacable注解缓存我的条目。
有时我需要迭代缓存列表以获得特定的值(而不是键)。
因此,我设法检索缓存列表,但我如何迭代它的元素。

  1. private ClientDTO getClientDTOByClientId(Integer clientId)
  2. {
  3. Cache clientCache = null;
  4. try
  5. {
  6. clientCache = ehCacheCacheManager.getCache("client");
  7. //need here to iterate on clientCache. how?
  8. }
  9. catch (Exception e)
  10. {
  11. log.error("Couldnt retrieve client from cache. clientId=" + clientId);
  12. }
  13. return clientDTO;
  14. }

我正在使用ehcache机制。

  1. <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
  2. p:cache-manager-ref="ehcache" />
  3. <bean id="ehcache"
  4. class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
  5. p:config-location="classpath:ehcache.xml" />

谢谢,雷。

6fe3ivhb

6fe3ivhb1#

getcache()返回一个net.sf.ehcache.cache,它有一个getkeys()方法,该方法返回可以迭代的缓存键列表。要检索已存储的实际对象(与 Package 的net.sf.ehcache.element相反),请使用element.getobjectvalue()。
edit:根据spring的说法,它们似乎永远都不支持cache.getkeys(),所以您必须强制转换到底层提供程序。
像这样:

  1. public boolean contains(String cacheName, Object o) {
  2. net.sf.ehcache.EhCache cache = (net.sf.ehcache.EhCache) org.springframework.cache.CacheManager.getCache(cacheName).getNativeCache();
  3. for (Object key: cache.getKeys()) {
  4. Element element = cache.get(key);
  5. if (element != null && element.getObjectValue().equals(o)) {
  6. return true;
  7. }
  8. }
  9. return false;
  10. }
kt06eoxx

kt06eoxx2#

另一个解决方案是使用getnativecache()方法将org.springframework.cache.cache解析为javax.cache.cache,并使用java迭代器,因为javax.cache.cache已经扩展了iterable>。
有关更多详细信息,请阅读javax.cache.cache javadoc

  1. Cache cache = (Cache) cacheManager.getCache("yourCacheName").getNativeCache();
  2. Iterator<Cache.Entry> iterator = cache.iterator();
  3. while (iterator.hasNext()) {
  4. String key = (String) iterator.next().getKey();
  5. System.out.println(key);
  6. }
nafvub8i

nafvub8i3#

下面的方法将给出一组缓存对象的键,但是如果在这里添加带有键的缓存,则很容易检索(如果直接添加要缓存的对象列表,则无法检索)。
另外,我在缓存管理器中使用了guavacache,如下所示。

  1. @Bean
  2. public CacheManager cacheManager() {
  3. SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
  4. GuavaCache userLabCache = new GuavaCache("yourCacheName",
  5. CacheBuilder.newBuilder().expireAfterAccess(5, TimeUnit.MINUTES).build());
  6. simpleCacheManager.setCaches(Arrays.asList(userLabCache));
  7. return simpleCacheManager;
  8. }

然后它将返回作为对象的键列表,然后您将获得键,您可以遍历键并从缓存中逐个获取对象。
类中的autowire springboot cachemanager

  1. @Autowired
  2. CacheManager cacheManager;

下面是获取所有密钥的代码。

  1. public Set<Object> getAllCachedUserLabKeys() {
  2. Set<Object> keys = null;
  3. try {
  4. GuavaCache cache = (GuavaCache) cacheManager.getCache("yourCacheName");
  5. if (cache != null) {
  6. ConcurrentMap<Object, Object> cachedMap = cache.getNativeCache().asMap();
  7. keys = cachedMap.keySet();
  8. }
  9. } catch (Exception e) {
  10. LOGGER.error("Unknown exception occured while fetchting all cached User Labs..!", e);
  11. }
  12. return keys;
  13. }
展开查看全部

相关问题