网站建设公司常州,用代码做家乡网站,2022年7到8月份的十大新闻,北京比较有名的设计院核心问题
Redis执行lua脚本是否能确保原子性#xff1f;
面试经历
面试者在面试中自信回答Redis执行lua脚本能保证原子性#xff0c;但未能深入解释原因。
原子性概念
原子性#xff1a;一个事务的所有命令要么全部执行成功#xff0c;要么全部执行失败。
Redis官方说…核心问题
Redis执行lua脚本是否能确保原子性
面试经历
面试者在面试中自信回答Redis执行lua脚本能保证原子性但未能深入解释原因。
原子性概念
原子性一个事务的所有命令要么全部执行成功要么全部执行失败。
Redis官方说明
Redis在执行lua脚本期间会阻塞所有客户端操作确保不会有其他命令插入执行。官方定义中并未明确包含原子性。
实验验证
编写并执行一个简单的lua脚本包括对变量a的赋值和对字符串b的加法运算。预设Redis中key a的值为1。执行lua脚本脚本中对b进行加法运算时出现异常。检查a的值发现已更新为2说明没有执行回滚操作。
结论
Redis执行lua脚本不能保证原子性。lua脚本能保证在执行期间不会有其他客户端命令干扰但不支持回滚。
Redis事务与lua脚本的比较 Redis事务 客户端发送MULTI命令后每个命令请求被记录到事务队列。执行EXEC命令时按顺序执行事务队列中的命令。每个命令都需要与Redis服务端进行交互涉及多次网络IO操作。 lua脚本 客户端发送一次请求由Redis服务端执行脚本。只需一次网络IO操作。可以定义更复杂的业务逻辑如变量运算、复杂判断等。
推荐使用lua脚本的原因
执行效率更高减少网络IO操作。支持更复杂的业务逻辑。
集群架构下的原子性问题
单机架构lua脚本能保证原子性。分片集群架构不同key可能映射到不同主节点无法保证原子性。