redis 客户端 -- lettuce 介绍
序言
本文意在介绍 redis 的非阻塞客户端 lettuce 的用法,比起jedis 客户端来说, lettuce 的异步特性和 底层的 nio 异步加持,显得 更加好用且高性能。
正文
关于远程 客户端 代码连接的通用设计的思考
常见 客户端连接的通用逻辑,redis 客户端 lettuce 也遵循了通常的连接流程
- 构建 连接 connect uri , 根据不同的客户端,schema 有所不同,类似 mysql 的连接schema 以 mysql::// 开始,而redis 连接schema 以 redis:// 开始
- 通过 connect uri 构造 连接 client
- 根据连接 client,构建 connection,每个connection 对不同的操作应该是不同的,而client 资源确是共享同步的
- 一般来说拿到connection 以后,就可以就行命令传递了,一般来说较为方便的连接客户端,会提供较为方便的连接操作,类 lettuce ,每个connect 需要进行的命令传递操作,在此基础上
抽象出 COMMAND 对象,每个COMMAND 就是 redis client 的COMMAND 抽象
5. 还有一点时,由于connection 的获取是需要付出一定代价的,所以现代客户端,都很喜欢配合 池化技术,节省一部分这样的开销,利用共享连接池, 例如 apache 的common pool 来进行配置池,可以猜想只要是用的是 cs 模型的基础组件,
我们在配置的时候就可以考虑,是否在客户端进行远端链接的时候进行池化技术的优化。
在此抽象概括下,连接客户端的一些通用设计理念,在此基本基础上的连接逻辑
- 首先我们要进行客户端远程命令的代码执行,connection 这个概念是各个 连接客户端都绕不过去的,为了生成这个connection, 像spring-redis 为例,spring-redis 里面的 redisTemplate 里面需要配置好 connectFactory,然后进行获取每次命令执行
的连接操作,而此时 的redisTemplate 可以认为是 lettuce里面的 client角色,是为了拿到connection的存在,拿到connection之后,可能在此基础上进行 命令传递的操作,然后在此基础上 spring-redis 抽象出了 Operation 的概念,各种对redis不同数据结构的操纵
都可以通过Operation 的api 来操纵,然后传递给远端 redis server
2. 以 java mysql connector 客户端举例的话,同样可以看到 这么几个角色, 首先是DriverManager ,类比上图,这其实就是 Client的角色,用来获取Connection的。拿到Connection以后, 要执行sql 命令了,怎么操作你,它在Connection传递命令的前提下
抽象出来 Statement这个概念,可以认为这个Statement就是一次事务或者读操作,类似于lettuce的 COMMAND角色,然后结果用ResultSet进行存储,以此可知。
3. 像 kafka 的客户端, spring kafka 的客户端设计, 其中 消费监听者这样的角色比较不同,因为生产消费者,涉及到的命令比较少,所以在消费端直接就通过 注解 @KafkaListener 加在方法上的方式来直接监听messager了,而生产者 对mq生产消息的方式是通过KafkaTemplate
的方式来执行的,此 KafkaTemplate 的构成 也是需要知道远端mq的连接方式的,其内部构成为需要 ProducerFactory来组成,这个ProduceFactory 类似于 lettuce Client的存在了,相当于每次发送 message 给mq ,都要新产生一个网络连接,产生连接,名字也和Factory相互照应。
像常见的 解码器和编码器也需要在 Template 这一层进行配置,在此不表,像RedisTemplate也是同样的设计理念。 KafkaTrancationManager 和 mysql 的TrancationManager 的角色类似,当配置也是同样的 需要 produceFactory 进行配置, TrancationMnager → ProduceFactory,
像KafkaTrancationManger的使用意义在于,和数据库一样,在@Transaction 修饰的方法上,如果抛异常,则消息不会发送
4. 以 es 举例的话,官网提供的 es 的客户端,特定维护了两个版本,一个 是low level 为了兼容所有版本的es, 一个是high level 的 rest client , 以high level 的 client 来看,它同样是是以client 角色,来执行 命令的Request 封装,得到一个Response,在此就忽略了 Connection 这样的概念,封装在Client 的请求里面
lettuce 支持的 基本操作语法支持,和接口设计抽象
lettuce 支持三种范式调用
- 同步 2.异步 3. react 式
2. 单机和集群的 connection, pub 和sub connection 分别获取
redis 客户端 -- lettuce 介绍相关推荐
- 闲谈Redis客户端Lettuce
简介 Lettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了Project Reactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK ...
- Redis客户端Lettuce源码【一】Jedis vs Lettuce
文章目录 基本实现对比 性能对比 Jedis的基本用法 Jedis配合Springboot RedisTemplate使用 Lettuce的基本用法 Lettuce配合Springboot Redis ...
- redis客户端predis介绍
README.markdown 官方介绍 # Predis # ## About ## Predis is a flexible and feature-complete PHP (>= 5.3 ...
- Redis高级客户端Lettuce详解
前提 Lettuce是一个Redis的Java驱动包,初识她的时候是使用RedisTemplate的时候遇到点问题Debug到底层的一些源码,发现spring-data-redis的驱动包在某个版本之 ...
- Redis 高级 Java 客户端 Lettuce 的用法及踩坑经验
如果你在网上搜索 Redis 的 Java 客户端,你会发现,大多数文献介绍的都是 Jedis,不可否认,Jedis 是一个优秀的基于 Java 语言的 Redis 客户端,但是,其不足也很明显:Je ...
- springboot项目中redis客户端(Jedis、Lettuce、Redisson)
一.redis客户端的对比 1).Jedis Jedis作为Redis官方推荐的一款客户端,也算是简单好用,基础功能齐全,在中小型项目中还是很好用的,但是Jedis是直连模式,在多个线程间共享一个Je ...
- 慢连接 java_记一次redis的java客户端lettuce操作慢的解决方案
因为项目业务需要,我们要把数据库中的大量数据缓存到redis中,并且会随时更新缓存,刚开始更新频率是1Hz,没有什么问题,后来更新频率达到了5Hz,lettuce开始疯狂报错:redis comman ...
- 操作Redis客户端工具详解之功能介绍及配置
问题背景 日常开发过程中,对于缓存,我们并不陌生.常用的缓存有个Redis.memcache.memcached等.那么操作缓存的工具又有很多,我们该怎么选择呢? 今天我们聊一下Redis的操作客户端 ...
- Redisson--最好用的Redis客户端--介绍
原文网址:Redisson--最好用的Redis客户端--介绍_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Redisson这款最好用的Redis客户端. 官网 官网:Redisson: R ...
- Redis的Java客户端Lettuce简介
环境 操作系统:Ubuntu 20.04 Redis:6.2.6 开发工具:IntelliJ IDEA 2022.1 (Community Edition) Lettuce的官网( https://l ...
最新文章
- idea配置 Tomcat Deployment添加时没有Artifact...选择的解决方案
- 架构设计之「 微服务入门 」
- sqlerror.java 1074_java.sql.SQLException: Before start of result set异常
- win11怎么去除快速搜索 Windows11去除快速搜索的步骤方法
- 基于nodejs,tinypng的压缩图片工具
- GDB 调试器使用手册
- Ubuntu下载安装CUDA
- 【HITB GSEC CTF 2017】1000levels
- 如何做拉新活动?拉新裂变的12种玩法,你学废了没?
- 骗子、假先知们一夜暴富背后:区块链是回归互联网本来意义的唯一希望|深度
- 提供几本WEB前端开发电子书(2012/10/31更新)
- 三星“掌门人”李在镕身在看守所 但仍“遥控”三星
- VLAN、Trunk概述和三层交换机原理
- java调用ltp_LTP随笔——本地调用ltp之ltp4j
- Android 自定义Activity的主题
- 分析QQ微信使用的是UDP还是TCP协议
- 数据结构通过链表实现班级同学通讯录
- Java使用ffmpeg实现从视频中提取音频 (mp4、mp3)
- 新年来临最后一天听到了职业培训新的声音
- 洛谷P3131 [USACO16JAN]Subsequences Summing to Sevens S 题解
热门文章
- 看了扎克伯格的Avatar,我更想在VR里当大猩猩
- 怎么学好html5和css3,如何提高你的CSS水平
- Shiro介绍(四):定义自己的安全域Realm
- UVa 12307 Smallest Enclosing Rectangle(旋转卡壳+最小覆盖矩形)
- spring mvc 404 报错记录
- php mysql primary key_MySQL_简单分析MySQL中的primary key功能,在5.1.46中优化器在对primary key - phpStudy...
- 【图像重建】基于Split Bregman实现稀疏图像重建附matlab代码
- 随机子空间(RSM)
- 蒟蒻信安笔记4:CTF实践
- java制作进度条,Java制作进度条