在Spring Boot项目中,我们通常使用缓存框架(如Spring Cache、Caffeine、Redis等)来缓存热点数据,并设置这些数据的过期时间。以下是一些常见的缓存框架及其如何设置过期时间的方法:
1. 使用Spring Cache(基于Caffeine、EhCache、Redis等)
Spring Cache是一个抽象层,它支持多种缓存解决方案。以下是一个基于Caffeine的示例:
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>你的版本号</version>
</dependency>
配置Caffeine缓存
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
// 配置缓存名、过期时间等
cacheManager.setCaffeine(caffeineCacheBuilder());
return cacheManager;
}
private Caffeine<Object, Object> caffeineCacheBuilder() {
return Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES) // 设置写入后10分钟过期
.maximumSize(100); // 设置缓存最大容量
}
}
@Service
public class MyService {
@Cacheable(value = "hotData", key = "#id")
public String getHotData(String id) {
// 模拟从数据库获取数据
return "Data for " + id;
}
}
2. 使用Redis作为缓存
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置Redis
spring:
redis:
host: localhost
port: 6379
jedis:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
timeout: 5000
使用RedisTemplate设置过期时间
@Service
public class RedisService {
@Autowired
private StringRedisTemplate redisTemplate;
public void setHotData(String key, String value, long expireInSeconds) {
redisTemplate.opsForValue().set(key, value, expireInSeconds, TimeUnit.SECONDS);
}
public String getHotData(String key) {
return redisTemplate.opsForValue().get(key);
}
}
- 缓存击穿问题通常发生在热点数据过期时,大量请求同时访问数据库。为了解决这个问题,你可以使用互斥锁(如Redis的SETNX命令)来确保只有一个线程去加载数据到缓存中。