Spring Boot缓存实战之Redis 设置有效时间和自动刷新缓存功能
背景
在开发web应用时,我们往往需要使用缓存来提高应用的性能和响应速度。Spring Boot提供了对缓存的支持,可以与多种缓存器集成。其中,Redis是非常流行的缓存器。
在使用Redis缓存时,我们经常会遇到以下问题:
- 设置缓存的有效时间;
- 自动刷新缓存。
下面将详细介绍如何在Spring Boot中设置Redis缓存的有效时间和自动刷新缓存的功能。
步骤
步骤一:添加依赖
在项目的 pom.xml
文件中添加以下依赖:
<!-- Redis缓存 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
步骤二:配置Redis
在项目的 application.yml
文件中,添加Redis的配置:
# Redis 缓存配置
spring:
redis:
host: 127.0.0.1 # Redis服务器地址
port: 6379 # Redis服务器端口
步骤三:添加缓存注解
在需要缓存的类或方法上添加 @Cacheable
或 @CachePut
注解。例如:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Cacheable(value = "user", key = "#username")
public User getUserByUsername(String username) {
System.out.println("没有使用缓存,从数据库中获取数据...");
return userDao.getUserByUsername(username);
}
@CachePut(value = "user", key = "#username")
public User updateUserByUsername(String username, User user) {
System.out.println("更新用户信息,并将结果写入缓存...");
userDao.updateUserByUsername(username, user);
return user;
}
}
步骤四:设置缓存的有效时间
在需要设置缓存有效时间的方法上添加 @Cacheable
或 @CachePut
注解的 cacheManager
属性。例如:
@Cacheable(value = "user", key = "#username", cacheManager = "cacheManager10")
public User getUserByUsername(String username) {
System.out.println("没有使用缓存,从数据库中获取数据...");
return userDao.getUserByUsername(username);
}
在Spring Boot容器中,可以创建多个缓存管理器对象。我们可以为不同的缓存对象设置不同的缓存管理器,从而为缓存对象设置不同的过期时间。例如:
@Configuration
public class CacheConfig {
@Bean("cacheManager10")
public CacheManager cacheManager10(RedisConnectionFactory factory) {
RedisCacheManager cacheManager = RedisCacheManager.create(factory);
// 设置缓存有效期为10秒
cacheManager.setDefaultExpiration(10);
return cacheManager;
}
@Bean("cacheManager30")
public CacheManager cacheManager30(RedisConnectionFactory factory) {
RedisCacheManager cacheManager = RedisCacheManager.create(factory);
// 设置缓存有效期为30秒
cacheManager.setDefaultExpiration(30);
return cacheManager;
}
}
以上代码中,我们创建了两个缓存管理器对象 cacheManager10
和 cacheManager30
,并分别设置了它们默认的缓存有效期为10秒和30秒。
步骤五:自动刷新缓存
上述方法中,设置的缓存有效期是固定的。如果我们需要当数据更新时自动刷新缓存,就需要使用Redis的 TTL
功能。
以设置缓存有效期为10秒为例,在缓存对象存储到Redis中时,同时设置缓存对象的TTL
为10秒。当缓存对象的TTL
到期时,Redis会自动删除该对象,并且该对象的@Cacheable
注解也会失效,下一次调用会重新执行方法,获取最新的数据。
更新用户信息时,我们可以使用 @CachePut
注解细粒度地控制缓存更新,同时手动设置对象的TTL
为10秒。例如:
@CachePut(value = "user", key = "#username", cacheManager = "cacheManager10")
public User updateUserByUsername(String username, User user) {
System.out.println("更新用户信息,并将结果写入缓存...");
userDao.updateUserByUsername(username, user);
// 手动设置缓存对象的TTL为10秒
RedisCache redisCache = (RedisCache) cacheManager.getCache("user");
redisCache.put(username, user, Duration.ofSeconds(10));
return user;
}
当更新用户信息时,缓存对象的TTL
也会更新,从而保证了数据的一致性。
示例说明
以下是一个基于Spring Boot和Redis实现的简单商品缓存查询应用:
@RestController
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("/product/{id}")
public Product getProduct(@PathVariable("id") Long id) {
return productService.getProductById(id);
}
}
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao productDao;
@Cacheable(value = "product", key = "#id")
public Product getProductById(Long id) {
System.out.println("没有使用缓存,从数据库中获取数据...");
return productDao.getProductById(id);
}
@CachePut(value = "product", key = "#product.id")
public Product updateProduct(Product product) {
System.out.println("更新商品信息,并将结果写入缓存...");
productDao.updateProduct(product);
return product;
}
}
在以上示例中,我们使用 @Cacheable
注解实现了商品的缓存查询,并使用 @CachePut
注解实现了商品信息的更新(同时更新了缓存中的数据)。
在 CacheConfig
类中,我们自定义了一个缓存管理器 cacheManager60
,并为 product
缓存对象设置了有效期为60秒:
@Configuration
public class CacheConfig {
@Bean("cacheManager60")
public CacheManager cacheManager60(RedisConnectionFactory factory) {
RedisCacheManager cacheManager = RedisCacheManager.create(factory);
// 设置缓存有效期为60秒
cacheManager.setDefaultExpiration(60);
return cacheManager;
}
// ...
}
当我们访问商品信息时,如果在60秒内再次访问,即会从Redis缓存中获取缓存结果,而不是从数据库中获取。
参考文献:
- Spring Boot文档:https://docs.spring.io/spring-boot/docs/2.5.6/reference/htmlsingle/#boot-features-caching
- Redis官方文档:https://redis.io/documentation
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot缓存实战之Redis 设置有效时间和自动刷新缓存功能(时间支持在配置文件中配置) - Python技术站