【Redis】Redis事务和Lua脚本的区别

ops/2025/1/17 16:59:27/

Redis事务

概念

事务:Redis事务是一组命令的集合,这些命令会被序列化地执行,中间不会被其他命令插入。
MULTI/EXEC:Redis事务通过MULTI命令开始,通过EXEC命令执行所有已入队的命令。

特点

  1. 原子性:
    事务中的所有命令要么全部执行,要么全部不执行,保证了操作的原子性。
  2. 简单易用:
    使用MULTI和EXEC命令即可实现事务,语法简单。
  3. 命令排队:
    在MULTI和EXEC之间,所有命令会被排队,但不会立即执行,直到EXEC命令被调用。
  4. 不支持条件执行:
    事务中不支持条件判断(如IF语句),所有命令在事务开始时就已经确定。
  5. 错误处理:
    如果事务中的某个命令在执行时出错,其他命令仍然会继续执行。可以通过WATCH命令来实现乐观锁,但使用相对复杂。
import redis.clients.jedis.Jedis;public class RedisTransactionExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");try {jedis.watch("key1", "key2");Transaction tx = jedis.multi();tx.set("key1", "value1");tx.set("key2", "value2");tx.exec();} catch (Exception e) {System.out.println("Transaction failed: " + e.getMessage());} finally {jedis.unwatch();jedis.close();}}
}

Lua脚本

概念

Lua脚本:Redis支持在服务器端执行Lua脚本,脚本中的所有命令都会被原子地执行。

特点

  1. 原子性:
    Lua脚本中的所有命令都是原子执行的,保证了操作的原子性。
  2. 支持条件判断:
    Lua脚本可以包含复杂的逻辑,包括条件判断、循环等。
  3. 减少网络开销:
    将多个命令打包成一个Lua脚本执行,减少了客户端与服务器之间的网络往返次数。
  4. 事务隔离:
    Lua脚本在执行期间不会被其他命令中断,确保了事务的隔离性。
  5. 错误处理:
    Lua脚本中的错误会立即停止脚本的执行,并返回错误信息。
  6. 适用场景:
    适用于复杂的、需要条件判断和逻辑处理的操作。
import redis.clients.jedis.Jedis;public class RedisLuaScriptExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");String script = "return redis.call('set', KEYS[1], ARGV[1])";String key = "key1";String value = "value1";Object result = jedis.eval(script, 1, key, value);System.out.println("Script result: " + result);jedis.close();}
}

总结

特性Redis事务Lua脚本
原子性保证事务中的所有命令要么全部执行,要么全部不执行保证脚本中的所有命令原子执行
命令排队命令在MULTI和EXEC之间排队,不会立即执行脚本中的所有命令立即执行
条件判断不支持条件判断支持复杂的逻辑和条件判断
网络开销多个命令需要多次网络往返多个命令打包成一个脚本执行,减少网络往返
错误处理事务中的错误不会停止其他命令的执行脚本中的错误会立即停止脚本执行
适用场景简单的批量操作复杂的、需要逻辑处理的操作

http://www.ppmy.cn/ops/150865.html

相关文章

Python编程中的两种主要的编程模式

在Python编程中,有两种主要的编程模式被广泛使用:面向过程编程(Procedural Programming) 和 面向对象编程(Object-Oriented Programming, OOP)。这两种模式各有优缺点,适用于不同的场景。 1. 面…

【软件工程】知识点总结(上)

重点章节:软件开发模型、敏捷开发方法、结构化开发方法、面向对象开发方法 目录 重点章节:软件开发模型、敏捷开发方法、结构化开发方法、面向对象开发方法 第一章:软件工程概述 1.1 内容简介 1.2 软件 1、软件的定义 2、软件的发展 3、软件的…

Android SystemUI——使用Dagger2加载组件(四)

SystemUI 是 Android 系统中的一个重要模块,负责绘制系统栏(如状态栏、导航栏)、锁屏、快捷设置等用户界面元素。由于其复杂性,良好的架构设计和依赖管理对于保持代码的可维护性和扩展性至关重要。这就是 Dagger2 在此发挥重要作用的地方。 一、Dagger2介绍 Dagger2 是一个…

基于微信小程序的游泳馆管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

多个页面一张SQL表,前端放入type类型

前端有三个页面需要修改 1.List data () {return {// 类型queryParam: {type: "1",},type: 1,}method:{handleAdd () {this.$refs.modalForm.add(this.type)this.$refs.modalForm.title 新增this.$refs.modalForm.disableSubmit false},handleEdit (record) {thi…

go语言 goc覆盖率统计

前言 有些代码需要统计整体代码的自动化测试覆盖率,下面说一下这个覆盖率应该如何统计 实现过程 安装goc # Mac/AMD64 curl -s -L "https://github.com/qiniu/goc/releases/latest" | sed -nE s!.*"([^"]*-darwin-amd64.tar.gz)".*!ht…

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色,我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的,这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…

25/1/15 嵌入式笔记 初学STM32F108

GPIO初始化函数 GPIO_Ini:初始化GPIO引脚的模式,速度和引脚号 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引脚0 GPIO输出控制函数 GPIO_SetBits:将指定的GPIO引脚设置为高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将GPIO…