Spring Boot中的Redis缓存
Redis是一种开源的内存存储系统,可用于存储键值、缓存和消息队列等数据结构,被广泛用于Web应用程序的缓存方案中。Spring Boot中提供了对Redis的很好的支持,本文将对Spring Boot中Redis的缓存问题及操作方法进行详细讲解。
一、关于Redis缓存
Redis缓存的优势
- 速度快:将数据存在内存中,读写速度非常快。
- 支持多种数据结构:Redis支持各种数据类型的操作,例如字符串、哈希表、列表、集合等。
- 可扩展性强:Redis支持分布式,数据可以分片存储在多个节点上,可以通过添加节点来扩展集群的容量。
Redis缓存的缺点
- 数据存储在内存中,如果机器重启,则数据将丢失。因此,Redis更适合作为临时数据存储、缓存以及会话解决方案等。
- 对于一些简单的存储解决方案,例如KV存储,Redis可能不是最好的选择。
二、Spring Boot中Redis缓存的操作
在Spring Boot中使用Redis缓存需要引入spring-boot-starter-data-redis
依赖,本文假设此依赖已经添加到项目中。
1. 开启Redis缓存
在Spring Boot中开启Redis缓存非常简单,只需要通过注解开启@EnableCaching即可:
@SpringBootApplication
@EnableCaching
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
在要使用缓存的方法上使用注解@Cacheable即可将查询结果自动缓存到Redis中。
2. 缓存清除
在Redis中,缓存的失效一般是基于时间的,但是如果需要手动清除缓存,可以使用@CacheEvict注解:
@CacheEvict(value = "userCache", key = "'user:'+#id")
public void deleteUser(String id) {
// delete user from database
}
上述代码中的@CacheEvict注解将清除userCache
中键为user:xxx
的缓存,其中xxx
为传入参数id
的值。
3. 多级缓存
在Spring Boot中实现多级缓存也非常容易,可以使用@CacheConfig注解来指定缓存的名称和策略,再在需要使用缓存的方法上使用@Cacheable注解即可:
@Service
@CacheConfig(cacheNames = "userCache", cacheManager = "cacheManager")
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
@Cacheable(key = "'user:'+#id")
public User findById(String id) {
return userRepository.findById(id);
}
// ...
}
上述代码中使用了@CacheConfig注解来指定缓存的名称为userCache
,缓存策略为cacheManager
。在findById方法上,使用@Cacheable注解将查询结果缓存到Redis中,缓存的键为user:xxx
,其中xxx
为传入参数id
的值。
三、示例说明
示例1:从Redis中获取数据
本示例演示如何使用@Cacheable注解获取Redis缓存中的数据。
- 添加依赖
在pom.xml中添加spring-boot-starter-data-redis
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 创建Redis配置文件
在application.properties中添加Redis的配置:
spring.redis.host=localhost
spring.redis.port=6379
- 创建Redis配置类
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setKeySerializer(serializer);
redisTemplate.setValueSerializer(serializer);
redisTemplate.setHashKeySerializer(serializer);
redisTemplate.setHashValueSerializer(serializer);
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheManager cacheManager = RedisCacheManager.create(factory);
return cacheManager;
}
}
- 编写业务逻辑
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
@Cacheable(value = "user", key = "#id")
public User findById(String id) {
System.out.println("query from database");
return userRepository.findById(id);
}
}
- 测试应用
@Service
public class UserServiceImplTest {
@Autowired
private UserService userService;
@Test
public void testFindById() {
String id = "1";
User user1 = userService.findById(id);
User user2 = userService.findById(id);
System.out.println(user1);
System.out.println(user2);
}
}
在运行测试用例时,第一次查询会从数据库中获取数据并将结果缓存到Redis中,第二次查询将从Redis缓存中获取数据。
示例2:操作缓存
本示例演示如何使用@CacheEvict注解清除缓存。
- 编写业务逻辑
@Service
public class UserServiceImpl implements UserService {
@Override
@CacheEvict(value = "user", key = "#id")
public void deleteUserById(String id) {
System.out.println("delete from database");
}
}
- 测试应用
@Service
public class UserServiceImplTest {
@Autowired
private UserService userService;
@Test
public void testDeleteUserById() {
String id = "1";
User user1 = userService.findById(id);
System.out.println(user1);
userService.deleteUserById(id);
User user2 = userService.findById(id);
System.out.println(user2);
}
}
在测试应用中,首先查询用户数据并将其缓存在Redis中,然后调用deleteUserById
方法将用户数据从数据库和Redis中删除,最后再次查询用户数据,因为缓存已经失效,所以将从数据库中查询。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot中的Redis 缓存问题及操作方法 - Python技术站