如何配置Spring Redis Configuration以使用哈希而不是字符串序列化

问题描述 投票:0回答:1

对于Java POJO,我想使用Spring的@ Cacheable,@ CachePut和@CacheEvict将其缓存到Redis,但是我更喜欢使用Redis的Hash功能,而不仅仅是将POJO序列化为字符串。本质上,我希望能够对POJO使用诸如ObjectHashMapper之类的东西,以便将POJO属性自动保存为单个Redis条目中的键/值对。在RedisRepository功能中可以看到此行为,该功能使用ObjectHashMapper保存POJO,但是,我不希望将缓存定义为存储库,而是要使用Cache批注。

我已经成功创建了一些自定义的Spring / Redis配置,可以帮助我正确地实现String序列化。用于自定义CacheManager和CacheConfiguration的Spring文档非常“轻松”,我没有找到任何相关示例。我不确定是否需要自定义序列化程序,转换器或CacheConfiguration的其他方面。似乎序列化程序更关心各个键和值,但是我看不到在哪里配置以捕获整个Object并将其首先转换为Hash。

这是我的Redis配置。它为两个高速缓存“ v”和“ products”设置,另外,对于其他高速缓存,默认设置为StringRedisSerializer。

@Slf4j
@RequiredArgsConstructor
@Configuration
@EnableRedisRepositories(enableKeyspaceEvents=RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfig {

    private final RedisConnectionFactory connectionFactory;

    private static RedisCacheConfiguration createCacheConfiguration(long timeoutInSeconds, RedisSerializationContext.SerializationPair<?> serializationPair) {
        logger.info("Creating CacheConfiguration with timeout of {} seconds", timeoutInSeconds);
        return RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(serializationPair)
                .entryTtl(Duration.ofSeconds(timeoutInSeconds));
    }

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        logger.info("Creating cache manager");
        Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();

        cacheConfigurations.put("v",createCacheConfiguration(1200, RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())));
        cacheConfigurations.put("products",createCacheConfiguration(-1,RedisSerializationContext.SerializationPair.fromSerializer(new JdkSerializationRedisSerializer())));

        return RedisCacheManager
                .builder(connectionFactory)
                .cacheDefaults(createCacheConfiguration(-1,RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())))
                .withInitialCacheConfigurations(cacheConfigurations)
                .build();
    }
}

这里是一个如何按照上述配置序列化POJO的示例:

@Data
@Builder
@AllArgsConstructor
public class ProductSummary implements Serializable {
    @Id
    private String id;
    private String accountId;
    private String name;
    private String roles;
    private String groups;
}

及其序列化方式:

\xac\xed\x00\x05sr\x004com.foobar.ProductSummaryh\xb3\x9d
\xd4\x0f\xac\xea\xb3\x02\x00\x05L\x00\taccountIdt\x00
\x12Ljava/lang/String;L\x00\x06groupsq\x00~\x00\x01L\x00
\x02idq\x00~\x00\x01L\x00\x04nameq\x00~\x00\x01L\x00
\x05rolesq\x00~\x00\x01xpt\x00\x19acctFv825MKt\x00
\nimwebuserst\x00\x13prod0lwJAWEYt\x00\x11ProductName/2020t\x00\x00

我想要的是(在Redis中作为哈希):

>HGETALL KEY

 1) "_class"
 2) "com.foobar.cache.CheckoutState"
 3) "accountId"
 4) "ACC000001"
 5) "name"
 6) "lorem ipsum whatever"
 7) "roles"
 8) "role1,role2,role3"
 9) "groups"
10) "groupA,groupB"

以散列键为ID。

caching serialization hashmap pojo spring-data-redis
1个回答
0
投票

我能够实现与Jedis客户端和方法拦截器可缓存的Spring AOP类似的功能。我找不到任何文档来说明如何强制可缓存Spring AOP插入具有键字段和值的Redis哈希数据结构。期待更多回复。

© www.soinside.com 2019 - 2024. All rights reserved.