我正在尝试使用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)
具有相同的缓存名称,但是它们返回不同的结果。
答案 0 :(得分:0)
当您使用@Cacheable
注释对方法进行注释时,Spring将在其上应用缓存行为。高速缓存名称用于将同一高速缓存区域中的高速缓存数据分组。但是为了将值存储在缓存区域中,Spring将生成缓存密钥。
默认情况下,SimpleKeyGenerator用于在缓存中生成键值。 SimpleKeyGenerator
使用方法参数来生成缓存密钥。键值将被SimpleKey对象包装。
因此,在您的情况下,它将执行以下操作:
第一次通话-缓存中没有数据
List<User> findAll()
SimpleKey.EMPTY
User findOne(String userId)
userId
参数new SimpleKey(userId)
如上所示,尽管两种情况下@Cacheable
中的缓存名称都相同,但是用于存储方法结果的键却不同。当您再次调用您的方法时:
第二次呼叫-缓存中的数据
List<User> findAll()
SimpleKey.EMPTY
User findOne(String userId)
userId
参数new SimpleKey(userId)