如何在 SpringBoot 项目使用 Redis 的 Pipeline 功能

本文是博主在批量存储聊天中用户状态和登陆信息到 Redis 缓存中时,使用到了 Pipeline 功能,并对此做出了整理。
一、Redis Pipeline 是什么
Redis 的 Pipeline 功能可以显著提升 Redis 操作的性能,性能提升的原因在于可以批量执行命令。当我们在存储数据时,会遇到批量存储的情况,在这种情况下,Pipeline 可以很好的处理,它可以是减少网络往返次数,从而显著提高 Redis 操作的性能。
这种情况例如:聊天系统中要统计每个用户的最后的状态,在这个情况下,用户数是一个很大的基体,每秒中会有很多的用户状态变化,变化的过程依赖最后一次使用状态,这就造成了批量的效果。
Redis Pipeline 是一种将多个命令打包发送到 Redis 服务器的技术,避免了逐条发送命令的网络延迟问题。通过 Pipeline,客户端可以一次性发送多个命令,服务器依次处理这些命令并将结果批量返回。
注意:
- 事务性:Pipeline 并不自动开启事务,它只是将多个命令打包发送,可以结合 Redis 的事务功能。
- 错误处理:在 Pipeline 中,如果某个命令失败,其他命令仍然会继续执行,需要在代码中处理可能的异常。
二、如何在 SpringBoot 使用
Spring Data Redis 提供了对 Pipeline 的支持,可以通过 RedisTemplate 的 executePipelined 方法实现。
如何在 SpringBoot 创建并连接 Redis 可参考该文章:SpringBoot 框架关于如何创建并使用 Redis 的详细介绍
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
默认情况下,Spring Boot 使用 Lettuce 作为 Redis 客户端,创建一个配置类来定义 RedisTemplate,并设置序列化器。
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer()); // 设置键的序列化器template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // 设置值的序列化器return template;}
}
创建一个服务类来封装 Pipeline 操作:
@Service
public class RedisPipelineService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void executePipeline() {// 使用 SessionCallback 来实现 PipelineList<Object> results = redisTemplate.executePipelined(new SessionCallback<Object>() {@Overridepublic Object execute(RedisOperations operations) {// 在此处添加多个命令到 Pipeline 中operations.opsForValue().set("key1", "value1");operations.opsForValue().set("key2", "value2");operations.opsForValue().set("key3", "value3");return null;}});// 获取执行结果System.out.println("Pipeline 执行结果: " + results);}
}
在控制器中调用 Pipeline 方法。
@RestController
public class RedisController {@Autowiredprivate RedisPipelineService redisPipelineService;@GetMapping("/testPipeline")public String testPipeline() {redisPipelineService.executePipeline();return "Pipeline 执行已完成!";}
}
通过以上的步骤就可以做到简单的使用Redis 的 Pipeline 功能,面对复杂业务,其实也就是数据的键和值之间的调整,本质还是简单方法的调用。
三、实战示例
业务:将用户的最后一次状态存入缓存,例如最后一次状态信息是上线还是下线。需要将一个 LIst<User> 数组批量存入到缓存中,这个数组就是通过某些组件得到,例如 MQ 队列,数组元素是 User 对象,含有最后一次状态的数据。缓存中 key 是 userId ,我现在将这个数组使用 Pipeline 存入缓存,规则是缓存中如果存在就更新缓存,没有就新加缓存。
1、定义 User 类
@Data
public class User {private String userId;private String name;private int status;
}
2、配置 RedisTemplate 类
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 设置键的序列化器template.setKeySerializer(new StringRedisSerializer());// 设置值的序列化器(使用 JSON 序列化器,方便存储复杂对象)template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}
}
2、实现 Pipeline 存储逻辑
@Service
public class RedisUserService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 使用 Pipeline 将 List<User> 存入 Redis* @param users 用户列表*/public void saveUsersWithPipeline(List<User> users) {// 使用 executePipelined 方法执行 Pipeline 操作redisTemplate.executePipelined(new SessionCallback<Object>() {@Overridepublic Object execute(RedisOperations operations) throws DataAccessException {// 遍历用户列表,将每个用户对象存入 Redisfor (User user : users) {String key = user.getUserId();// 这里可以添加其他业务,例如根据用户的上一次状态确定是否修改存储operations.opsForValue().set(key, user); // 如果键存在则更新,不存在则新增}return null;}});}
}
3、使用方法
@RestController
public class RedisController {@Autowiredprivate RedisUserService redisUserService;@GetMapping("/saveUsers")public String saveUsers() {// 创建一个用户列表List<User> users = new ArrayList<>();User user1 = new User();user1.setUserId("1");user1.setName("Alice");user1.setStatus(0);User user2 = new User();user2.setUserId("2");user2.setName("Bob");user2.setStatus(1);users.add(user1);users.add(user2);// 使用 Pipeline 存储用户列表redisUserService.saveUsersWithPipeline(users);return "用户列表已成功存入 Redis!";}
}
通过上述代码,实现了使用 Spring Data Redis 的 executePipelined 方法将一个 List<User> 数组通过 Pipeline 存入 Redis 。每个 User 对象的 userId 作为键,User 对象作为值。如果键存在则更新,不存在则新增。这种方式不仅提高了性能,还简化了批量操作的代码逻辑。
相关文章:
如何在 SpringBoot 项目使用 Redis 的 Pipeline 功能
本文是博主在批量存储聊天中用户状态和登陆信息到 Redis 缓存中时,使用到了 Pipeline 功能,并对此做出了整理。 一、Redis Pipeline 是什么 Redis 的 Pipeline 功能可以显著提升 Redis 操作的性能,性能提升的原因在于可以批量执行命令。当我…...
Python Django系列—入门实例
我们假定你已经阅读了 安装 Django。你能知道 Django 已被安装,且安装的是哪个版本,通过在命令提示行输入命令(由 $ 前缀)。 $ python -m django --version 如果这行命令输出了一个版本号,证明你已经安装了此版本的…...
2024年第十五届蓝桥杯青少 图形化编程(Scratch)省赛中级组真题——截取递增数
截取递增数 背景信息 递增数:如果一个大于9的正整数各个数位上的数,从左到右是逐渐变大的,那么就称这个数为递增数。 例如124、248 是递增数。 给你一个不含0的九位数,请找出从这个九位数中能截取出的所有递增数。例如:115367…...
【ECMAScript6】
【ECMAScript6】 01. ES6介绍02. let和const命令03. 模板字符串04. 函数之默认值、剩余参数05. 函数之扩展运算符、箭头函数06. 箭头函数this指向和注意事项07. 解构赋值08. 扩展的对象的功能(简写)09. Symbol类型10. Set集合数据类型11. Map数据类型12.…...
WebUI 部署 Ollama 可视化对话界面
文章目录 一、Node.js 安装1.系统环境查询2.官网下载nodejs 安装包3.安装 Node.js 并配置环境变量4.验证安装是否正确 二、ollama-webui 安装与配置1.代码库下载2.依赖安装3.运行 三、遇到问题与解决 一、Node.js 安装 1.系统环境查询 ubuntu20.04 系统,x86-64架构…...
BMS应用软件开发 — 17 上下电控制与诊断开发 (Simulink)
目录 17.1 上下电控制流程 17.1.1 上下电流程 17.1.2 下电过程的电机放电 17.1.3 继电器状态检测 17.2 预充继电器状态判断 17.1 上下电控制流程 17.1.1 上下电流程 高压上电是指动力电池为车辆提供高压,使高压回路导通,为车辆的各个高压部件供电&…...
UE5 Gameplay框架及继承关系详解
文章目录 前言一、核心类及其继承关系二、核心类的职责与协作2.1 Actor & Pawn2.2 Controller2.3 GameMode & GameState2.4 PlayerState2.5 HUD & UI 三、协作流程示例总结 前言 Unreal Engine 5(UE5)的 Gameplay 框架 是一个高度模块化的系…...
html - 手工添加上次阅读的位置, 方便下次阅读
文章目录 html - 手工添加上次阅读的位置, 方便下次阅读概述笔记END html - 手工添加上次阅读的位置, 方便下次阅读 概述 在看一本电子书,有pdf格式的,但是比较喜欢看html格式的(复制比较方便)。 但是有个缺点,如果看到一半,关掉…...
JavaSE学习笔记26-集合(Collection)
集合 Java 中的集合(Collection)是 Java 标准库中非常重要的一部分,用于存储和操作一组对象。Java 集合框架(Java Collections Framework)提供了一套丰富的接口和类,用于处理各种数据结构,如列…...
使用Open WebUI下载的模型文件(Model)默认存放在哪里?
🏡作者主页:点击! 🤖Ollama部署LLM专栏:点击! ⏰️创作时间:2025年2月21日21点21分 🀄️文章质量:95分 文章目录 使用CMD安装存放位置 默认存放路径 Open WebUI下…...
Django数据库操作
1、ORM 创建、删除、修改数据库的表中的数据,但不能创建数据库往数据库表中写入数据 表名:app名称_类名的小写 2、操作表数据 from django.db import modelsclass Department(models.Model):title models.CharField(verbose_name"部门", …...
005:Cesium.viewer 知识详解、示例代码
查看本专栏目录 - 本文是第 005个API内容详解 vue+cesium 示例教程200+目录 文章目录 一、Cesium.Viewer 知识详解1. 主要用途2. 构造函数与参数3. 常用属性(1)`viewer.scene`(2)`viewer.camera`(3)`viewer.entities`(4)`viewer.clock`4. 常用方法(1)`viewer.zoomTo(…...
蓝桥杯单片机组第十二届省赛第二批次
前言 第十二届省赛涉及知识点:NE555频率数据读取,NE555频率转换周期,PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。 本试题涉及模块较少,题目不难,基本上准备充分的都能完整的实现每一个功能,并…...
AI客服-接入deepseek大模型到微信(本地部署deepseek集成微信自动收发消息)
1.本地部署 1.1 ollama Ollama软件通过其高度优化的推理引擎和先进的内存管理机制,显著提升了大型语言模型在本地设备上的运行效率。其核心采用了量化技术(Quantization)以降低模型的计算复杂度和存储需求,同时结合张量并行计算&…...
Git 常用指令及其说明
配置相关 # 配置全局用户名 git config --global user.name "YourUsername"# 配置全局邮箱 git config --global user.email "your.emailexample.com"说明:这两条命令用于设置 Git 全局的用户名和邮箱,在提交代码时,这些…...
华为2025年技术发布会:智能汽车核心技术大爆发
近日,华为在鸿蒙智行尊界技术发布会上发布了多项智能汽车核心技术,涵盖智能驾驶、安全防护、通信系统、座舱交互及电池技术等领域,标志着其从“被动智能”向“自主智能”的战略升级。 以下是核心技术的综合梳理: 六大核心创新 途…...
SeaCMS V9海洋影视管理系统报错注入
漏洞背景 SQL 注入攻击是当前网络安全中最常见的一种攻击方式,攻击者可以利用该漏洞访问或操作数据库,造成数据泄露或破坏。通常发生在开发人员未能正确处理用户输入时。 在 SeaCMS V9 中,用户输入(如登录、评论、分页、ID 等&a…...
vue3父子组件props传值,defineprops怎么用?(组合式)
目录 1.基础用法 2.使用解构赋值的方式定义props 3.使用toRefs的方式解构props (1).通过ref响应式变量,修改对象本身不会触发响应式 1.基础用法 父组件通过在子组件上绑定子组件中定义的props(:props“”)传递数据给子组件 <!-- 父组件…...
Django-Vue 学习-VUE
主组件中有多个Vue组件 是指在Vue.js框架中,主组件是一个父组件,它包含了多个子组件(Vue组件)。这种组件嵌套的方式可以用于构建复杂的前端应用程序,通过拆分功能和视图,使代码更加模块化、可复用和易于维…...
Ollama部署本地大模型DeepSeek-R1-Distill-Llama-70B
文章目录 一、下模二、转模1. 下载转换工具2. 安装环境依赖3. llama.cpp1. 转换脚本依赖2. llama.cpp安装依赖包3. llama.cpp编译安装4. 格式转换 三、Ollama部署1. 安装启动Ollama2. 添加模型3. 测试运行 一、下模 #模型下载 from modelscope import snapshot_download model…...
Zabbix问题记录2--踩坑HttpRequest,header添加无效
背景 在试图尝试通过Zabbix接入DeepSeek API的时候,由于使用了HTTP的方式,所以需要使用Zabbix 自带的HttpRequest库进行请求,产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…...
MTK Android12 预装apk可卸载
文章目录 需求解决方法1、device/mediatek/mt6761/device.mk2、/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt3、路径:4、Android.mk 需求 近期,客户需要预装一个apk,同时该apk要可卸载。解…...
Redis 集群的三种模式:一主一从、一主多从和多主多从
本文记述了博主在学习 Redis 在大型项目下的使用方式,包括如何设置Redis主从节点,应对突发状况如何处理。在了解了Redis的集群搭建和相关的主从复制以及哨兵模式的知识以后,进而想要了解 Redis 集群如何使用,如何正确使用…...
网络工程知识笔记
1. 什么是网络? 网络是由多个节点(如计算机、打印机、路由器等)通过物理或逻辑连接组成的系统,用于数据的传输和共享。这些节点可以通过有线(如以太网)或无线(如 Wi-Fi)方式进行连接…...
FFmpeg进化论:从av_register_all手动注册到编译期自动加载的技术跃迁
介绍 音视频开发都知道 FFmpeg,因此对 av_register_all 这个 API 都很熟悉,但ffmpeg 4.0 版本开始就已经废弃了,是旧版本中用于全局初始化的重要接口。 基本功能 核心作用:av_register_all() 用于注册所有封装器(muxer)、解封装器(demuxer)和协议处理器(protocol),…...
初识.git文件泄露
.git 文件泄露 当在一个空目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。 如果想备份或复制一个版本库,只需把这个目录拷贝至另一处就可以了 这是一种常见的安全漏洞,指的是网站的 .git 目录…...
运行测试用例
python odoo-bin -d <database_name> -i my_module --test-tagsmy_module:TestOptimalRouteSelection.test_route_profit_calculation --stop-after-init-d <database_name>:指定 Odoo 使用的数据库名称。 -i my_module:加载和初始化要测试的…...
政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 下载项目 创建虚拟环境 安装项目依赖 安装 Gradio(UI) 运…...
[250224] Yaak 2.0:Git集成、WebSocket支持、OAuth认证等 | Zstandard v1.5.7 发布
目录 Yaak 2.0 发布:Git 集成、WebSocket 支持、OAuth 认证等众多功能!Zstandard v1.5.7 发布:性能提升,稳定性增强 Yaak 2.0 发布:Git 集成、WebSocket 支持、OAuth 认证等众多功能! Yaak,一款…...
(六)趣学设计模式 之 代理模式!
目录 一、啥是代理模式?二、为什么要用代理模式?三、代理模式的实现方式1. 静态代理2. JDK动态代理3. CGLIB动态代理 四、三种代理的对比五、代理模式的优缺点六、代理模式的应用场景七、总结 🌟我的其他文章也讲解的比较有趣😁&a…...
