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

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

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://U4WdtFon.sjbty.cn
    http://NxaGi7Ip.sjbty.cn
    http://34i3cDTR.sjbty.cn
    http://v1m0oPxX.sjbty.cn
    http://8haxqi5K.sjbty.cn
    http://rzmY9B9n.sjbty.cn
    http://AxXtdczM.sjbty.cn
    http://SKG3o9a7.sjbty.cn
    http://luK6apsO.sjbty.cn
    http://iJdgaoXA.sjbty.cn
    http://9Y4rcqhm.sjbty.cn
    http://lL7Rq6h6.sjbty.cn
    http://oqgPjdC1.sjbty.cn
    http://HHElXeED.sjbty.cn
    http://ZNl1XCeI.sjbty.cn
    http://rG2X80SJ.sjbty.cn
    http://sqKhglFF.sjbty.cn
    http://wFk9ouai.sjbty.cn
    http://TkHKynsG.sjbty.cn
    http://QfyDKvZ8.sjbty.cn
    http://6E7OHBEJ.sjbty.cn
    http://G2oID5Ni.sjbty.cn
    http://V9FTCGPP.sjbty.cn
    http://bq8cgSrA.sjbty.cn
    http://sGgBS02A.sjbty.cn
    http://LEuUnSVD.sjbty.cn
    http://h68qB5ik.sjbty.cn
    http://obwBHwGZ.sjbty.cn
    http://OK0SjDkQ.sjbty.cn
    http://TI7keIav.sjbty.cn
    http://www.dtcms.com/a/362427.html

    相关文章:

  • 每次开机弹出‘killer network manager launcher’链接无应用打开”解决方案
  • 【Lua】题目小练13
  • CodeForge v25.0.3 发布:Web 技术栈全覆盖,编辑器个性化定制新时代
  • 分页功能设计
  • Docker镜像指南:从核心命令到离线迁移实战
  • 实时视频链路的产业化路径:多场景应用与长期思考
  • 力扣:2458. 移除子树后的二叉树高度(dfs序)
  • leetcode111. 二叉树的最小深度
  • 前缀和之距离和
  • 基于SQLite的智能图片压缩存储系统:代码解析与实战应用
  • Time-MOE 音频序列分类任务
  • form表达和实体类通常有什么不同
  • C#中的克隆:从理论到实践
  • Elasticsearch Java开发(SpringBoot)
  • 从零开始的云计算生活——第五十六天,临深履薄,kubernetes模块之etcd备份恢复和集群升级指南
  • Prettier代码格式化工具测评:支持JS/TS/Vue多语言,兼容ESLint实现团队代码格式统一
  • 在 PySpark 中解锁窗口函数的力量,实现高级数据转换
  • 什么是Token?——理解自然语言处理中的基本单位
  • 毕业项目推荐:68-基于yolov8/yolov5/yolo11的水稻虫害检测识别系统(Python+卷积神经网络)
  • Python OpenCV图像处理与深度学习: Python OpenCV图像配准入门
  • 深度学习中的数据增强实战:基于PyTorch的图像分类任务优化
  • 云计算学习100天-第43天-cobbler
  • 【linux仓库】万物至简的设计典范:如何用‘文件’这一个概念操纵整个Linux世界?
  • 【数据分享】土地利用shp数据分享-内蒙古
  • Python应用——ffmpeg处理音视频的常见场景
  • 谷歌AdSense套利是什么?怎么做才能赚到钱
  • 安卓QQ闪照获取软件(支持TIM)
  • 各省市信息化项目管理办法中的网络安全等级保护如何规定的?
  • 智能化企业级CRM系统开发实战:飞算JavaAI全流程体验
  • 【音视频】火山引擎实时、低延时拥塞控制算法的优化实践