网站只做,wordpress的php用什么版本好,wordpress 小米商城,扬州市江都区城乡建设局网站对于Redission看门狗机制中的为了保证原子性的Lua脚本的写法规则是什么样的呢 #xff1f; 对于源码中的Lua脚本又是什么意思#xff1f;
我们一起来看一下 首先#xff0c;我们先基本的熟悉一下lua脚本的逻辑
在Lua脚本中#xff0c;if (…) then … end 语句的执行过程…对于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当前持有者的idid“:”线程id小key valuestatecount状态变量