1. @Cacheable
-
用途:用于将方法的返回值存储到缓存中。如果缓存中已经存在对应的数据,则直接从缓存中获取,而不会执行方法。
-
适用场景
-
查询数据的方法(如数据库查询)。
-
需要频繁调用但结果不经常变化的方法。
-
-
常用位置
-
放在只读方法上,例如服务层的
find
或get
方法。
-
-
示例
@Cacheable(value = "users", key = "#id") public User getUserById(Long id) { return userRepository.findById(id).orElse(null); }
-
如果缓存中存在
users
缓存且键为id
的值,则直接返回缓存内容,否则执行方法并将结果存入缓存。
-
2. @CachePut
-
用途:无论缓存中是否存在对应的数据,都会执行方法,并将方法的返回值更新到缓存中。
-
适用场景
-
更新缓存数据时使用。
-
数据需要动态更新并且保持缓存一致性。
-
-
常用位置
-
放在更新或保存数据的方法上。
-
-
示例
@CachePut(value = "users", key = "#user.id") public User updateUser(User user) { return userRepository.save(user); }
-
方法会被执行,同时更新缓存中对应键的值。
-
3. @CacheEvict
-
用途:用于清除缓存中的数据。
-
适用场景
-
删除或修改数据后,需要清理缓存以避免脏数据。
-
-
常用位置
-
放在删除或修改数据的方法上。
-
-
参数
-
allEntries
: 是否清除所有缓存,默认为false
。 -
beforeInvocation
: 是否在方法执行前清除缓存,默认为false
(即默认在方法执行后清除)。
-
-
示例
@CacheEvict(value = "users", key = "#id") public void deleteUser(Long id) { userRepository.deleteById(id); }
-
删除用户的同时,清除缓存中对应的用户数据。
-
总结对比:
注解 | 功能 | 是否执行方法 | 常见场景 |
---|---|---|---|
@Cacheable | 缓存读取 | 可能不执行 | 查询数据 |
@CachePut | 缓存更新 | 必须执行 | 更新或保存数据 |
@CacheEvict | 缓存清除 | 不执行 | 删除或修改数据后清理缓存 |
通过合理使用这三个注解,可以有效管理缓存,提升系统性能并保证数据一致性。