springboot利用注解的方式使用Redis实现缓存
时间: 2023-05-31 10:04:31 浏览: 69
1. 引入依赖
在pom.xml文件中添加Redis依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
```
2. 配置Redis连接信息
在application.yml文件中添加Redis连接信息:
```yaml
spring:
redis:
host: 127.0.0.1
port: 6379
```
3. 创建Redis配置类
创建RedisConfig类,配置RedisTemplate和RedisCacheManager:
```java
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(redisCacheConfiguration)
.build();
}
}
```
4. 在Service中使用@Cacheable注解
在需要缓存的方法上添加@Cacheable注解,指定缓存的名字和缓存的key:
```java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Cacheable(cacheNames = "user", key = "#id")
public User getUserById(Long id) {
Optional<User> user = userRepository.findById(id);
if (user.isPresent()) {
return user.get();
}
return null;
}
}
```
5. 测试
启动应用程序后,第一次调用getUserById方法会从数据库中获取数据,同时将数据保存到Redis缓存中。之后再次调用该方法时,会直接从Redis缓存中获取数据。
```java
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
}
```