1.启用Redis注解支持
首先需要在配置类上添加 @EnableCaching
注解:
@Configuration
@EnableCaching
public class RedisConfig {
// 其他配置...
}
2.常用Redis操作注解
@Cacheable - 缓存查询
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
// 如果缓存中没有,则执行方法并将结果存入缓存
return userRepository.findById(id).orElse(null);
}
参数说明:
value
/cacheNames
:缓存名称key
:缓存键,支持 SpEL 表达式condition
:条件缓存,满足条件才缓存unless
:条件不缓存,满足条件不缓存
@CachePut - 更新缓存
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
// 更新数据库后,同时更新缓存
return userRepository.save(user);
}
@CacheEvict - 删除缓存
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
// 删除数据库记录后,同时删除缓存
userRepository.deleteById(id);
}
@Caching - 组合多个缓存操作
@Caching(
cacheable = @Cacheable(value = "users", key = "#username"),
evict = @CacheEvict(value = "userList", allEntries = true)
)
public User getUserByUsername(String username) {
// 复杂缓存操作
return userRepository.findByUsername(username);
}
3.自定义Key生成器
可以自定义缓存键生成策略:
@Configuration
public class RedisConfig {
@Bean
public KeyGenerator customKeyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
}
使用自定义 Key 生成器:
@Cacheable(value = "users", keyGenerator = "customKeyGenerator")
public User getUserByEmail(String email) {
// ...
}
4.条件缓存示例
@Cacheable(value = "users", key = "#id",
condition = "#id > 10", unless = "#result == null")
public User getUserWithCondition(Long id) {
// 只有当id>10时才缓存,且结果不为null时才缓存
return userRepository.findById(id).orElse(null);
}
5.配置Redis连接
在 application.properties
或 application.yml
中配置 Redis:
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
6.Redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 被注解的方法需要是 public 方法
- 自调用(同一个类中方法调用)不会触发缓存注解
- 对于复杂对象,确保实现了 Serializable 接口