Как настроить Spring Redis Configuration для использования хэша вместо сериализации строк - PullRequest
0 голосов
/ 07 октября 2019

Для Java POJO я хочу кэшировать его в Redis с помощью Spring @Cacheable, @CachePut и @CacheEvict, однако я бы предпочел использовать возможности Redis Hash вместо простой сериализации POJO в строку. По сути, я хотел бы иметь возможность использовать что-то вроде ObjectHashMapper против POJO, чтобы свойства POJO автоматически сохранялись как пары ключ / значение в одной записи Redis. Такое поведение можно увидеть в функциональности RedisRepository, которая сохраняет POJO с помощью ObjectHashMapper, однако я предпочитаю не определять кэш как репозиторий, а хочу использовать аннотации Cache.

Я успешно создал несколько пользовательскихКонфигурация Spring / Redis, которая помогла мне добиться правильной работы сериализации String. Документация Spring для настройки CacheManager и CacheConfiguration очень «легкая», и я не нашел соответствующих примеров. Я не уверен, нужен ли мне собственный сериализатор, конвертер или какой-либо другой аспект CacheConfiguration. Кажется, что сериализаторы больше заботятся об отдельных ключах и значениях, но я не вижу, где настроить, чтобы перехватить весь Объект и сначала превратить его в Хэш.

Вот моя конфигурация 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.

1 Ответ

0 голосов
/ 18 октября 2019

Мне удалось добиться функциональности, аналогичной Spring AOP, кешируемой с помощью клиента Jedis и метода-перехватчика. Мне не удалось найти какую-либо документацию о том, как заставить кэшируемый пружинный AOP вставлять в структуру данных хэша redis с полем ключа и значениями. Ждем больше ответов.

...