【问题标题】:What does Spring's @Cacheable do when placed on a method returning a list?Spring 的 @Cacheable 放在返回列表的方法上时会做什么?
【发布时间】:2015-09-17 07:17:49
【问题描述】:

我在网上到处寻找上述问题的简单答案,但找不到。我有这样的方法:

@Cacheable(cacheNames = "objects")
public List<Object> get() { .. }

我将 EhCache 2.10.0 与 Spring Framework 4.2.1 一起使用,我可以看到此方法的以下输出:

Adding cacheable method 'get' with attribute: [CacheableOperation[public java.util.List com.example.DAO.get()] caches=[objects] | key='' ...

也(在以后的日志中)

Computed cache key 'SimpleKey []' for operation ...

@Cacheable 注释应该 在这种情况下做什么?将每个对象放在由 hashCode 键入的缓存中(如其他地方所暗示的那样)?或者只是将整个列表按原样放入某个基于列表的 hashCode 下的缓存中?

【问题讨论】:

    标签: java spring ehcache


    【解决方案1】:

    Spring Doc 提到了这一点:

    由于缓存本质上是键值存储,因此每次调用 cached方法需要翻译成合适的key进行缓存 使用权。开箱即用,缓存抽象使用一个简单的 KeyGenerator 基于以下算法:

    • 如果没有给出参数,返回SimpleKey.EMPTY

    • 如果只给出一个参数,则返回该实例

    • 如果给定多个参数,则返回根据所有参数的哈希计算的键。

    https://docs.spring.io/spring/docs/5.0.8.RELEASE/spring-framework-reference/integration.html#cache

    当你用@Cacheable(cacheNames = "objects") 注释它时,你给它一个缓存名称,它可以根据它来识别缓存。由于您的方法没有任何参数,因此将 cacheName 作为“对象”,它已经缓存了返回对象(在这种情况下为List&lt;Object&gt;)。并且每次调用该方法时,它都会使用cacheName 对象和键值为'0' 来检查缓存。如果它已经有一个之前缓存的返回对象,它将返回该对象。

    更新:使用 SimpleKey.EMPTY 键,Spring 4+ 没有参数

    【讨论】:

    • 那么它会在第二次调用 get() 方法时返回整个列表?
    • 是的。由于它已经记录了该方法已被执行,因此该对象被缓存。请注意,您的方法也必须公开才能正常工作。
    • 列表中的单个对象可以缓存在单独的键下吗?
    • 方法的“结果”实际上是缓存的。这意味着缓存不针对对象,而是针对方法名称及其参数(如 java 文档突出显示的那样),并且方法的结果被缓存。它不关心它是什么类型的对象。它只是缓存结果Object
    • Spring 4.0+ 返回 SimpleKey.EMPTY rather than 0,因此是我的应用程序的输出,但无论哪种方式,都非常有用。
    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2013-06-26
    • 2023-03-14
    • 2019-05-08
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多