【问题标题】:JCache (JSR-107) vs Spring CacheJCache (JSR-107) 与 Spring Cache
【发布时间】:2016-11-29 08:37:51
【问题描述】:

我们有一个新项目,我开始着手实施缓存机制。经过一番研究,JCache 似乎是显而易见的答案,但 Spring 也有缓存机制。我们正在使用 Spring(这肯定不会改变),因此如果它确保了更好的缓存机制,那么可以原谅依赖问题。

所以我的问题是,每个人的优缺点是什么?与 Spring 的实现相比,JCache 的功能是否相当有限?还是 JCache 现在被认为是新项目的前进方向?

【问题讨论】:

  • Spring 支持许多提供程序,包括 JCache(参见 35.6.5)docs.spring.io/spring/docs/current/spring-framework-reference/…(Spring 的实现非常基本 - 一个 HashMap,不支持 evict 等...)
  • 在我看来,JCache 存在很大缺陷,我认为应该避免。当implementing an adapter 时,我对它的设计决策感到失望。问题包括竞争条件、试图强制执行较差算法的规范、令人反感的 API、难以实现良好性能的设计选择以及无效的 TCK。我不准备收集我的想法公开反对它,但我可以通过私人电子邮件提供其中一些。在您的情况下,您可能希望使用 Spring Cache 注释,因此 JCache 没有提供额外的价值。

标签: java spring caching


【解决方案1】:

这不是“对”的事情。这是一个“和”的事情。来自manual -

就像 Spring Framework 中的其他服务一样,缓存服务 是一种抽象(不是缓存实现),需要使用 存储缓存数据的实际存储 - 即抽象 使开发人员不必编写缓存逻辑,但确实 不提供实际店铺。这种抽象是由 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口。

有一些该抽象的实现可用 盒子:JDK java.util.concurrent.ConcurrentMap based caches, Ehcache 2.x、Gemfire 缓存、Caffeine、Guava 缓存和符合 JSR-107 的缓存(例如 Ehcache 3.x)。请参阅第 36.7 节,“插入不同的 后端缓存”以获取有关插入其他缓存的更多信息 商店/供应商。

例如,我使用 RedisCacheManager 进行 HTTP 会话。

    @Bean
    public CacheManager cacheManager() {
        Map<String, Long> cacheExpiration = new HashMap<>();
        cacheExpiration.put(CACHE_RECOMMENDATION, ONE_HOUR);

        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
        redisCacheManager.setExpires(cacheExpiration);
        return redisCacheManager;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多