Redission中的Lua脚本写法、理解
对于Redission看门狗机制中的为了保证原子性的Lua脚本的写法规则是什么样的呢 ?
对于源码中的Lua脚本又是什么意思?
我们一起来看一下
首先,我们先基本的熟悉一下lua脚本的逻辑
在Lua脚本中,if (…) then … end 语句的执行过程详细说明:
-
- 条件表达式求值:首先,Lua会计算if语句中的条件表达式(位于括号(…)内的部分)。这个表达式可以是一个简单的比较(如a == b),也可以是一个更复杂的表达式,甚至是一个函数调用,只要这个表达式最终返回一个可以被解释为布尔值的结果(在Lua中,false和nil被视为假(false),而所有其他值都被视为真(true))。
-
- 条件判断:Lua根据条件表达式的求值结果来决定是否执行then后面的代码块。如果条件表达式的值为真(true),则执行then和end之间的代码块;如果条件表达式的值为假(false),则跳过该代码块,继续执行end之后的代码(如果有的话)。
-
- 执行代码块:如果条件为真,Lua会顺序执行then和end之间的所有语句,直到遇到end关键字。在这个代码块内,你可以使用各种Lua语句,包括变量赋值、函数调用、循环、条件语句等。
-
- 退出if语句:一旦end关键字被遇到,if语句的执行就结束了。程序的控制流会继续从end之后的下一条语句开始执行。
使用示例:
local a = 10
local b = 20 if a < b then print("a is less than b")
else print("a is not less than b")
end -- 输出: a is less than b
这个例子中,条件表达式a < b的值为真(true),因为10确实小于20。因此,Lua执行了then后面的print语句,输出了"a is less than b",然后遇到了end关键字,if语句的执行结束。
如果条件表达式的值为假(例如,如果我们将a的值改为30),则Lua会跳过then后面的代码块,直接执行else后面的代码块(如果提供了else部分的话)。如果没有提供else部分,并且条件为假,则if语句之后的代码将直接继续执行。
了解了基本的语法
我们来看下Lua脚本:
-- 检查键是否存在
if (redis.call('exists', KEYS[1]) == 0)
then -- 如果键不存在,这里尝试对不存在的键进行hincrby操作是没问题的,如果不存在,则会自动的新建一个hash的对象并给其中的子key赋值-- 因为hincrby是操作哈希表中字段的命令,而键本身不存在时无法直接对其哈希表进行操作 redis.call('hincrby', KEYS[1], ARGV[2], 1); -- 这行会失败,因为KEYS[1]不存在 redis.call('pexpire', KEYS[1], ARGV[1]); -- 尝试设置过期时间,但由于前一行可能失败,这行的执行也可能不符合预期 return nil; -- 返回nil,表示键不存在但尝试进行了操作
end; -- 检查哈希字段是否存在
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then redis.call('hincrby', KEYS[1], ARGV[2], 1); -- 如果字段存在,递增其值 redis.call('pexpire', KEYS[1], ARGV[1]); -- 更新键的过期时间 return nil; -- 返回nil,表示字段存在且已被更新
end; -- 如果键存在但字段不存在,或者键和字段都检查过了(即上述两个if条件都不满足)
return redis.call('pttl', KEYS[1]); -- 返回键的剩余生存时间(以毫秒为单位)
对于redis中Hash的结构
在redission中也是支持锁重入的,他采用了hash结构来存储锁,其中大key标识这把锁是否存在,小key表示这把锁当前被谁持有。
key:锁的名称
value:
field:当前持有者的id(id+“:”+线程id,小key)
value:state(count)状态变量
相关文章:
Redission中的Lua脚本写法、理解
对于Redission看门狗机制中的为了保证原子性的Lua脚本的写法规则是什么样的呢 ? 对于源码中的Lua脚本又是什么意思? 我们一起来看一下 首先,我们先基本的熟悉一下lua脚本的逻辑 在Lua脚本中,if (…) then … end 语句的执行过程…...
视频共享融合赋能平台LntonCVS视频监控管理平台视频云解决方案
LntonCVS是基于国家标准GB28181协议开发的视频监控与云服务平台,支持多设备同时接入。该平台能够处理和分发多种视频流格式,包括RTSP、RTMP、FLV、HLS和WebRTC。主要功能包括视频直播监控、云端录像与存储、检索回放、智能告警、语音对讲和平台级联&…...
GraphRAG + GPT-4o mini 低成本构建 AI 图谱知识库
更好的效果,更低的价格,听起来是不是像梦呓? 限制 首先,让我们来介绍一个词:RAG。 简单来说,RAG(Retrieval-Augmented Generation,检索增强生成) 的工作原理是将大型文档…...
全国区块链职业技能大赛第十套区块链产品需求分析与方案设计
任务1-1:区块链产品需求分析与方案设计 养老保险平台中涉及到参保人、社保局、公安局、工作单位等参与方,他们需要在区块链养老保险平台中完成账户注册、身份上链、社保代缴、信息核查等多种业务活动。通过对业务活动的功能分析,可以更好的服务系统的开发流程。基于养老保险…...
分布式Apollo配置中心搭建实战
文章目录 环境要求第一步、软件下载第二步、创建数据库参考文档 最近新项目启动,采用Apollo作为分布式的配置中心,在本地搭建huanj 实现原理图如下所示。 环境要求 Java版本要求:JDK1.8 MySql版本要求:5.6.5 Apollo版本要求&…...
Android monkey命令和monkey脚本详解
Monkey命令 monkey 是 Android 平台上一个非常有用的工具,它可以帮助开发者在设备上生成随机的用户事件流,如按键输入、触摸屏手势等,以此来测试应用的稳定性。这对于发现应用中的崩溃、异常和性能问题特别有用。 基本语法 adb shell monk…...
vue 实现对图片的某个区域点选, 并在该区域上方显示该部分内容
目录 1、通义灵码实现: 2、csdn的C知道: 3、百度comate: 1、通义灵码实现: 在 Vue 中实现对图片某个区域的点选并显示该区域属于哪一部分,通常涉及到几个关键步骤: 图片区域划分: 首先&#…...
配置文件格式 INI 快速上手
文章目录 1.简介2.语法节键值对注释大小写空白行数据类型字符串 (String)整数 (Integer)浮点数 (Float)布尔值 (Boolean)列表 (List) 3.示例4.解析参考文献 1.简介 INI 的全称是 Initialization,即为初始化文件,最早是 Windows 系统配置文件所采用的格式…...
基于WebGoat平台的SQL注入攻击
目录 引言 一、安装好JAVA 二、下载并运行WebGoat 三、注册并登录WebGoat 四、模拟攻击 1. 第九题 2. 第十题 3. 第十一题 4. 第十二题 5. 第十三题 五、思考体会 1. 举例说明SQL 注入攻击发生的原因。 2. 从信息的CIA 三要素(机密性、完整性、可用性&…...
SpringMvc有几个上下文
你好,我是柳岸花明。 SpringMVC作为Spring框架的重要组成部分,其启动流程和父子容器机制是理解整个框架运行机制的关键。本文将通过一系列详细的流程图,深入剖析SpringMVC的启动原理与父子容器的源码结构。 SpringMVC 父子容器 父容器的创建 …...
k8s部署rabbitmq集群
1 部署集群 1.1 安装 # 创建一个中间件的命名空间 kubectl create namespace middleware # 创建ConfigMap,包含RabbitMQ的配置文件内容 kubectl apply -f rabbitmq-configmap.yaml # 配置用于存储RabbitMQ数据的PersistentVolume(PV)和PersistentVolum…...
Python利用包pypinyin汉字转拼音(处理多音字)
一、汉字转拼音 在python中将汉字的拼音输出可以采用pypinyin包,一下是简单的demo示例: 默认调用pinyin方法转换时时默认时带声调的,不带声调需要添加“styleStyle.NORMAL”参数。 from pypinyin import pinyin, Styledef pinyin_transfer…...
推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的
目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起,我们不再单独介绍推荐算法的原理,而是开始进入一个新的模块-工程篇。 在工程实践的部分中,我首先介绍的内容是当今最热门的信息流架构。 信息…...
解决QEMU无法从非0x80000000处开始执行
解决QEMU无法从非0x80000000处开始执行 1 背景介绍2 问题描述3 原因分析4 解决办法5 踩坑回忆5.1 坑1 - 怀疑设备树有问题5.2 坑2 - 怀疑QEMU中内存未写入成功5.3 QEMU地址空间分析过程 1 背景介绍 在使用NEMU与QEMU做DiffTest的场景下,运行的固件为《RISC-V体系结…...
AI在候选人评估中的作用:精准筛选与HR决策的助力
一、引言 随着科技的迅猛发展,人工智能(AI)技术已逐渐渗透到各个行业和领域,人力资源管理(HRM)亦不例外。在候选人评估的环节中,AI技术以其高效、精准的特性,正在逐步改变着传统的招…...
自动化测试的艺术:Xcode中GUI测试的全面指南
自动化测试的艺术:Xcode中GUI测试的全面指南 在软件开发过程中,图形用户界面(GUI)测试是确保应用质量和用户体验的关键环节。Xcode,作为苹果的官方集成开发环境(IDE),提供了一套强大…...
uniapp封装请求拦截器,封装请求拦截和响应拦截的方法
首先我们先看一下uni官方给开发者提供的uni.request用来网络请求的api 1 2 3 4 5 6 7 8 9 uni.request({ url: , method: GET, data: {}, header: {}, success: res > {}, fail: () > {}, complete: () > {} }); 可以看到我们每次请求数据的时候都需…...
开局一个启动器:从零开始入坑ComfyUI
前几天刷某乎的时候看到了一位大佬写的好文,可图 IP-Adapter 模型已开源,更多玩法,更强生态! - 知乎 (zhihu.com) 久闻ComfyUI大名,决定试一下。这次打算不走寻常路,不下载现成的一键包了,而是…...
34_YOLOv5网络详解
1.1 简介 YOLOV5是YOLO(You Only Look Once)系列目标检测模型的一个重要版本,由 Ultralytics 公司的Glenn Jocher开发并维护。YOLO系列以其快速、准确的目标检测能力而闻名,尤其适合实时应用。YOLOV5在保持高效的同时,…...
深入解析Perl的正则表达式:功能、应用与技巧
在编程世界中,正则表达式是一种强大的文本处理工具,它能够用于搜索、替换、匹配字符串等操作。Perl语言以其强大的文本处理能力著称,而其正则表达式功能更是其核心特性之一。本文将深入探讨Perl中的正则表达式,包括其基本语法、应…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
