Как использовать Spring Data Redis для Hash с пользовательскими конвертерами и конвейером - PullRequest
0 голосов
/ 31 августа 2018

Если у меня есть следующий объект, который я храню в Redis как Hash

@RedisHash("animals")
public class Animal implements Serializable {
    private static final long serialVersionUID = 5905326889964459171L;
    @Id
    private String id;
    @Indexed
    private String type;
    @Indexed
    private String location;

Если 1000 записей в smembers animals:type:animal01 и я хочу - «Найти животных типа животных01 во всех местах», тогда я делаю -

Set<String> members = stringRedisTemplate.opsForHash().members("animals:type:animal01");
List<Object> result = stringRedisTemplate.executePipelined(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                for (String member : members) {
                    connection.hGetAll(String.format("animals:%s", member).getBytes());
                }
                return null;
            }
        });

Каждый объект в «результате» имеет тип LinkedHashMap. Я пытался использовать org.springframework.data.redis.hash.ObjectHashMapper для преобразования этого в Animal, но, похоже, ObjectHashMapper работает только с Map. Я не мог заставить его работать с картой

(я использую spring-boot-starter-data-redis 1.5.14.RELEASE, в которую входит jedis2.9.0)

Как десериализовать конвейерные результаты?

1 Ответ

0 голосов
/ 31 августа 2018

Вместо hGetAll я сделал hMGet. В этом случае каждый объект в результате был List. Затем я десериализовал каждый из пунктов в списке. У меня получилось

Но я надеялся, что есть ли лучший способ, где spring-redis обрабатывает часть десериализации

...