@Cacheable批注,在differents方法中使用相同的值

时间:2018-10-16 09:46:22

标签: caching ehcache spring-cache cacheapi

我正在尝试使用Spring @Cacheable注释。

 @Cacheable(value="users")          
public List<User> findAll() {
    System.out.println("Looking for All users : ");
    return userRepository.findAll();
}

@Override
@Cacheable(value="users")  
public User findOne(String userId) {
    System.out.println("Looking for user : "+ userId);
    return userRepository.findById(userId).get();
}

执行第一个方法List<User>时得到:

  
      
  • 第一次:从数据库中选择所有字段
  •   
  • 第二次:从缓存中选择所有字段
  •   
  • 第三次:从缓存中选择所有字段
  •   

到现在为止哪个还不错。

当我执行第二种方法findOne(String userId)时,我得到的结果是:

  
      
  • 第一次:从数据库中选择特定字段
  •   
  • 第二次:从缓存中选择特定字段
  •   
  • 第三次:从缓存中选择特定字段
  •   

又哪个好。

执行第一个方法List<User>时得到:

  

选择所有字段缓存中的数据

问题:如何这两种方法(List<User>findOne(String userId)具有相同的缓存名称,但是它们返回不同的结果。

1 个答案:

答案 0 :(得分:0)

当您使用@Cacheable注释对方法进行注释时,Spring将在其上应用缓存行为。高速缓存名称用于将同一高速缓存区域中的高速缓存数据分组。但是为了将值存储在缓存区域中,Spring将生成缓存密钥。

默认情况下,SimpleKeyGenerator用于在缓存中生成键值。 SimpleKeyGenerator使用方法参数来生成缓存密钥。键值将被SimpleKey对象包装。

因此,在您的情况下,它将执行以下操作:

第一次通话-缓存中没有数据

  • List<User> findAll()

    1. 没有参数
    2. key = SimpleKey.EMPTY
    3. 存储方法使用键将结果存储在缓存中
  • User findOne(String userId)

    1. userId参数
    2. key = new SimpleKey(userId)
    3. 存储方法使用键将结果存储在缓存中

如上所示,尽管两种情况下@Cacheable中的缓存名称都相同,但是用于存储方法结果的键却不同。当您再次调用您的方法时:

第二次呼叫-缓存中的数据

  • List<User> findAll()

    1. 没有参数
    2. key = SimpleKey.EMPTY
    3. 使用键从缓存中获取结果
  • User findOne(String userId)

    1. userId参数
    2. key = new SimpleKey(userId)
    3. 使用键从缓存中获取结果