Правильный способ хранения списка объектов в Spring Data Redis Reactive

Мне нужно сохранить список объектов в Redis. Каждый элемент списка должен быть доступен по уникальному ключу. Для этого я думаю, что список объектов должен храниться как карта объектов в Redis (я преобразовал в String перед тем, как сохранить его):

{
      "code1": {
        //object1
      },
      "code2": {
        //object2
      },
      "code3": {
        //object3
      }
      //object n...
    }

Я использовал этот подход, когда реализовал его с помощью RedisTemplate (императивный способ). Теперь я использую Reactive Redis, и мне хотелось бы знать, что будет правильным. Я вижу, что в Spring Redis существует ReactiveListOperations интерфейс.

На данный момент у меня есть следующий код, но когда я его выполнил, Redis не возвращает никакого значения. Хотелось бы, чтобы я использовал правильный подход для его реализации.

@Service
@RequiredArgsConstructor
public class Service {

    private final Client client;
    private final ReactiveRedisTemplate<String, Map> reactiveRedisTemplate;

    @Override
    public Mono<Element> getElement(String name) {

        return reactiveRedisTemplate.opsForValue().get(Constants.KEY_LIST)
                .switchIfEmpty(Mono.defer(() -> {
                    //I get a map from the service when info is not stored in Redis
                    log.debug("Redis does not contain key: {}", Constants.KEY_LIST);
                    return this.client.getMap()
                            .doOnSuccess(mapFromService -> redisTemplate.opsForValue()
                                    .set(Constants.KEY_LIST, mapFromService));
                }))
                .map(map -> {
                    //I suppose that flow continues here when Redis find the key in Redis
                    log.debug("Map from Redis: {}", map);

                    if (!map.containsKey(name)) {
                        return this.client.getMap()
                                .doOnSuccess(mapFromService -> reactiveRedisTemplate.opsForValue()
                                        .set(Constants.KEY_LIST, mapFromService));
                    }

                    return map;
                }).map(map -> {
                    //I get the specific element from the map
                    return map.get(name);
                });
    }
}

Заранее спасибо!

0 ответов

Другие вопросы по тегам