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

Redis学习笔记10:基于spring的Lettuce redis客户端Pipelining管道

Redis提供了对pipelining管道的支持,这包括在不等待回复的情况下向服务器发送多个命令,然后在一个步骤中读取回复。当需要连续发送多个命令时,管道化可以提高性能,例如:将许多元素添加到同一列表中。

一个对springboot redis框架进行重写,支持lettuce、jedis、连接池、同时连接多个集群、多个redis数据库、开发自定义属性配置的开源SDK

<dependency><groupId>io.github.mingyang66</groupId><artifactId>emily-spring-boot-redis</artifactId><version>4.3.9</version>
</dependency>

GitHub地址:https://github.com/mingyang66/spring-parent

一、Redis回调接口RedisCallback
public interface RedisCallback<T> {@NullableT doInRedis(RedisConnection connection) throws DataAccessException;
}

Redis回调接口和RedisTemplate的execution方法一起使用,通常作为方法实现中的匿名实现,通常用于将多个操作链接在一起(get/set/trim…)

示例如下:

stringRedisTemplate.execute(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {StringRedisConnection stringRedisConn = (StringRedisConnection) connection;stringRedisConn.set("test", "1");stringRedisConn.setEx("test1",100,"2");String s = stringRedisConn.get("test");return null;}
});
二、pipelined管道executePipelined方法RedisCallback回调

Spring Data Redis提供了几种RedisTemplate方法,用于在管道中运行命令。如果你不关心管道的操作结果,您可以使用标准的execute方法,为pipeline管道参数传递true,executePipelined方法在管道中运行提供的RedisCallback或SessionCallback并返回结果。如下示例:

        List<Object> results = stringRedisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {StringRedisConnection stringRedisConn = (StringRedisConnection) connection;for (int i = 0; i < 100; i++) {stringRedisConn.setEx("test" + i, 100, i + 100 + "");}return null;}});

注意:RedisCallback返回的值必须为null,应为为了返回流水线命令的结果,会丢弃该值。管道操作一次可以发送多条指令,提高操作的性能

三、Lettuce驱动程序刷新策略

Lettuce驱动程序支持细粒度的刷新控制,允许在命令出现时刷新命令,缓冲或在连接关闭时发送命令。

LettuceConnectionFactory factory = // ...
//本地缓存并在每3个命令后刷新
factory.setPipeliningFlushPolicy(PipeliningFlushPolicy.buffered(3));

LettuceConnectionFactory默认策略是每个命令都直接刷新发送到服务器:

public class LettuceConnectionFactory{private PipeliningFlushPolicy pipeliningFlushPolicy = PipeliningFlushPolicy.flushEachCommand();
}
四、lettuce pipelined管道一次可以发送多少指令

​ 使用Lettuce执行Redis管道操作非常简单,可以一次性允许任意数量的指令。这种方式可以提高Redis的性能,特别是在需要执行多个指令的场景下。

五、StringRedisTemplate的executePipelined方法是同步还是异步执行
  • 在Spring Data Redis中,StringRedisTemplate的executePipelined方法是同步执行的。
  • executePipelined方法允许在单个Redis连接上执行多个命令,并返回一个包含所有命令的结果列表。它会一次性发送多个命令到Redis服务器,并等待所有命令的响应。
  • 调用executePipelined方法时,会阻塞当前线程,直到所有命令执行完毕并返回结果列表。因此,它是同步执行的,当前线程会等待所有命令的结果返回。

相关文章:

  • centos7 yum安装python3.9时报错【没有可用软件包 python3.9。 错误:无须任何处理】
  • 开放领域问答机器人2——开发流程和方案
  • 【避雷选刊】Springer旗下2/3区,2个月录用!发文量激增,还能投吗?
  • 使用matlab实现图像信号的色彩空间转换
  • HslCommunication模拟西门子读写数据
  • 压测必经之路,Jmeter分布式压测教程!
  • 响应式摄影科技传媒网站模板源码带后台
  • 《未来之路:技术探索与梦想的追逐》
  • IntelliJ IDEA 2023.2.1 (Ultimate Edition) 版本 Git 如何找回被 Drop Commit 的提交记录
  • 移植LVGL到单片机的一个demo简单介绍
  • Kubernetes实战(四)-部署docker harbor私有仓库
  • ROS话题(Topic)通信:通信模型、Hello World与拓展
  • MLIR笔记——目录
  • RSA 2048位算法的主要参数N,E,P,Q,DP,DQ,Qinv,D分别是什么意思 哪个是通常所说的公钥与私钥 -安全行业基础篇5
  • 2023年A股借壳上市研究报告
  • JavaScript-如何实现克隆(clone)函数
  • @jsonView过滤属性
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • CentOS从零开始部署Nodejs项目
  • Fundebug计费标准解释:事件数是如何定义的?
  • Golang-长连接-状态推送
  • HTTP请求重发
  • Linux CTF 逆向入门
  • Logstash 参考指南(目录)
  • node-glob通配符
  • 爱情 北京女病人
  • 飞驰在Mesos的涡轮引擎上
  • 机器学习中为什么要做归一化normalization
  • 将 Measurements 和 Units 应用到物理学
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 设计模式(12)迭代器模式(讲解+应用)
  • 通过几道题目学习二叉搜索树
  • 微信小程序实战练习(仿五洲到家微信版)
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 移动端唤起键盘时取消position:fixed定位
  • 正则与JS中的正则
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #《AI中文版》V3 第 1 章 概述
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #每日一题合集#牛客JZ23-JZ33
  • $GOPATH/go.mod exists but should not goland
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)Linux——Linux常用指令
  • (接口封装)