lettuce连接池理解

lettuce是一个线程安全,基于netty通信的线程池,说是线程池,但是一个连接通常情况下是足够的,一个连接管理多个会话,跟jedis一个连接管理一个会话,有所区别

1,为什么lettuce使用单连接处理还这么快

虽然lettuce使用单连接,但是处理速度依然很快,这得益于通信的组件是redis,redis是一个内存数据库,本身执行命令也是单线程的,使用多线程反而是累赘,当然如果并发量足够大,多个连接能提高传送速度,但是如果并发量真如此之大,肯定也不会是单体项目,集群下每个副本都可分担发送压力

2,使用单连接如何保证线程安全

在单一连接下,还需考虑一个问题,一个响应过来,如何得知它是第一个请求的响应的还是第二个请求的响应,最直接的想法就是做成同步,请求发送时阻塞,当响应时,拿到响应值,此响应值必定是该请求的,是可以做到一一对应,但是性能肯定会受影响,因为redis处理速度很快,第一个命令和第二个命令中间空闲这么久,肯定是不合适的,如果我们做成异步的,请求只管发,响应只管接受,性能就提高了,具体做法可以维护一个有序队列,当发送成功后把请求对象插入队列,响应那边当接受到响应时,从队列中弹出首个请求对象,把值更新到请求对象中,这样就可保证一一对应

3,为什么底层使用netty

redis是基于tcp通信的,只要满足redis通信协议,任何通信组件都可以实现与redis的通信,jedis使用传统bio的方式,netty本身是一个很强大的通信组件,默认nio通讯方式,也提供了心跳检测,天生适用于高并发,使用netty做底层通讯再好不过