lua脚本在redis中执行是否是原子性?

以及是否会阻塞其他脚本的执行【客户端的请求】?

先解答第二个问题:

是的,保持原子执行。这也是redis中支持lua脚本执行的原因。

Lua 脚本在 Redis 中是以原子方式执行的,在 Redis 服务器执行EVAL命令时,在命令执行完毕并向调用者返回结果之前,只会执行当前命令指定的 Lua 脚本包含的所有逻辑,其它客户端发送的命令将被阻塞,直到EVAL命令执行完毕为止。因此 LUA 脚本不宜编写一些过于复杂了逻辑,必须尽量保证 Lua 脚本的效率,否则会影响其它客户端。

Redis 提供了丰富的命令来供我们使用以实现一些计算。Redis 的单个命令都是原子性的,有时候我们希望能够组合多个 Redis 命令,并让这个组合也能够原子性的执行,甚至可以重复使用。Redis 开发者意识到这种场景还是很普遍的,就在 2.6 版本中引入了一个特性来解决这个问题,这就是 Redis 执行 Lua 脚本。

lua脚本是否在redis主线程中执行?

在 Redis 中,Lua 脚本的执行是在主线程中进行的。当客户端发送 Lua 脚本到 Redis 服务器时,Redis 会将脚本解析并编译成字节码,并将其存储在服务器内部的脚本缓存中。当客户端再次执行同一个脚本时,Redis 可以直接使用缓存中的字节码来执行脚本,从而避免了重复解析和编译的开销。

因为 Lua 脚本是在 Redis 主线程中执行的,所以执行较长时间的脚本可能会导致阻塞其他客户端请求的执行。为了避免这种情况,可以将一些长时间执行的操作拆分成多个步骤,使用 Redis 的 Lua 脚本执行和服务器端脚本缓存来优化脚本的性能。同时,还可以使用 Redis 的任务队列或消息队列来将长时间执行的操作移动到后台处理,从而避免阻塞主线程并提高系统的并发性能。

了解了上面这些知识基本上可以满足开发一些简单的 Lua 脚本了。但是实际开发中还是有一些要点的。

  • 务必对 Lua 脚本进行全面测试以保证其逻辑的健壮性,当 Lua 脚本遇到异常时,已经执行过的逻辑是不会回滚的。【如果是redis本身自带支持的命令呢?都是原子性的,也就是只会存在两种状态,成功or失败】
  • 尽量不使用 Lua 提供的具有随机性的函数,参见相关官方文档。
  • 在 Lua 脚本中不要编写function函数, 整个脚本作为一个函数的函数体。
  • 在脚本编写中声明的变量全部使用local关键字。
  • 在集群中使用 Lua 脚本要确保逻辑中所有的key分到相同机器,也就是同一个插槽(slot)中,可采用Redis Hash Tag技术。
  • 再次重申 Lua 脚本一定不要包含过于耗时、过于复杂的逻辑。(否则将导致redis宕机, 影响所有使用到redis的服务)

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

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

    相关文章

    DeepSeek文献太多太杂?一招制胜:学术论文检索的“核心公式”与提问艺术

    如果我们想要完成一次学术论文检索,那我们可以把它想象成一次精准的“学术寻宝”。你不是在漫无目的地闲逛,而是一名装备精良的“学术寻宝猎人”,你的目标是找到深藏在浩瀚文献海洋中的“珍宝”(高价值论文)。1 你的寻…

    Linux内存管理章节一:深入浅出Linux内存管理:从物理内存到ARM32的用户与内核空间

    引言 如果说操作系统是计算机的心脏,那么内存管理就是它的灵魂脉络。它默默地工作在Linux内核的最底层,却决定着整个系统的稳定性、安全性和性能。今天,我们将拨开迷雾,深入探索Linux内存管理的核心概念,并结合熟悉的A…

    ECMAScript (5)ES6前端开发核心:国际化与格式化、内存管理与性能

    好的,我将根据【国际化与格式化】和【内存管理与性能】这两个主题,为你生成详细的课件内容,涵盖概念、应用和实例。 📗 前端开发核心:国际化与格式化、内存管理与性能 1. 国际化与格式化 (Internationalization & …

    3D 可视化数字孪生运维管理平台:构建 “虚实协同” 的智慧运维新范式

    3D 可视化数字孪生运维管理平台通过 “物理空间数字化建模 实时数据动态映射 智能分析决策”,将建筑、园区、工业设施等物理实体 1:1 复刻为虚拟孪生体,打破传统运维 “信息割裂、依赖经验、响应滞后” 的痛点,实现从 “被动抢修” 到 “主…

    DP-观察者模式代码详解

    观察者模式: 定义一系列对象之间的一对多关系;当一个对象改变状态,它的依赖都会被通知。 主要由主题(Subject)和观察者(Observer)组成。 代码实现 package com.designpatterns.observer;/*** 定…

    1983:ARPANET向互联网的转变

    一、ARPANET早期1969年诞生的ARPANET最初还算不上互联网,不过在ARPANET构建之初就已经考虑了分组交换:1970年代的ARPANET:其实这个时候我就有疑问,TCP/IP是1983年1月1日更新到ARPANET的,但是1970年代的ARPANET已经连接全美的重要单…

    自动化运维-ansible中的变量运用

    自动化运维-ansible中的变量运用 一、变量命名规则 组成:字母、数字、下划线。必须以字母开头。 合法: app_port, web_1, varA非法: 2_var (以数字开头), my-var (包含其他字符), _private (以下划线开头) 避免使用内置关键字:例如 hosts, tasks, name…

    深入学习并发编程中的volatile

    volatile 的作用 保证变量的内存可见性禁止指令重排序1.保证此变量对所有的线程的可见性,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,其它线程每次使用前立即从主内存刷新。 但普通变量做不到这点,普通…

    使用Java获取本地PDF文件并解析数据

    获取本地文件夹下的PDF文件要获取本地文件夹下的PDF文件,可以使用Java的File类和FilenameFilter接口。以下是一个示例代码片段:import java.io.File; import java.io.FilenameFilter;public class PDFFileFinder {public static void main(String[] args…

    吴恩达机器学习补充:决策树和随机森林

    数据集:通过网盘分享的文件:sonar-all-data.csv 链接: https://pan.baidu.com/s/1D3vbcnd6j424iAwssYzDeQ?pwd12gr 提取码: 12gr 学习来源:https://github.com/cabin-w/MLBeginnerHub 文末有完整代码,由于这里的代码和之前的按…

    Shell脚本一键监控平台到期时间并钉钉告警推送指定人

    1. 监控需求客户侧有很多平台需要定期授权,授权后管理后台才可正常登录,为避免授权到期,现撰写脚本自动化监控平台授权到期时间,在到期前15天钉钉或其他媒介提醒。2. 监控方案2.1 收集平台信息梳理需要监控的平台地址信息&#xf…

    华为HCIE数通含金量所剩无几?考试难度加大?

    最近网上很火的一个梗——法拉利老了还是法拉利,这句话套在华为HCIE数通身上同样适用,华为认证中的华为数通和云计算两大巨头充斥着大家的视野里面,也更加广为人知,但随着时代的发展,华为认证体系的调整,大…

    #数据结构----2.1线性表

    在数据结构的学习中,线性表是最基础、最核心的结构之一 —— 它是后续栈、队列、链表等复杂结构的 “基石”。今天从 “是什么”(定义)到 “怎么用”(基本操作),彻底搞懂线性表的核心逻辑。 一、先明确&…

    2508C++,skia动画

    gif动画原理 先了解一下gif动画的原理: gif动画由一系列静态图像(或叫帧)组成.这些图像按特定的顺序排列,每一帧都代表动画中的一个瞬间,帧图像是支持透明的. 每两帧之间有指定的时间间隔(一般小于60毫秒),gif播放器每渲染一帧静态图像后,即等待此时间间隔,依此逻辑不断循环渲染…

    AI + 机器人:当大语言模型赋予机械 “思考能力”,未来工厂将迎来怎样变革?

    一、引言1.1 未来工厂变革背景与趋势在科技飞速发展的当下,全球制造业正站在变革的十字路口。随着消费者需求日益多样化、市场竞争愈发激烈,传统工厂模式的弊端逐渐显现。生产效率低下、难以适应个性化定制需求、设备维护成本高昂且缺乏前瞻性等问题&…

    pinia状态管理的作用和意义

    1. 什么是状态管理 状态管理就是统一管理应用中的数据,让数据在多个组件之间共享和同步。 // 没有状态管理 - 数据分散在各个组件中 // 组件A const user ref({ name: 张三, age: 25 })// 组件B const user ref({ name: 张三, age: 25 }) // 重复定义// 组件C c…

    十四、STM32-----低功耗

    一、电源框图VDDA 供电区域,主要是 ADC 电源以及参考电压,STM32 的 ADC 模块配备独立的供电方 式,使用了 VDDA 引脚作为输入,使用 VSSA 引脚作为独立地连接,VREF 引脚为提供给 ADC 的 参考电压。电压调节器是 STM32 的…

    一篇文章带你彻底搞懂 JVM 垃圾收集器

    垃圾收集器是 JVM 内存管理的执行引擎,负责自动回收无用的对象内存。其设计核心是 权衡:主要是吞吐量和停顿时间之间的权衡。没有“最好”的收集器,只有“最适合”特定场景的收集器。一、核心基础:分代收集模型主流 HotSpot JVM 采…

    服务器排故随笔:服务器无法ssh远程登录

    文章目录服务器排故随笔:服务器无法远程登录问题现象解决过程第一步:确认故障描述是否准确第二步:确认网络是否有问题第三步:确认ssh服务是否有问题第四步:确认防火墙是否放行sshd服务第五步:试试万能的“重…

    Deeplizard深度学习课程(六)—— 结合Tensorboard进行结果分析

    前言 Tensorboard最初是tensorflow的可视化工具,被用于机器学习实验的可视化,后来也适配了pytorch。Tensorboard是一个前端web界面,,能够从文件里面读取数据并展示它(比如损失、准确率、网络图)。具体使用可…