Как правильно связать операции Redis в Spring-Data-Redis-Reactive? - PullRequest
0 голосов
/ 17 апреля 2020

В spring-data-redis-reactive операции записи возвращают результат выполнения redis, что делает операторы цепочки действительно сложными. Возьмите пример reddit в главе 1 Redis In Action . Я пытаюсь повторно реализовать так:

@Service
public class ArticleService {

    private final ReactiveStringRedisTemplate redisTemplate;

    private final long voteScore = 432L;

    public ArticleService(ReactiveStringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public Mono<Article> createArticle(Article article) {
        long now = System.currentTimeMillis();
        Map<String, String> newArticle = new HashMap<>();
        newArticle.put("title", article.getTitle());
        newArticle.put("link", article.getLink());
        newArticle.put("poster", article.getPoster());
        newArticle.put("time", String.valueOf(now));
        newArticle.put("votes", "1");
        return redisTemplate.opsForValue()
                            .increment("article:")
                            .doOnNext(id -> redisTemplate.opsForSet().add("voted:" + id.toString(), article.getPoster()).subscribe())
                            .doOnNext(id -> redisTemplate.expire("votes:" + id.toString(), Duration.ofDays(7)).subscribe())
                            .doOnNext(id -> redisTemplate.opsForHash().putAll("article:" + id.toString(), newArticle).subscribe())
                            .doOnNext(id -> redisTemplate.opsForZSet().add("score:", "article:" + id.toString(), now + voteScore).subscribe())
                            .doOnNext(id -> redisTemplate.opsForZSet().add("time:", "article:" + id.toString(), now).subscribe())
                            .map(id -> {
                                article.setId(id);
                                article.setVotes("1");
                                return article;
                            });
    }

}

Как видите, я использую doOnNext, чтобы избежать потери значения id, возвращаемого increment, и в каждом * есть subscribe() 1010 *, чтобы убедиться, что каждая операция redis выполнена. Но я не думаю, что это рекомендуемый способ. Я думаю, что приложения должны стараться избегать subscribe() и в основном фокусироваться на цепочке потока.

Как правильно выполнить много операций записи redis в spring-data-redis-reactive?

...