jedis
lettuce
redisson
依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
配置文件
spring:
redis:
host: localhost
port: 6379
password:
lettuce:
pool:
max-active: 8 # 最大连接
max-idle: 8 # 最大空闲连接
min-idle: 0 # 最小空闲连接
max-wait: 100 # 连接等待时间
RedisTemplate的序列化
// 默认采用的是JdkSerializationRedisSerializer
// 可以采用GenericJackson2JsonRedisSerializer或Jackson2JsonRedisSerializer
// 方式1
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
// 设置序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setValueSerializer(RedisSerializer.json());
return redisTemplate;
}
// 方式2
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
// 设置序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
mapper.registerModule(simpleModule);
serializer.setObjectMapper(mapper);
redisTemplate.setValueSerializer(serializer);
return redisTemplate;
}
部分代码解释
// 序列化所有成员变量,(默认只序列化public)
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
// Method for enabling automatic inclusion of type information
// needed for proper deserialization of polymorphic types
// 序列化为JSON时,自动包含 反序列化时所需要的类型信息
// default typing will be used for
// * all non-final types, with exception of small number of
// * "natural" types (String, Boolean, Integer, Double), which
// * can be correctly inferred from JSON;
// 序列化为JSON时,为JSON包含类型信息(不写这句代码,存储的JSON数据不包含类型信息,将来反序列化时处理为LinkedHashMap)
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
// for instance
// 得到的数据是LinkedHashMap
List<dish> byCategoryId = redisTemplate.opsForList().range(key,0,-1);
// 加上这行代码
// 存到Redis中的数据会带上类型信息,这里猜测主要是将来从Redis中取数据时,方便反序列化为指定的POJO类型对象
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
// 得到的数据是dish
List<dish> byCategoryId = redisTemplate.opsForList().range(key,0,-1);
redis-cli乱码
#cmd环境下
chcp # 查看当前使用的编码
chcp 65001 # 切换到utf8
# 启动
.\redis-cli --raw
Jackson2JsonRedisSerializer
enableDefaultTyping方法过期
enableDefaultTyping
RedisTemplate存放集合