【问题标题】:Cache invalidation in EhcacheEhcache 中的缓存失效
【发布时间】:2011-04-29 09:44:12
【问题描述】:

我在 Hibernate 中使用 Ehcache。

如何通知缓存数据库已更改?如何使缓存的数据无效?如何以编程方式实现这一目标?

【问题讨论】:

    标签: ehcache


    【解决方案1】:

    具体是什么意思?有两种方法可以在数据库中进行更改:应用内和应用外

    在应用内,您可以轻松触发失效。第二个更难解决。缓存元素与键一起存储,您可以根据该键将其删除。

    CacheManager manager = CacheManager.getInstance();
    cache = manager.getCache(cacheName);
    cache.remove(key);
    
    or 
    
    cache.removeAll();
    

    当然取决于您如何配置 ehcache。但是您需要知道保存该对象的缓存的名称。

    【讨论】:

      【解决方案2】:

      这就是您可以使所有 EhCache 项无效而无需打扰各个缓存名称的方法:

      CacheManager manager = CacheManager.getInstance();
      
      String[] names = manager.getCacheNames();
      
      for (String name : names)
      {
          Cache cache = manager.getCache(name);
      
          cache.removeAll();
      }
      

      【讨论】:

      【解决方案3】:

      试试:

      CacheManager.create().clearAll()
      

      它会清除CacheManager中的所有缓存。

      要只清除一个特定的缓存,请从缓存管理器中获取它并删除所有元素:

      CacheManager cacheManager = CacheManager.create();
      Ehcache cache = cacheManager.getEhcache(cacheConfiguration.getName());
      cache.removeAll();    
      

      【讨论】:

        【解决方案4】:

        设置缓存过期时间,以便数据的刷新频率与数据库更改的频率相同或更高。

        您还可以仅在缓存中更新数据库中更改的元素。

        【讨论】:

        • 你能解释一下如何设置“缓存过期”吗?
        • Cache Expiration 由 ehcache.xml 中的 timeToLiveSeconds 字段定义...当 timeToLiveSeconds 的值过期时,缓存的元素被认为是无效的,将在请求时从源中获取...获取将导致缓存,从而重置 timeToLiveSeconds 的计时器......例如:
        • 不适用于永不改变的持久缓存条目
        【解决方案5】:

        如果你想删除一个特定的缓存(例如:employeeCache)

        @Autowired
        CacheManager cacheManager;
        

        要使缓存失效的地方,使用下面的代码

            Cache cache = cacheManager.getCache("employeeCache");
            cache.removeAll();
        

        【讨论】:

          猜你喜欢
          • 2010-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 2013-11-06
          相关资源
          最近更新 更多