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

redis事务对比Lua脚本区别是什么

redis官方对于lua脚本的解释:Redis使用同一个Lua解释器来执行所有命令,同时,Redis保证以一种原子性的方式来执行脚本:当lua脚本在执行的时候,不会有其他脚本和命令同时执行,这种语义类似于 MULTI/EXEC。从别的客户端的视角来看,一个lua脚本要么不可见,要么已经执行完。

然而这也意味着,执行一个较慢的lua脚本是不建议的,由于脚本的开销非常低,构造一个快速执行的脚本并非难事。但是你要注意到,当你正在执行一个比较慢的脚本时,所以其他的客户端都无法执行命令。

所以我们总结一下: Lua脚本可以保证原子性,因为Redis会将Lua脚本封装成一个单独的事务,而这个单独的事务会在Redis客户端运行时,由Redis服务器自行处理并完成整个事务,如果在这个进程中有其他客户端请求的时候。Redis将会把它暂存起来,等到 Lua 脚本处理完毕后,才会再把被暂存的请求恢复。
这样就可以保证整个脚本是作为一个整体执行的,中间不会被其他命令插入。但是,如果命令执行过程中命令产生错误,事务是不会回滚的,将会影响后续命令的执行.
也就是说,Redis保证以原子方式执行Lua脚本,但是不保证脚本中所有操作要么都执行或者都回滚。

而Redis是支持事务的,而Redis事务主要目的是保证多个命令执行的原子性,即要在一个原子操作中执行,不会被打断
需要注意的是,Redis的事务是不支持回滚的,如果事务执行过程中发生错误,Redis会继续执行剩余的命令而不是回滚整个事务。

那么为什么Redis不支持事务回滚呢?
在这里插入图片描述
按照redis官方解释是说:

  1. Redis 事务的执行时,错误通常都是编程错误造成的,这种错误通常只会出现在开发环境中,而很少会在实际的生产环境中出现,所以他认为没有必要为 Redis 开发事务回滚功能;
  2. 不支持事务回滚是因为这种复杂的功能和 Redis 追求的简单高效的设计主旨不符合

参考链接:https://redis.io/commands/eval/

http://www.lryc.cn/news/130824.html

相关文章:

  • Java“牵手”根据店铺ID获取1688店铺所有商品数据方法,1688API实现批量店铺商品数据抓取示例
  • linux-shell脚本收集
  • 使用 MBean 和 日志查看 Tomcat 线程池核心属性数据
  • Visual Studio 2019源码编译cpu版本onnxruntime
  • Go和Java实现模板模式
  • angular:quill align的坑
  • 设计模式篇---抽象工厂(包含优化)
  • Azure创建可用性集
  • SpringBoot中优雅的实现隐私数据脱敏(提供Gitee源码)
  • Elasticsearch集群shard过多后导致的性能问题分析
  • Unity框架学习--5 事件中心管理器
  • (二)结构型模式:3、过滤器模式(Filter、Criteria Pattern)(C++示例)
  • 谷歌在Chrome浏览器中推进抗量子加密技术
  • Kotlin的数组
  • centos 安装docker
  • Oracle-如何判断字符串包含中文字符串(汉字),删除中文内容及保留中文内容
  • File 类的用法, InputStream和Reader, OutputStream和Writer 的用法
  • AtCoder Beginner Contest 315 Task:A/B/C/E
  • 【项目实践】基于LSTM的一维数据扩展与预测
  • webshell实践,在nginx上实现负载均衡
  • LVS+Keepalived集群
  • Java的网络编程
  • kafka配置远程连接
  • css实现渐变色border
  • 管理 IBM Spectrum LSF
  • 117页数字化转型与产业互联网发展趋势及机会分析报告PPT
  • 【JavaWeb】实训的长篇笔记(上)
  • 如何使用Docker安装AWVS?
  • vue命名规范
  • 第05天 SpringBoot自动配置原理