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
end


a=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'
repeat
  local reply = redis.call('SCAN', cursor, 'MATCH', pattern)
  cursor = reply[1]
  local keys = reply[2]

  -- 检查每个key
  for _, key in ipairs(keys) do
    result.stats.total = result.stats.total + 1
    local ttl = redis.call('TTL', key)
    if ttl == -1 then
      table.insert(result.keys, key)
      result.stats.neverexpire = result.stats.neverexpire + 1
    end
  end
until cursor == '0'

-- 计算执行时间
local end_time = redis.call('TIME')[1]
result.stats.duration = end_time - start_time

-- 返回结果
if #result.keys == 0 then
  return "没有永不过期的key (共扫描: "..result.stats.total.." 个key, 耗时: "..result.stats.duration.."秒)"
else
  result.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 then
    return true
else
    -- 检查锁是否是自己持有的(防止误删其他客户端的锁)
    local currentValue = redis.call('GET', key)
    if currentValue == value then
        -- 延长锁的过期时间
        redis.call('EXPIRE', key, ttl)
        return true
    else
        return false
    end
end
相关推荐
C++ 老炮儿的技术栈1 天前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程1 天前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力1 天前
从0开始配置Perforce4环境
开发语言
幸运小圣1 天前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风1111 天前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪1 天前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
君顾11 天前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
传奇开心果编程1 天前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
泡泡鱼(敲代码中)1 天前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
Tairitsu_H1 天前
[C++] 拷贝构造还是赋值重载?类默认成员函数细节详解
开发语言·c++·类和对象