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

lua入门以及在Redis中的应用

1.基本语法
1.1变量

lua的变量有:无效值nil,布尔值boolean,数字number、字符串string、函数function、自定义类型userdata、线程thread、表table(key-value结构)

1.2循环

数值循环

for i=起始值, 结束值 ,间隔值 do

---options

end

间隔值为1时可以省略。像python里面的range()函数

迭代循环

for k,v in pairs(tb) do

print(k,v)

end

while循环

while(condition)

do

---options

ee

repeat -until

repeat-- statements
until( condition )
1.3条件语句
if(con1) then
-----option--
elseif(con2) then
----option
elseif(con3) then
---option
end
1.4函数的定义
function a(num)print("hello"..num)  //字符串拼接用的 .. 而不是+,1+‘1’=2.0
enda=function()print('a')
end

函数定义默认都全局的,即使是嵌套在其它函数里面,如果想定义局部的函数,需要使用local关键字修饰。

2.lua脚本在redis中的使用

查看redis当前有哪些key没有设置过期时间,内存满的时候可以进行排查

-- 获取所有key的模式(默认为*)
local pattern = ARGV[1] or '*'
local result = {keys = {}, stats = {total = 0, neverexpire = 0}}
local start_time = redis.call('TIME')[1]-- 使用SCAN迭代
local cursor = '0'
repeatlocal reply = redis.call('SCAN', cursor, 'MATCH', pattern)cursor = reply[1]local keys = reply[2]-- 检查每个keyfor _, key in ipairs(keys) doresult.stats.total = result.stats.total + 1local ttl = redis.call('TTL', key)if ttl == -1 thentable.insert(result.keys, key)result.stats.neverexpire = result.stats.neverexpire + 1endend
until cursor == '0'-- 计算执行时间
local end_time = redis.call('TIME')[1]
result.stats.duration = end_time - start_time-- 返回结果
if #result.keys == 0 thenreturn "没有永不过期的key (共扫描: "..result.stats.total.." 个key, 耗时: "..result.stats.duration.."秒)"
elseresult.msg = "找到 "..result.stats.neverexpire.." 个永不过期的key (共扫描: "..result.stats.total.." 个key, 耗时: "..result.stats.duration.."秒)"return result
end--------------------------------
以上内容由AI生成,仅供参考和借鉴

lua脚本实现分布式锁

-- 获取锁
-- KEYS[1]: 锁的key
-- ARGV[1]: 锁的值(通常是客户端唯一标识)
-- ARGV[2]: 过期时间(秒)
local key = KEYS[1]
local value = ARGV[1]
local ttl = tonumber(ARGV[2])-- 尝试设置锁(NX表示key不存在时才设置,EX表示设置过期时间)
local lockSet = redis.call('SET', key, value, 'NX', 'EX', ttl)if lockSet thenreturn true
else-- 检查锁是否是自己持有的(防止误删其他客户端的锁)local currentValue = redis.call('GET', key)if currentValue == value then-- 延长锁的过期时间redis.call('EXPIRE', key, ttl)return trueelsereturn falseend
end
http://www.lryc.cn/news/627137.html

相关文章:

  • 技术干货|使用Prometheus+Grafana监控redis实例详解
  • 自学嵌入式第二十三天:数据结构(3)-双链表
  • Java 性能优化实战(二):JVM 调优的 5 个核心维度
  • c#入门笔记(3)
  • Netty HashedWheelTimer设计原理:从时间轮算法到源码实现
  • 基于SpringBoot的蜗牛兼职网平台
  • RabbitMQ 基础
  • 使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本1)
  • 豆秒数科集团:汽车消费金融市场的领跑者
  • 《P1967 [NOIP 2013 提高组] 货车运输》
  • 层在init中只为创建线性层,forward的对线性层中间加非线性运算。且分层定义是为了把原本一长个代码的初始化和运算放到一个组合中。
  • 常见开源协议详解:哪些行为被允许?哪些被限制?
  • [GraphRAG]完全自动化处理任何文档为向量知识图谱:AbutionGraph如何让知识自动“活”起来?
  • 我从零开始学习C语言(12)- 循环语句 PART1
  • word——如何给封面、目录、摘要、正文设置不同的页码
  • 非同步BUCK和同步BUCK
  • 8.20 打卡 DAY 47 注意力热图可视化
  • 创建Vue项目的不同方式及项目规范化配置
  • Preprocessing Model in MPC 2 - 背景、基础原语和Beaver三元组
  • Web网站的运行原理2
  • prometheus监控kubernetes集群并使用 grafana展示数据
  • Web 安全之延迟攻击(Delay Attack)详解
  • Windows 命令行:dir 命令
  • VG技术下,美术在资源制作时的规范
  • 读者写者问题
  • 深入理解C++ std::shared_ptr:现代C++内存管理的艺术与实践
  • Python文件操作与异常处理详解 :基础方法、注意事项及os模块常用功能
  • MySQL数据库安全配置核心指南
  • [激光原理与应用-316]:光学设计 - SolidWorks 、AutoCAD、Zemax三者的比较与协同
  • Python 数据可视化:Matplotlib 与 Seaborn 实战