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

Redission中的Lua脚本写法、理解

对于Redission看门狗机制中的为了保证原子性的Lua脚本的写法规则是什么样的呢 ?
对于源码中的Lua脚本又是什么意思?

我们一起来看一下
首先,我们先基本的熟悉一下lua脚本的逻辑

在Lua脚本中,if (…) then … end 语句的执行过程详细说明:

    1. 条件表达式求值:首先,Lua会计算if语句中的条件表达式(位于括号(…)内的部分)。这个表达式可以是一个简单的比较(如a == b),也可以是一个更复杂的表达式,甚至是一个函数调用,只要这个表达式最终返回一个可以被解释为布尔值的结果(在Lua中,false和nil被视为假(false),而所有其他值都被视为真(true))。
    1. 条件判断:Lua根据条件表达式的求值结果来决定是否执行then后面的代码块。如果条件表达式的值为真(true),则执行then和end之间的代码块;如果条件表达式的值为假(false),则跳过该代码块,继续执行end之后的代码(如果有的话)。
    1. 执行代码块:如果条件为真,Lua会顺序执行then和end之间的所有语句,直到遇到end关键字。在这个代码块内,你可以使用各种Lua语句,包括变量赋值、函数调用、循环、条件语句等。
    1. 退出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)状态变量

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python面试题:Python中的单例模式及其实现
  • 基于单片机控制的锂电池充电和保护系统研究
  • 项目实战二
  • 利用Java调用人脸身份证比对接口
  • Prometheus监控Elasticsearch
  • 聚观早报 | Meta将推出新款AR眼镜;iPhone SE 4将升级显示屏
  • shell脚本教程学习
  • Qt:26.Qt项目:贪吃蛇游戏
  • redis全局唯一ID生成策略、countDownLatch、Lambda表达式总结
  • 《峡谷小狐仙-多模态角色扮演游戏助手》复现流程
  • Java IO模型深入解析:BIO、NIO与AIO
  • 为什么 FPGA 的效率低于 ASIC?
  • SpringBoot之拦截器(Interceptor)
  • Rust代码答疑报错|Python一对一辅导答疑
  • sql查询报错空指针怎么解决?
  • android图片蒙层
  • css的样式优先级
  • JavaScript函数式编程(一)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js学习笔记
  • mysql中InnoDB引擎中页的概念
  • overflow: hidden IE7无效
  • ReactNative开发常用的三方模块
  • 安卓应用性能调试和优化经验分享
  • 对象引论
  • 关于Flux,Vuex,Redux的思考
  • 我感觉这是史上最牛的防sql注入方法类
  • 学习Vue.js的五个小例子
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • Spring Batch JSON 支持
  • #java学习笔记(面向对象)----(未完结)
  • #微信小程序(布局、渲染层基础知识)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (floyd+补集) poj 3275
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Note)C++中的继承方式
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .gitattributes 文件
  • .gitignore文件设置了忽略但不生效
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .NET 材料检测系统崩溃分析
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net和php怎么连接,php和apache之间如何连接
  • .net下简单快捷的数值高低位切换