Redis 异步客户端选型及落地实践
可视化服务编排系统是能够通过线上可视化拖拽、配置的方式完成对接口的编排,可在线完成服务的调试、测试,实现业务需求的交付,详细内容可参考:https://mp.weixin.qq.com/s/5oN9JqWN7n-4Zv6B9K8kWQ。
为了支持更加广泛的业务场景,可视化编排系统近期需要支持对缓存的操作功能,为保证编排系统的性能,服务的执行过程采用了异步的方式,因此我们考虑使用 Redis 的异步客户端来完成对缓存的操作。
Redis 客户端
Jedis/Lettuce
Redis 官方推荐的 Redis 客户端有 Jedis、Lettuce 等等,其中 Jedis 是老牌的 Redis 的 Java 实现客户端,提供了比较全面的 Redis 命令的支持,在 spring-boot 1.x 默认使用 Jedis。
但是 Jedis 使用阻塞的 IO,且其方法调用都是同步的,程序流需要等到 sockets 处理完 IO 才能执行,不支持异步,在并发场景下,使用 Jedis 客户端会耗费较多的资源。
此外,Jedis 客户端实例不是线程安全的,要想保证线程安全,必须要使用连接池,每个线程需要时从连接池取出连接实例,完成操作后或者遇到异常归还实例。当连接数随着业务不断上升时,对物理连接的消耗也会成为性能和稳定性的潜在风险点。因此在 spring-boot 2.x 中,redis 客户端默认改用了 Lettuce。
我们可以看下 Spring Data Redis 帮助文档给出的对比表格,里面详细地记录了两个主流 Redis 客户端之间的差异。
异步客户端 Lettuce
Spring Boot 自 2.0 版本开始默认使用 Lettuce 作为 Redis 的客户端。Lettuce 客户端基于 Netty 的 NIO 框架实现,对于大多数的 Redis 操作,只需要维持单一的连接即可高效支持业务端的并发请求 —— 这点与 Jedis 的连接池模式有很大不同。同时,Lettuce 支持的特性更加全面,且其性能表现并不逊于,甚至优于 Jedis。
Netty 是由 JBOSS 提供的一个 java 开源框架,现为 Github 上的独立项目。Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于 NIO 的客户、服务器端的编程框架,使用 Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty 相当于简化和流线化了网络应用的编程开发过程,例如:基于 TCP 和 UDP 的 socket 服务开发。
上图展示了 Netty NIO 的核心逻辑。NIO 通常被理解为 non-blocking I/O 的缩写,表示非阻塞 I/O 操作。图中 Channel 表示一个连接通道,用于承载连接管理及读写操作;EventLoop 则是事件处理的核心抽象。一个 EventLoop 可以服务于多个 Channel,但它只会与单一线程绑定。EventLoop

本文介绍了Redis异步客户端Lettuce的选型原因,对比了Jedis,详细阐述了Lettuce在Redis Cluster模式下的应用,包括连接建立、客户端重定向、主备切换的处理策略,探讨了Lettuce在节点宕机时的恢复机制,强调了客户端连接稳定性和智能重定向的重要性。
最低0.47元/天 解锁文章
1318

被折叠的 条评论
为什么被折叠?



