自定义实现 redis key 序列化(serialize) 反序列化(deserialize)

系统管理员 2023-02-11 15:27 112阅读 0赞

使用FastJson序列化

  1. public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
  2. private final Class<T> clazz;
  3. public FastJsonRedisSerializer(Class<T> clazz) {
  4. super();
  5. this.clazz = clazz;
  6. }
  7. @Override
  8. public byte[] serialize(T t) throws SerializationException {
  9. if (t == null) {
  10. return new byte[0];
  11. }
  12. return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(Constant.DEFAULT_CHARSET);
  13. }
  14. @Override
  15. public T deserialize(byte[] bytes) throws SerializationException {
  16. if (bytes == null || bytes.length <= 0) {
  17. return null;
  18. }
  19. String str = new String(bytes, Constant.DEFAULT_CHARSET);
  20. return JSON.parseObject(str, clazz);
  21. }
  22. }

Redis 配置

  1. import com.alibaba.fastjson.parser.ParserConfig;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  5. import org.springframework.data.redis.cache.RedisCacheManager;
  6. import org.springframework.data.redis.connection.RedisConnectionFactory;
  7. import org.springframework.data.redis.core.RedisTemplate;
  8. import org.springframework.data.redis.serializer.RedisSerializationContext;
  9. import org.springframework.data.redis.serializer.StringRedisSerializer;
  10. import java.time.Duration;
  11. /** * Redis 配置 * * @author John * @date 2020/4/12 12:44 */
  12. @Configuration
  13. public class RedisConfig {
  14. static {
  15. // 使用Redis 配置替换fastjson 反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support;
  16. // 在RedisSerializer<T>的实现类中添加白名单
  17. ParserConfig.getGlobalInstance().addAccept("john.duo.system.manage.entity");
  18. }
  19. @Bean(name = "redisTemplate")
  20. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  21. RedisTemplate<String, Object> template = new RedisTemplate<>();
  22. //使用fastjson序列化
  23. FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
  24. // value值的序列化采用fastJsonRedisSerializer
  25. template.setValueSerializer(fastJsonRedisSerializer);
  26. template.setHashValueSerializer(fastJsonRedisSerializer);
  27. // key的序列化采用StringRedisSerializer
  28. template.setKeySerializer(new StringRedisSerializer());
  29. template.setHashKeySerializer(new StringRedisSerializer());
  30. template.setConnectionFactory(redisConnectionFactory);
  31. return template;
  32. }
  33. @Bean
  34. public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
  35. FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
  36. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5L))
  37. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
  38. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer))
  39. .disableCachingNullValues();
  40. return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();
  41. }
  42. }

发表评论

表情:
评论列表 (有 0 条评论,112人围观)

还没有评论,来说两句吧...

相关阅读