SpringBoot Redis使用fastjson序列化
依赖引入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
配置
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
/**
* 改用fastjson redis序列化,请删除redis数据后使用此序列化
* @param redisConnectionFactory
* @return
*/
@SuppressWarnings({"unchecked", "rawtypes"})
@Bean
public RedisTemplate redisTemplate(@Lazy RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
GenericToStringSerializer<String> stringRedisSerializer = new GenericToStringSerializer<>(String.class);
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
FastJsonConfig fastJsonConfig = fastJsonRedisSerializer.getFastJsonConfig();
SerializeConfig serializeConfig = fastJsonConfig.getSerializeConfig();
//加入的locadatetime序列化,也可以不加(但是要用@JSONField(format = "yyyy-MM-dd HH:mm:ss"))格式化
serializeConfig.put(LocalDateTime.class, (serializer, object, fieldName, fieldType, features) -> {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
out.writeString(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format((LocalDateTime) object));
});
serializeConfig.put(LocalDate.class, (serializer, object, fieldName, fieldType, features) -> {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
out.writeString(DateTimeFormatter.ofPattern("yyyy-MM-dd").format((LocalDate) object));
});
serializeConfig.put(LocalTime.class, (serializer, object, fieldName, fieldType, features) -> {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
out.writeString(DateTimeFormatter.ofPattern("HH:mm:ss").format((LocalTime) object));
});
fastJsonConfig.setSerializeConfig(serializeConfig);
fastJsonConfig.setFeatures(Feature.SupportAutoType);
fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteClassName);
redisTemplate.setValueSerializer(fastJsonRedisSerializer);
redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
测试,结果前往redis工具查看即可
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate<String, User> redisTemplate;
@Autowired
private RedisTemplate<String, List<User>> listRedisTemplate;
@Test
public void redis() {
User user = new User();
ValueOperations<String, User> ops = redisTemplate.opsForValue();
ops.set("user", user);
Object hello = ops.get("user");
System.err.println(hello);
List<User> users = new ArrayList<>();
users.add(new User());
ValueOperations<String, List<User>> ops1 = listRedisTemplate.opsForValue();
ops1.set("list", users);
Object list = ops1.get("list");
System.err.println(list);
}
@Data
static
class User {
private Boolean sex = true;
private Integer age = 12;
private String name = "张三";
//@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime = LocalDateTime.now();
//@JSONField(format = "yyyy-MM-dd")
private LocalDate localDate = LocalDate.now();
//@JSONField(format = "HH:mm:ss")
private LocalTime localTime = LocalTime.now();
private Date date = new Date();
}
}
以前为了解决localdatetime redis序列化与返序列化,结果找的那个,存储redis格式如下,感觉格式看起来始终不好,看起来怪怪的