代码之家  ›  专栏  ›  技术社区  ›  angz

Spring数据redis存储具有复杂数据作为值的映射

  •  0
  • angz  · 技术社区  · 1 年前

    我正在尝试使用spring数据将以下类的对象存储在redis中。

    public abstract class MyClass implements Serializable {
    
        @Id
        private String id;
        private Int count;
        private Map<String, Object> data;
    }
    

    存储在Map中的Object可以是从String到Map和List的任何对象,并且不可能事先说明它将是什么。我很难做到这一点,因为Redis在尝试序列化和反序列化数据时不断抛出错误。

    因此,后来我决定将任何类型的数据转换为String,然后再将其传递给Redis进行存储。然而,我仍然有一个用例,其中我想存储一个Map,该Map的值为字符串列表。在存储数据时,这与新方法配合得很好。但当我试图读取它时,它是从列表中返回的,是列表中的一个单字节值,而不是字符串。

    这是我的redis配置。

    @Configuration
    public class RedisConfig {
    
        @Bean
        JedisConnectionFactory jedisConnectionFactory() {
            RedisStandaloneConfiguration standaloneConfig = new RedisStandaloneConfiguration(
                    HOST_NAME,
                    PORT
            );
            JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(standaloneConfig);
            return new JedisConnectionFactory();
        }
    
        @Bean
        RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(jedisConnectionFactory);
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            template.afterPropertiesSet();
            return template;
        }
    
        @Bean
        RedisCustomConversions redisCustomConversions(
                MapToBytesConverter m2bConverter, BytesToMapConverter b2mConverter
        ) {
            return new RedisCustomConversions(Arrays.asList(
                    m2bConverter,
                    b2mConverter
            ));
        }
    

    这是两个转换器类。

    @Component
    @ReadingConverter
    public class BytesToMapConverter implements Converter<byte[], Map<String, Object>> {
    
        private final RedisSerializer<Object> serializer;
    
        public BytesToMapConverter() {
            serializer = new GenericJackson2JsonRedisSerializer();
        }
    
        @Override
        public Map<String, Object> convert(byte[] source) {
            return (Map<String, Object>) serializer.deserialize(source);
        }
    }
    
    
    @Component
    @WritingConverter
    public class MapToBytesConverter implements Converter<Map<String, Object>, byte[]> {
    
        private final RedisSerializer<Object> serializer;
    
        public MapToBytesConverter() {
            serializer = new GenericJackson2JsonRedisSerializer();
        }
    
        @Override
        public byte[] convert(Map<String, Object> source) {
            return serializer.serialize(source);
        }
    }
    
    

    存储库只是一个crudrepository。

    
    @Repository
    public interface MyClassRepository extends CrudRepository<MyClass, String>{
    
    }
    

    你能帮我弄清楚我在这里缺了什么吗?提前谢谢。

    0 回复  |  直到 1 年前