当前位置: 首页 > 知识库问答 >
问题:

Redis(生菜)总是发布到单线程

壤驷高洁
2023-03-14

此外,对于一个粗心大意的开发人员来说,当前的行为难道不危险吗?也许应该稍微调整一下默认值。我认为理想的场景是Lettuce可以重用WebFlux中的相同事件循环

我添加了这个spring boot单类代码片段,可以用来重现我所描述的内容:

@SpringBootApplication
public class ReactiveApplication {
    public static void main(String[] args) {
        SpringApplication.run(ReactiveApplication.class, args);
    }
}

@Controller
class TestController {

    private final RedisReactiveCommands<String, String> redis = RedisClient.create("redis://localhost:6379").connect().reactive();

    @RequestMapping("/test")
    public Mono<Void> test() {
        return redis.exists("key")
            .doOnSubscribe(subscription -> System.out.println("\nonSubscribe called on thread " + Thread.currentThread().getName()))
            .doOnNext(aLong -> System.out.println("onNext called on thread " + Thread.currentThread().getName()))
            .then();
    }

}

如果继续调用/testendpoint,将得到以下输出:

onSubscribe called on thread reactor-http-nio-2
onNext called on thread lettuce-nioEventLoop-4-1

onSubscribe called on thread reactor-http-nio-3
onNext called on thread lettuce-nioEventLoop-4-1

onSubscribe called on thread reactor-http-nio-4
onNext called on thread lettuce-nioEventLoop-4-1

共有1个答案

卫财
2023-03-14

这是一个极好的问题!

Lettuce总是使用绑定到netty通道的I/O线程发布。这可能适合也可能不适合您的工作量。

Redis是单线程的,因此保持单个TCP连接是有意义的。Netty的线程模型是所有I/O工作都由绑定到通道的EventLoop线程处理。因为这个星座,你在同一线程上接收所有的反应信号。使用具有各种选项的各种反应序列对影响进行基准测试是有意义的。

这种责任的双重性(完成命令、执行I/O)可能会对计算量更大的工作负载产生一定的影响,从而降低I/O的性能。

额外资源:

  • 研究响应线程切换#905。
 类似资料:
  • Redis6.0之前是单线程的,Redis6.0之后开始支持多线程; redis内部使用了基于epoll的多路服用,也可以多部署几个redis服务器解决单线程的问题; redis主要的性能瓶颈是内存和网络; 内存好说,加内存条就行了,而网络才是大麻烦,所以redis6内存好说,加内存条就行了; 而网络才是大麻烦,所以redis6.0引入了多线程的概念, redis6.0在网络IO处理方面引入了多线

  • 代码更清晰,处理逻辑更简单; 不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题; 不存在多线程切换而消耗CPU; 无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;

  • 本文向大家介绍Redis 为什么是单线程的?相关面试题,主要包含被问及Redis 为什么是单线程的?时的应答技巧和注意事项,需要的朋友参考一下 因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。 关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且

  • 我使用spring boot webflux以非阻塞方式连接和查询Redis。我已经用LettuceConnectionFactory配置了reactivedistemplate。spring文档指出,将管道与reactivedistemplate一起使用的唯一方法是使用execute( 所以我的问题是,在使用Spring ReactiveRedisTemplate时,是否可以对命令进行管道连接?

  • 本文向大家介绍请问,redis为什么是单线程?相关面试题,主要包含被问及请问,redis为什么是单线程?时的应答技巧和注意事项,需要的朋友参考一下 考察点: 因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。缺点:服务器其他核闲置。

  • 发布一条消息是简单的。只需使用publish指定地址发布到。 eventBus.publish("news.uk.sport", "Yay! Someone kicked a ball"); 那消息然后将送交注册的反对地址 news.uk.sport 的所有处理程序。