Redis 除了数据类型外的核心功能 的详细说明,包含事务、流水线、发布/订阅、Lua 脚本的完整代码示例和表格总结

以下是 Redis 除了数据类型外的核心功能 的详细说明,包含事务、流水线、发布/订阅、Lua 脚本的完整代码示例和表格总结:


1. Redis 事务(Transactions)

功能描述

事务通过 MULTIEXEC 命令将一组命令打包执行,保证命令的原子性(非严格原子性)。事务中的命令会被顺序执行,但中间可能被其他客户端命令插入。

代码示例
@Service
public class RedisTransactionService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 使用事务操作public void transactionExample() {redisTemplate.multi(); // 开启事务try {// 添加多个命令到事务队列redisTemplate.opsForValue().set("key1", "value1");redisTemplate.opsForValue().increment("counter", 1);// 提交事务List<Object> results = redisTemplate.exec();System.out.println("事务执行结果:" + results);} catch (Exception e) {redisTemplate.discard(); // 回滚事务throw e;}}
}
注意事项
  • 事务中的命令若失败,后续命令仍会执行。
  • 使用 exec() 提交后,返回所有命令的执行结果列表。

2. Redis 流水线(Pipeline)

功能描述

流水线将多个命令批量发送到 Redis 服务器,减少网络往返延迟,提升性能。适用于批量操作(如批量读写)。

代码示例
@Service
public class RedisPipelineService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 使用流水线批量操作public void pipelineExample() {redisTemplate.executePipelined((RedisConnection connection) -> {connection.set("key1".getBytes(), "value1".getBytes());connection.set("key2".getBytes(), "value2".getBytes());connection.set("key3".getBytes(), "value3".getBytes());return null;});}
}
注意事项
  • 流水线通过 executePipelined 方法实现,需操作底层 RedisConnection
  • 批量操作需自行处理字节序列化。

3. Redis 发布/订阅(Pub/Sub)

功能描述

用于实时消息通信:

  • 发布者:向频道(channel)发送消息。
  • 订阅者:监听指定频道的消息。
代码示例
3.1 发布者
@Service
public class RedisPublisherService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 发布消息到频道public void publishMessage(String channel, String message) {redisTemplate.convertAndSend(channel, message);}
}
3.2 订阅者
@Configuration
public class RedisSubscriberConfig {@Beanpublic RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.addMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message, byte[] pattern) {String channel = new String(message.getChannel());String payload = new String(message.getBody());System.out.println("收到消息:频道[" + channel + "],内容[" + payload + "]");}}, new PatternTopic("channel:*")); // 订阅所有以 "channel:" 开头的频道return container;}
}
注意事项
  • 需配置 RedisMessageListenerContainer 监听消息。
  • 消息不会持久化,客户端断开后未接收的消息会丢失。

4. Redis Lua 脚本(Lua Scripting)

功能描述

通过 Lua 脚本实现 原子性操作,适用于需要严格一致性的场景(如分布式锁、库存扣减)。Lua 脚本在 Redis 服务端单线程执行,确保原子性。

代码示例
4.1 示例脚本:库存扣减
-- Lua 脚本:扣减库存,仅当库存大于0时扣减
local stock = tonumber(redis.call("GET", KEYS[1]))
if stock and stock > 0 thenredis.call("DECR", KEYS[1])return stock - 1
elsereturn -1 -- 库存不足
end
4.2 Spring Boot 调用 Lua 脚本
@Service
public class RedisLuaService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 执行 Lua 脚本(库存扣减)public Long deductStock(String stockKey) {DefaultRedisScript<Long> script = new DefaultRedisScript<>();script.setScriptText(loadLuaScript("deduct_stock.lua")); // 加载脚本内容script.setResultType(Long.class);return redisTemplate.execute(script, Collections.singletonList(stockKey), new Object[]{});}// 加载 Lua 脚本内容(示例)private String loadLuaScript(String scriptName) {// 实际开发中可从文件或资源加载return "local stock = tonumber(redis.call('GET', KEYS[1])) ..."; // 省略脚本内容}
}
注意事项
  • 脚本在 Redis 服务端执行,需确保脚本逻辑正确。
  • 可通过 SHA1 哈希缓存脚本,减少传输开销。

5. 总结表格

功能描述代码方法适用场景
事务将一组命令打包执行,保证顺序性,但非严格原子性。redisTemplate.multi()redisTemplate.exec()需要命令顺序执行但允许部分失败的场景。
流水线批量发送命令,减少网络延迟。redisTemplate.executePipelined()大批量读写操作(如批量插入、查询)。
发布/订阅实时消息通信,支持频道或模式订阅。redisTemplate.convertAndSend()RedisMessageListenerContainer实时通知(如订单状态更新、聊天消息)。
Lua 脚本在 Redis 服务端原子性执行复杂逻辑,确保数据一致性。redisTemplate.execute(script, keys, args)需要严格原子性的操作(如分布式锁、扣减库存)。

6. 关键点总结

  1. 事务 vs Lua 脚本

    • 事务提供顺序执行,但非原子性(中间可能被其他命令中断)。
    • Lua 脚本确保原子性,适合需要严格一致性的场景。
  2. 流水线优化

    • 批量操作时,流水线可显著提升性能(减少网络 RTT)。
  3. 发布/订阅

    • 适用于实时消息通信,但需注意消息丢失风险(客户端断开时未接收的消息会丢失)。
  4. Lua 脚本注意事项

    • 脚本在服务端执行,需谨慎设计逻辑(避免死循环或高耗时操作)。
    • 可通过 EVALSHA 命令缓存脚本,减少传输开销。

通过合理使用这些功能,可以解决高并发场景下的性能、一致性和实时性挑战。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出

目录 前言 输出时的GPIO控制部分 标准库是如何操作寄存器完成GPIO驱动的初始化的&#xff1f; 问题1&#xff1a;如何掌握GPIO的编程细节——跟寄存器如何打交道 问题2&#xff1a;哪些寄存器&#xff0c;去哪里找呢&#xff1f; 问题三&#xff0c;寄存器的含义&#xff…

前端布局难题:父元素padding导致子元素无法全屏?3种解决方案

大家好&#xff0c;我是一诺。今天要跟大家分享一个我在实际项目中经常用到的CSS技巧——如何让子元素突破父元素的padding限制&#xff0c;实现真正的全屏宽度效果。 为什么会有这个需求&#xff1f; 记得我刚入行的时候&#xff0c;接到一个需求&#xff1a;要在内容区插入…

当网页受到DDOS网络攻击有哪些应对方法?

分布式拒绝服务攻击也是人们较为熟悉的DDOS攻击&#xff0c;这类攻击会通过大量受控制的僵尸网络向目标服务器发送请求&#xff0c;以此来消耗服务器中的资源&#xff0c;致使用户无法正常访问&#xff0c;当网页受到分布式拒绝服务攻击时都有哪些应对方法呢&#xff1f; 建立全…

LeNet-5简介及matlab实现

文章目录 一、LeNet-5网络结构简介二、LeNet-5每一层的实现原理2.1. 第一层 (C1) &#xff1a;卷积层&#xff08;Convolution Layer&#xff09;2.2. 第二层 (S2) &#xff1a;池化层&#xff08;Pooling Layer&#xff09;2.3. 第三层&#xff08;C3&#xff09;&#xff1a;…

【LLM】MCP(Python):实现 stdio 通信的Client与Server

本文将详细介绍如何使用 Model Context Protocol (MCP) 在 Python 中实现基于 STDIO 通信的 Client 与 Server。MCP 是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互&#xff0c;还是构建自定义…

Docker 安装 Elasticsearch 教程

目录 一、安装 Elasticsearch 二、安装 Kibana 三、安装 IK 分词器 四、Elasticsearch 常用配置 五、Elasticsearch 常用命令 一、安装 Elasticsearch &#xff08;一&#xff09;创建 Docker 网络 因为后续还需要部署 Kibana 容器&#xff0c;所以需要让 Elasticsearch…

Swagger @ApiOperation

ApiOperation 注解并非 Spring Boot 自带的注解&#xff0c;而是来自 Swagger 框架&#xff0c;Swagger 是一个规范且完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务&#xff0c;而 ApiOperation 主要用于为 API 接口的操作添加描述信息。以下为…

【奇点时刻】GPT4o新图像生成模型底层原理深度洞察报告(篇2)

由于上一篇解析深度不足&#xff0c;经过查看学习相关论文&#xff0c;以下是一份对 GPT-4o 最新的图像生成模型 的深度梳理与洞察&#xff0c;从模型原理到社区解读、对比传统扩散模型&#xff0c;再到对未来趋势的分析。为了便于阅读&#xff0c;整理成以下七个部分&#xff…

C# 窗体应用(.FET Framework ) 打开文件操作

一、 打开文件或文件夹加载数据 1. 定义一个列表用来接收路径 public List<string> paths new List<string>();2. 打开文件选择一个文件并将文件放入列表中 OpenFileDialog open new OpenFileDialog(); // 过滤 open.Filter "(*.jpg;*.jpge;*.bmp;*.png…

Scala 面向对象编程总结

​​​抽象属性和抽象方法 基本语法 定义抽象类&#xff1a;abstract class Person{} //通过 abstract 关键字标记抽象类定义抽象属性&#xff1a;val|var name:String //一个属性没有初始化&#xff0c;就是抽象属性定义抽象方法&#xff1a;def hello():String //只声明而没…

人工智能赋能工业制造:智能制造的未来之路

一、引言 随着人工智能技术的飞速发展&#xff0c;其应用场景不断拓展&#xff0c;从消费电子到医疗健康&#xff0c;从金融科技到交通运输&#xff0c;几乎涵盖了所有行业。而工业制造作为国民经济的支柱产业&#xff0c;也在人工智能的浪潮中迎来了深刻的变革。智能制造&…

元宇宙概念下,UI 设计如何打造沉浸式体验?

一、元宇宙时代UI设计的核心趋势 在元宇宙概念下&#xff0c;UI设计的核心目标是打造沉浸式体验&#xff0c;让用户在虚拟世界中感受到身临其境的交互效果。以下是元宇宙时代UI设计的几个核心趋势&#xff1a; 沉浸式体验设计 元宇宙的核心是提供沉浸式体验&#xff0c;UI设计…

AI 如何帮助我们提升自己,不被替代

在当今快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐渗透到生活的方方面面。许多人担心 AI 会取代人类的工作&#xff0c;然而&#xff0c;AI 更多的是作为一种强大的赋能工具&#xff0c;帮助我们提升自身能力&#xff0c;让我们在工作中更具竞争力。以…

基于SpringBoot+Vue实现的二手交易市场平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的发展和人们生活水平的提高&#xff0c;消费者购买能力的提升导致产生了大量的闲置物品&#xff0c;这些闲置物品具有一定的经济价值。特别是在高校环境中&#xff0c;学生群体作为一个具有一定消费水平的群体&#xff0c;每…

k8s安装cri驱动创建storageclass动态类

部署nfs服务器 #所有k8s节点安装nfs客户端 yum install -y nfs-utils mkdir -p /nfs/share echo "/nfs/share *(rw,sync,no_root_squash)" >> /etc/exports systemctl enable --now nfs-serverhelm部署nfs的provisioner&sc 所有k8s节点安装客户端 yu…

SpringBoot + Netty + Vue + WebSocket实现在线聊天

最近想学学WebSocket做一个实时通讯的练手项目 主要用到的技术栈是WebSocket Netty Vue Pinia MySQL SpringBoot&#xff0c;实现一个持久化数据&#xff0c;单一群聊&#xff0c;支持多用户的聊天界面 下面是实现的过程 后端 SpringBoot启动的时候会占用一个端口&#xff…

大数据Spark(五十七):Spark运行架构与MapReduce区别

文章目录 Spark运行架构与MapReduce区别 一、Spark运行架构 二、Spark与MapReduce区别 Spark运行架构与MapReduce区别 一、Spark运行架构 Master:Spark集群中资源管理主节点&#xff0c;负责管理Worker节点。Worker:Spark集群中资源管理的从节点&#xff0c;负责任务的运行…

【爬虫】网页抓包工具--Fiddler

网页抓包工具对比&#xff1a;Fiddler与Sniff Master Fiddler基础知识 Fiddler是一款强大的抓包工具&#xff0c;它的工作原理是作为web代理服务器运行&#xff0c;默认代理地址是127.0.0.1&#xff0c;端口8888。代理服务器位于客户端和服务器之间&#xff0c;拦截所有HTTP/…

Redis:集群

为什么要有集群&#xff1f; Redis 集群&#xff08;Redis Cluster&#xff09;是 Redis 官方提供的分布式解决方案&#xff0c;用于解决单机 Redis 在数据容量、并发处理能力和高可用性上的局限。通过 Redis 集群&#xff0c;可以实现数据分片、故障转移和高可用性&#xff0…

【2012】【论文笔记】太赫兹波在非磁化等离子体——

前言 类型 太赫兹 + 等离子体 太赫兹 + 等离子体 太赫兹+等离子体 期刊 物理学报 物理学报 物理学报 作者