redis序列化配置:
@Configuration
public class RedisSerializableConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 设置objectMapper:转换java对象的时候使用
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping( LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
RedisSerializer<Object> genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 设置key/value值的序列化方式
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(genericJackson2JsonRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
使用redisTemplate存取list列表值:
1. 向redis列表list存值
// 存入list集合 List<String> list= Arrays.asList("A5991") redisTemplate.opsForList().leftPushAll("list1", list); // list列表左侧插入字符串 redisTemplate.opsForList().leftPush("list2", "list2");
2. 从redis取出集合值
List<Object> list1 = redisTemplate.opsForList().range("list1", 0, -1);List<Object> list2 = redisTemplate.opsForList().range("list2", 0, -1);
3. redis中存入的值
key: list1 -----> value: ["A5991"]
key: list2 ------> value: "list2"
问题:list1取出集合类型转换失败。
我发现是springboot3之后,使用leftPushAll()方法存入的list集合值是Object类型的数组, leftPushAll方法参数类型(String key, Object... values),所以类型转换为List<String>集合会失败
解决办法:
使用 Collection<Object> collection1= list1.stream().collect(Collectors.toList())
转换为Collection类型后,再 redisTemplate.opsForList().leftPushAll("list1", collection1);存入值,存入redis的才是list列表值