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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/55869.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript创建,写入,复制,读取文件 只限IE ActiveX控件

最近接到需求,需要纯前端, 操作写入改变文件,一时间头大不已,还好此需求只需要屏幕展示,无需顾及兼容问题,找来找去找到了new ActiveXObject(“Scripting.FileSystemObject”) 强大控件 以下为自己记录的 …

贝锐蒲公英:没有公网IP,多分支企业如何高效远程访问OA系统?

贝锐蒲公英:没有公网IP,多分支企业、移动办公人员如何高效远程访问OA系统? 国内某大型美妆公司,旗下产品覆盖美容护肤品、彩妆、美容仪器、健康食品、SPA美容会所及等多类服务,致力于为客户提供高品质的产品和完善的服…

Vivado进行自定义IP封装

一. 简介 本篇文章将介绍如何使用Vivado来对上篇文章(FPGA驱动SPI屏幕)中的代码进行一个IP封装,Vivado自带的IP核应该都使用过,非常方便。 这里将其封装成IP核的目的主要是为了后续项目的调用,否则当我新建一个项目的时候,我需要将…

Mycat-Balance使用指南

MyCAT Balance是一个Java NIO的高性能负载均衡器,可以替代普通的硬件的交换机或其LVS类似的复杂机制,实现MyCAT集群的负载均衡。 MyCAT Balance的配置文件在conf目录下,frontend-conf.为前端配置,包括绑定的端口等,js…

ODOO16运输费用摊入采购成本,总账和收发表一致?

产品的采购成本准确的计算是怎样的呢?在《会计准则》中有规定: “第三章 计量 ... 第六条 存货的采购成本,包括购买价款、相关税费、运输费、装卸费、保险费以及其他可归属于存货采购成本的费用。” 可见存货的采购成本包含的信息是很多&am…

图解TCP 三次握手和四次挥手的高频面试题(2023最新版)

大家好,最近重新整理了一版 TCP 三次握手和四次挥手的面试题(2023最新版)。 ----- 任 TCP 虐我千百遍,我仍待 TCP 如初恋。 巨巨巨巨长的提纲,发车!发车! img TCP 基本认识 TCP 头格式有哪些…

SpringBoot笔记:SpringBoot集成Dataway

文章目录 1、什么是 Dataway?2、主打场景3、技术架构4、整合SpringBoot4.1、maven 依赖4.2、初始化脚本4.3、整合 SpringBoot 5、Dataway 接口管理6、Mybatis 语法支持7、小结 1、什么是 Dataway? 官网地址:https://www.hasor.net/docs/guides/quickstart Da…

TSINGSEE青犀视频汇聚平台EasyCVR多种视频流播放协议介绍

众所周知,TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入,包括主流标准协议GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。今天我们来说一说,EasyCVR平台支持分…

Spark2x原理剖析(一)

一、简介 Spark是基于内存的分布式计算框架。在迭代计算的场景下,数据处理过程中的数据可以存储在内存中,提供了比MapReduce高10到100倍的计算能力。Spark可以使用HDFS作为底层存储,使用户能够快速地从MapReduce切换到Spark计算平台上去。Sp…

契约测试之 - 用Pact-JS编写Message和GraphQL的契约测试

上一篇博客介绍了如何用Pact-JS编写HTTP协议的接口的契约测试,实际,Pact-JS除了能对通过HTTP协议接口交互的服务编写契约测试外,还可以对通过发送Message进行交互的Provider和Consumer编写契约测试,还可以对通过GraphQL进行查询的…

RabbitMQ(二)

二、高级特性、应用问题以及集群搭建 高级特性 1.消息的可靠性投递 在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。 rabbitMQ整个消息投递的路径为: produ…

如何在Visual Studio Code中用Mocha对TypeScript进行测试

目录 使用TypeScript编写测试用例 在Visual Studio Code中使用调试器在线调试代码 首先,本文不是一篇介绍有关TypeScript、JavaScript或其它编程语言数据结构和算法的文章。如果你正在准备一场面试,或者学习某一个课程,互联网上可以找到许多…

【啥都生】分类项目中的模型搭建代码解析

def build_model(cfg):if isinstance(cfg, list):modules [eval(cfg_.pop("type"))(**cfg_) for cfg_ in cfg]return Sequential(*modules)else:return eval(cfg.pop("type"))(**cfg)b站up啥都生维护的分类项目 这段代码的功能是完成模型搭建,…

Web后端基本设计思想

JavaWeb应用的后端一般基于MVC和三层架构思想实现。 MVC是一种设计模式,用于开发用户界面和交互式应用程序。M即Model,业务模型,负责处理应用程序的业务逻辑和数据;V即View,视图,负责给用户展示界面和数据&…

3ds Max建模教程:模拟布料拖拽撕裂和用剑撕裂两种效果

推荐: NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 拖拽撕布 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 在透视视口中创建平面。保持其长度 后座和宽度后座为 100。 创建平面 步骤 3 转到助手>假人并在 飞机的两侧。 助手>假人 步骤 4 选…

基础实验篇 | PX4控制器的外部通信

PX4控制器的外部通信 01 实验名称及目的 PX4控制器的外部通信:在进行硬件在环仿真时,我们常常需要向设计的Simulink控制器中发送数据(传感器数据、故障触发、控制指令、参数调整等),同时接收一些感兴趣的数据。RflySi…

ELK 企业级日志分析系统(一)

目录 一、ELK 简介 1.1 组件说明 1.2 为什么要使用ELK 1.3 完整日志系统的基本特征 1.4 ELK工作原理 二、Elasticsearch的介绍 2.1 Elasticsearch的核心: 三、Logstash 3.1 Logstash简介 四、Kibana 五、部署ELK日志分析系统 5.1 服务器配置 5.2 ELK Elasticse…

在PHP8中检测数据类型-PHP8知识详解

在PHP 8中,可以使用多种方法来检测数据类型。以下是常用的四种方法:使用 gettype() 函数、使用 is_* 系列函数、使用 get_debug_type() 函数、使用 get_class() 函数。 一、使用 gettype() 函数 gettype() 函数返回给定变量的数据类型。例如&#xff1a…

机器学习-New Optimization

机器学习(New Optimization) 前言: 学习资料 videopptblog 下面的PPT里面有一些符号错误,但是我还是按照PPT的内容编写公式,自己知道符号表示什么含义就好了 New Optimization 机器学习(New Optimization)NotationOn-line VS Off-line常用优…

Html5播放器按钮在移动端变小的问题解决方法

Html5播放器按钮在移动端变小的问题解决方法 用手机浏览器打开酷播云视频&#xff0c;有时会出现播放器按钮太小的情况&#xff0c;此时只需在<head>中加入下面这段代码即可解决&#xff1a; <meta name"viewport" content"widthdevice-width, initia…