4.11
一、Spring Boot 集成 Redis 缓存
配置 Redis 缓存管理器并优化查询性能:
java
// Redis配置类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置序列化器
Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(om.getPolymorphicTypeValidator(),
ObjectMapper.DefaultTyping.NON_FINAL);
jsonSerializer.setObjectMapper(om);
template.setValueSerializer(jsonSerializer);
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10)) // 默认缓存10分钟
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
}
// 服务层使用缓存
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@Override
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
二、分布式 Session 管理
基于 Redis 实现跨服务 Session 共享:
java
// 添加依赖
// 配置类
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800) // 30分钟超时
public class SessionConfig {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379));
}
}
// 控制器使用Session
@RestController
@RequestMapping("/api/session")
public class SessionController {
@GetMapping("/set")
public String setSession(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("userId", "12345");
return "Session已设置";
}
@GetMapping("/get")
public String getSession(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
return "UserID: " + session.getAttribute("userId");
}
return "Session不存在";
}
}
三、缓存优化策略
缓存穿透:对不存在的数据也缓存空值
缓存雪崩:设置不同的过期时间,避免集体失效
缓存击穿:对热点数据使用永不过期 + 后台异步更新

浙公网安备 33010602011771号