为什么 Lua 脚本可以保证原子性?

简介: Redis中的原子性包含两层含义:并发编程中的“操作不可中断”与数据库ACID中的“全执行或全回滚”。Lua脚本在Redis中以单线程整体执行,保证了前者,但出错不回滚,故不满足后者。需明确讨论的是哪种原子性。

原子性在并发编程中,和在数据库中是两种不同的概念。


在数据库中,事务的 ACID 中原子性指的是 “要么都执行要么都回滚”。在并发编程中,原子性指的是 “操作不可拆分、不被中断”。


Redis 既是一个数据库,又是一个支持并发编程的系统,所以,它的原子性有两种。所以,我们需要明确清楚,在问 “Lua 脚本保证 Redis 原子性” 的时候,指的到底是哪个原子性。


Lua 脚本可以保证原子性,因为 Redis 是单线程执行命令的,当客户端提交一个 Lua 脚本的时候,Redis 会把他当做一个命令来执行,在这个脚本执行期间,不会有其他的命令插入进来执行。


这样就可以保证整个脚本是作为一个整体执行的,中间不会被其他命令插入。但是,如果命令执行过程中命令产生错误,事务是不会回滚的,将会影响后续命令的执行。


也就是说,Redis 保证以原子方式执行 Lua 脚本,但是不保证脚本中所有操作要么都执行或者都回滚。


那就意味着,Redis 中 Lua 脚本的执行,可以保证并发编程中不可拆分、不被中断的这个原子性,但是没有保证数据库 ACID 中要么都执行要么都回滚的这个原子性。

目录
相关文章
|
NoSQL Redis
Redis 执行 Lua保证原子性原理
Redis 执行 Lua 保证原子性原理
1436 1
|
8月前
|
人工智能 测试技术 开发者
AI Coding后端开发实战:解锁AI辅助编程新范式
本文系统阐述了AI时代开发者如何高效协作AI Coding工具,强调破除认知误区、构建个人上下文管理体系,并精准判断AI输出质量。通过实战流程与案例,助力开发者实现从编码到架构思维的跃迁,成为人机协同的“超级开发者”。
3948 106
|
8月前
|
存储 缓存 算法
如何实现本地缓存?
本地缓存是将数据存储在应用服务器内存中以提升访问速度的技术。设计时需关注数据结构(Key-Value)、线程安全、对象上限、清除策略(如LRU、LFU)和过期时间。推荐使用高性能的Caffeine框架,其采用Window TinyLFU算法,支持异步操作与精确失效机制,优于Guava Cache,是Spring 5默认缓存方案。
328 5
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
3061 0
|
10月前
|
存储 缓存 关系型数据库
为什么MySQL8.0 要取消查询缓存?
MySQL查询缓存曾用于提升SELECT性能,通过缓存结果避免重复执行,但因频繁失效、内存开销大、一致性问题及不均查询分布等缺陷,自8.0版本起被彻底移除,以优化整体性能与维护性。
396 1
|
8月前
|
负载均衡 Java Spring
Feign 和 OpenFeign 有什么区别?
Feign是Netflix开发的声明式HTTP客户端,简化Web服务调用。OpenFeign是Spring Cloud对其的扩展,集成负载均衡、服务发现等组件,提供自动配置,更适用于Spring生态。
676 1
|
8月前
|
负载均衡 监控 Java
Zookeeper和Eureka有什么区别?
Zookeeper是CP型分布式协调服务,强调一致性与可靠性,适用于需强一致的场景;Eureka是AP型服务注册中心,注重高可用与最终一致性,更适配微服务注册发现。两者在设计哲学、性能及生态集成上各有侧重。
345 0
|
消息中间件 存储 NoSQL
解决MQ下单消息重复消费幂等机制详解
【11月更文挑战第20天】在分布式系统中,消息队列(Message Queue, MQ)作为一种常用的中间件,用于在不同系统或服务之间异步传输消息。MQ的应用场景广泛,如订单处理、日志收集、系统解耦等。然而,MQ的使用也伴随着一些挑战,其中消息重复消费是一个常见问题。特别是在下单场景中,如果消息被重复消费,可能会导致订单被重复创建或处理,从而引发一系列业务问题。
1293 6
|
10月前
|
easyexcel Java 数据库连接
如何实现百万级数据从 Excel 导入到数据库?
本文介绍百万级Excel数据导入数据库的优化方案,涵盖内存溢出、性能瓶颈与错误处理三大问题。通过EasyExcel流式读取避免内存溢出,结合多线程并发读取多个sheet,并利用生产者-消费者模式提升处理效率。采用批量插入与事务管理提高数据库写入性能,同时设计数据校验、重试机制与日志记录保障容错性,确保大规模数据导入稳定高效。
768 0
|
消息中间件 监控 Java
RocketMQ 同步发送、异步发送和单向发送,如何选择?
本文详细分析了 RocketMQ 中同步发送、异步发送和单向发送三种消息发送方式的原理、优缺点及适用场景。同步发送可靠性高但延迟较大,适合订单系统等场景;异步发送非阻塞且延迟低,适用于实时数据处理等场景;单向发送高效但可靠性低,适用于日志收集等场景。文章还提供了示例代码和核心源码分析,帮助读者更好地理解每种发送方式的特点。
2779 4