Spring Boot应用中使用Redis非常简单。本文使用redis作为缓存使用。
首先添加依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后配置redis
在application.properties配置文件中,配置Redis常用参数:
# Redis缓存相关配置
#Redis数据库索引(默认为0)
spring.redis.database=0
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器端口
spring.redis.port=6379
#Redis服务器密码(默认为空)
spring.redis.password=
#Redis连接超时时间 默认:5分钟(单位:毫秒)
spring.redis.timeout=300000ms
# Jedis
##Redis连接池最大连接数(使用负值表示没有限制)
#spring.redis.jedis.pool.max-active=512
##Redis连接池中的最小空闲连接
#spring.redis.jedis.pool.min-idle=0
##Redis连接池中的最大空闲连接
#spring.redis.jedis.pool.max-idle=8
##Redis连接池最大阻塞等待时间(使用负值表示没有限制)
#spring.redis.jedis.pool.max-wait=-1ms
# Lettuce
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=10000
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0
# 关闭超时时间
spring.redis.lettuce.shutdown-timeout=100
需要注意的是最大连接数(spring.redis.jedis.pool.max-active )和超时时间(spring.redis.jedis.pool.max-wait)。Redis在生产环境中出现故障的频率经常和这两个参数息息相关。
然后创建RedisConfig配置类
@Configuration
@EnableCaching
public class RedisConfig {
// 缓存管理器
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
return RedisCacheManager.create(connectionFactory);
}
// RedisTemplate配置
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
// 设置key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer jacksonSerial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSerial.setObjectMapper(om);
// 设置value值采用json序列化
redisTemplate.setValueSerializer(jacksonSerial);
// 设置hash key 和value序列化模式
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jacksonSerial);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
本文未对redisTempalte进行工具组件封装,用的最原始的opsForValue.get()后set()等方法。
注意:很多教程里都讲到通过注解的方式(@Cacheable,@CachePut、@CacheEvict和@Caching)实现数据缓存,本文在此未采用注解的方式,根据实践,我个人是不推崇这种使用方式的。
@RequestMapping("/hello")
public String hello() {
redisTemplate.opsForValue().set("key2","hello2");
Object value = redisTemplate.opsForValue().get("key2");
return value.toString();
}
启动即可
结果服务预期,成功返回hello2。