首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是正确的方式链红色操作春季数据红-反应?

什么是正确的方式链红色操作春季数据红-反应?
EN

Stack Overflow用户
提问于 2020-04-17 03:48:14
回答 1查看 1.2K关注 0票数 0

spring-data-redis-reactive中,写入操作返回redis执行结果,这使得链接运算符变得非常困难。以Redis in Action第一章中的reddit为例。我试图像这样重新实施:

代码语言:javascript
复制
@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来避免丢失increment返回的id值,并且每个doOnNext中都有一个subscribe(),以确保每个redis操作都得到执行。但我不认为这是推荐的方法。我认为应用程序应该尽量避免使用subscribe(),主要关注于链接流。

spring-data-redis-reactive中执行许多redis写操作的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-07 00:41:33

避免在中间订阅,如果从WEB接口调用Spring,则Spring将在结束时订阅flow。以下是如何实现的示例

代码语言:javascript
复制
        return redisTemplate.opsForValue()
                            .increment("article:")
                            .flatMap(id -> // Mono.zip will execute concurrently all the modifications below
                              Mono.zip(redisTemplate.opsForSet().add("voted:" + id.toString(), article.getPoster()),
                                  redisTemplate.expire("votes:" + id.toString(), Duration.ofDays(7)),
                                  redisTemplate.opsForHash().putAll("article:" + id.toString(), newArticle),
                                  redisTemplate.opsForZSet().add("score:", "article:" + id.toString(), now + voteScore),
                                  redisTemplate.opsForZSet().add("time:", "article:" + id.toString(), now)
                              )
                                  .map(tuple -> id))
                            .map(id -> {
                                article.setId(id);
                                article.setVotes("1");
                                return article;
                            });

但是,您应该考虑执行对MULTI Redis命令的修改,以确保发生原子性https://redis.io/commands/multi。因为您没有任何验证和/或限制,所以https://redis.io/commands/eval不是必需的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61263834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档