文章目录
- Jedis
- Lettuce
- Redisson
- 最佳实践 - 到底用哪个?
Redis 最常见的 Java 客户端有两个,Jedis 和 Lettuce,高级客户端有 Redisson,见下图(图源 Clients | Redis)
Jedis
Github地址:redis/jedis: Redis Java 客户端 (github.com)
SpringBoot2.0 之前的默认 Java 连接 Redis 客户端,作为 Redis 官方推荐的老牌 Java 客户端,Jedis 提供了对 Redis 命令完善的支持。
Jedis 通过 Socket 直接连接 Redis,实际上就是一个 tcp 连接,在使用完连接对象后需要关闭连接,否则会占用系统资源,造成内存泄漏,并且频繁的创建连接,销毁连接开销过大。在并发场景下,直连的方式也存在着线程不安全的问题。为什么线程不安全呢?
查看 Jedis 源码可知,socket、outputStream、inputStream 对象都是共享变量。
通过引入池化思想,使用连接池管理 Jedis 连接对象,降低创建销毁的开销,同时避免了线程不安全的问题,一个线程对应一个连接对象,请求处理完成后,归还连接对象到连接池,提高了性能。
虽然 Jedis 提供了较为全面的 Redis 原生指令的支持,但是其上层封装比较弱,并且对集群等其他高级特性支持度非常低。通过 Socket 进行网络通信,使用阻塞 I/O,且其方法调用都是同步的,程序流需要等到 sockets 处理完 I/O 才能执行,不支持异步。
Lettuce
官网:Lettuce
在 SpringBoot 2.0 之后,被选作为 默认的 Redis 客户端,身为后期之秀的 Lettuce,底层采用了 Netty 实现了网络通信,通过创建一个线程安全的连接对象就可以实现多个线程共享一个连接(除了事务和阻塞操作),并很好的支持 Redis 的高级特性,比如哨兵,集群等。
Lettuce 支持同步、异步以及响应式通信模式。
至于性能方面,csdn 界普遍认为 Lettuce 的性能更高,但我总觉得两者差不多,实践是检验真理的唯一标准,后面再填坑。
Lettuce 相较于Jedis,使用上更加方便快捷(大多数情况下不需要连接池),抽象度更高。通过复用线程安全的连接对象,降低了系统中 Redis 的连接数量,提升了系统的稳定性,并且 Lettuce 也提供了很多配置、接口,方便对性能进行优化和实现深度业务定制的场景。除此之外,其官方社区更为活跃,官方文档也配备详细。
Spring Data Redis 官方文档中有解释为什么 Spring 后来选择了 Lettuce?(X 表示支持该项功能)
Redisson
Github 地址:redisson
高级客户端,Redisson支持异步,底层是基于netty框架的事件驱动作为通信层,提供了许多开箱即用的高级功能。最常使用的就是分布式锁(可重入锁、红锁、联锁、公平锁、读写锁等)的功能,除了 redis 常用数据结构命令服务之外,还实现了 分布式 ID、布隆过滤器、分布式对象、分布式集合等
Redisson 为使用者提供了一系列具有分布式特性的常用工具类,使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。
最佳实践 - 到底用哪个?
从 Spring 将 Lettuce 作为 Redis 的默认客户端可以看出,Lettuce 以及逐渐超越 Jedis 成为了更优秀的 Redis 客户端,Lettuce 支持了更多的 Redis 特性,并且支持多种通信模式,但是 Lettuce 与 Jedis 都没有提供其他高级功能的实现,如分布式锁等,需要我们自己实现或借助 Redisson,csdn界通常的方案是 Lettuce + Redisson 的组合使用,两者相辅相成,各自发挥所长。
参考:
初探 Redis 客户端 Lettuce:真香! - vivo互联网技术 - 博客园 (cnblogs.com)
Jedis那么低性能,还在用?赶紧换上 lettuce 吧! - 知乎 (zhihu.com)
Redis三种客户端对比(优缺点对比+使用建议) - 知乎 (zhihu.com)
redisson使用全解——redisson官方文档+注释(上篇)_redisson官网中文_秃了也弱了。的博客-CSDN博客