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
// 添加依赖

org.springframework.session
spring-session-data-redis

// 配置类
@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不存在";
}

}

三、缓存优化策略
缓存穿透:对不存在的数据也缓存空值
缓存雪崩:设置不同的过期时间,避免集体失效
缓存击穿:对热点数据使用永不过期 + 后台异步更新

posted @ 2025-04-11 21:51  李蕊lr  阅读(7)  评论(0)    收藏  举报