当前位置: 首页 > news >正文

Redis 客户端有哪些?

文章目录

    • 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博客

http://www.lryc.cn/news/103913.html

相关文章:

  • smbms 超市订单管理系统设计与实现计划表
  • 如何解决制造业数字化改造的障碍?
  • 代码随想录算法训练营day49
  • 云计算与大数据——部署Kubernetes集群+完成nginx部署(超级详细!)
  • Maven 打包项目后,接口识别中文乱码
  • 计算机视觉项目中的文件批量操作与文件批量预处理
  • PHP数组转对象和对象转数组
  • 前后端分离开发中的传参
  • mount: wrong fs type, bad option, bad superblock报错 ubuntu
  • 【图像分类】CNN+Transformer结合系列.3
  • IDA分析实例android_crackme/EasyJNI/Transformers/pingan2
  • 拿捏--->求一元二次方程的根
  • 深入浅出之Docker Compose详解
  • spring5源码篇(12)——spring-mvc请求流程
  • 风辞远的科技茶屋:来自未来的信号枪
  • MongoDB教程-8
  • Redis 理论部分
  • Android—Monkey用法
  • 几个影响 cpu cache 性能因素及 cache 测试工具介绍
  • Java从入门到精通(二)· 基本语法
  • 云安全攻防(三)之 面向云原生环境的安全体系
  • BGP汇总和破解水平分割
  • BUG:pm2启动verdaccio报错:Invalid or unexpected toke
  • Zookeeper笔记
  • 【视觉SLAM入门】5.1. 特征提取和匹配--FAST,ORB(关键点描述子),2D-2D对极几何,本质矩阵,单应矩阵,三角测量,三角化矛盾
  • 【能量管理系统( EMS )】基于粒子群算法对光伏、蓄电池等分布式能源DG进行规模优化调度研究(Matlab代码实现)
  • 绘制Circos基因圈图
  • openGauss学习笔记-26 openGauss 高级数据管理-约束
  • 学习React(四)
  • 如何将单体项目拆分成微服务