SpringBoot 中如何使用Redis缓存?

在SpringBoot中,使用Redis缓存可以通过以下几个步骤:
1、添加Redis依赖
在Maven项目中,可以在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置Redis连接
在application.properties或application.yml文件中,配置Redis连接信息,如下所示:
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
3、配置Redis缓存管理器
在Java代码中,使用以下代码配置Redis缓存管理器:
public class RedisConfig extends CachingConfigurerSupport {
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return template;
}
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10))
.disableCachingNullValues()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<>(Object.class)));
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
}
这段代码中,我们创建了一个RedisTemplate对象,用于与Redis进行交互,同时也创建了一个CacheManager对象,用于管理Redis缓存。
在上述代码中,我们使用了Jackson2JsonRedisSerializer作为值序列化器,以便将Java对象序列化为JSON格式存储在Redis中。
4、在业务代码中使用Redis缓存
在需要使用Redis缓存的方法上添加@Cacheable注解即可,如下所示:
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
(value = "users", key = "#id")
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
}
这段代码中,我们在getUserById方法上添加了@Cacheable注解,并指定了缓存名称为“users”,缓存键为方法参数id。这样,在第一次调用该方法时,方法的返回值将被存储在Redis缓存中。
在下一次调用该方法时,如果缓存中已经存在相同的缓存键,则直接返回缓存中的数据,而不是再次执行方法。
5、注意事项
在使用SpringBoot中的Redis缓存时,需要注意以下几点:
5.1 Redis配置信息的正确性
在application.properties或application.yml文件中配置Redis连接信息时,需要确保配置信息的正确性,包括Redis主机地址、端口号、密码等。
5.2 RedisTemplate的配置
RedisTemplate是用于与Redis进行交互的对象,需要根据具体业务需求进行配置。例如,需要为RedisTemplate指定key和value的序列化器,以便将Java对象序列化为Redis可存储的格式。
5.3 CacheManager的配置
CacheManager是用于管理Redis缓存的对象,需要根据具体业务需求进行配置。例如,需要为CacheManager指定缓存的默认过期时间、缓存的序列化方式等。
5.4 缓存键的命名规范
在使用@Cacheable注解时,缓存键的命名需要符合一定的规范,以便在缓存中唯一标识该缓存。通常可以使用“类名:方法名:参数值”作为缓存键的命名规范。
5.5 缓存穿透问题
当缓存中不存在某个key对应的数据时,如果不做任何处理,每次调用该方法都会查询数据库,导致缓存穿透。为了解决这个问题,可以使用“空值缓存”或“布隆过滤器”等方式。
5.6 缓存雪崩问题
当缓存中大量的数据同时失效,导致大量的请求直接落到数据库上,造成数据库压力过大,导致系统崩溃,这就是缓存雪崩问题。为了解决这个问题,可以采用多级缓存、缓存数据的随机过期时间等方式。