Lua脚本

本文介绍了Lua脚本的概念,强调其轻量、简洁和可扩展的特点,并阐述了使用Lua脚本在Redis中的优势,如原子性操作、减少网络通信和脚本复用性。通过一个入门案例展示了如何在Redis中执行Lua脚本,以及在SpringBoot中利用RedisTemplate操作Lua脚本的步骤。
摘要由CSDN通过智能技术生成

Lua脚本

1、概念

Lua是一个轻量、简洁、可扩展的脚本语言

特点:

  • 轻量:编译后体积很小
  • 简洁:由C编写,启动快,运行快
  • 可扩展:可内嵌到各种编程语言或者系统中运行;提升静态语言的灵活性;不需要担心语法问题

2、优点

  1. 原子性:将Redis的多个操作合成一个脚本,然后整体执行,在脚本的执行中,不会出现资源竞争的问题。
  2. 减少网络通信:把多个命令合并成一个lua脚本,redis统一执行脚本。
  3. 复用性:client发送的脚本会永久存储在Redis中,其他客户端可以复用这个脚本来完成同样的逻辑。

3、redis操作lua脚本

 eval script numkeys key [key ...] arg [arg ...]
  • eval:执行lua脚本的命令
  • script:lua脚本
  • numkeys:key个数
  • key [key …]:lua脚本中的KEYS名字, key的列表
  • arg [arg …]:lua脚本中的 ARGV 的值,value的列表
入门案例

KEYS 索引是从1 开始的 ,ARGV也是如此。

127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 feige achao
1) "key1"
2) "key2"
3) "feige"
4) "achao"

代码含义:可以把对应的keys进行填充返回。

127.0.0.1:6379> EVAL "return 1" 2 key1 key2 feige achao
(integer) 1

“return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}”“return 1”

注意:redis默认情况下支持lua脚本,给lua脚本提供了一个redis的对象。这个对象提供call方法,call方法可以调用redis任何的命令

-- 成功返回1、没有设置返回0
-- 如果redis没找到。就直接添加
if redis.call('get',KEYS[1]) == nil then
    redis.call('set',KEYS[1],ARGV[1]);
    redis.call('expire',KEYS[1],ARGV[2]);
    return 1;
end

-- 如果旧值等于新值,不进行操作,如果不相同就执行更新
if redis.call('get',KEYS[1]) == ARGV[1] then
    return 0;
else
    redis.call
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Lua 是一种轻量级的脚本语言,它具有简洁、高效、易于扩展等特点。Lua 可以被嵌入到 C/C++ 应用程序中,也可以作为独立的解释器运行。下面简单介绍一下 Lua 脚本的基本语法和用法。 ## 1. 基本语法 Lua 语言的基本语法与众多编程语言类似。下面是一个简单的 Lua 脚本示例: ```lua -- 定义变量 a = 10 b = 20 -- 条件语句 if a < b then print("a is less than b") else print("a is greater than or equal to b") end -- 循环语句 for i = 1, 10 do print(i) end -- 函数定义 function add(a, b) return a + b end -- 函数调用 sum = add(a, b) print("sum =", sum) ``` ## 2. 常用函数 Lua 中内置了一些常用的函数,比如字符串处理函数、数学函数、文件操作函数等。下面是一些常用函数的示例: ```lua -- 字符串处理函数 str = "hello world" print(string.upper(str)) -- 将字符串转换为大写 print(string.sub(str, 1, 5)) -- 截取字符串 -- 数学函数 print(math.pow(2, 3)) -- 求幂 print(math.sqrt(16)) -- 求平方根 -- 文件操作函数 file = io.open("test.txt", "w") file:write("Hello World") file:close() file = io.open("test.txt", "r") print(file:read("*all")) file:close() ``` ## 3. Lua 与 C/C++ 的交互 Lua 可以被嵌入到 C/C++ 应用程序中,实现 Lua 脚本与 C/C++ 代码的交互。在 C/C++ 中,可以使用 Lua API 调用 Lua 脚本中的函数、读写变量等。下面是一个简单的示例: ```c #include "lua.hpp" int main() { lua_State* L = luaL_newstate(); luaL_openlibs(L); luaL_dofile(L, "test.lua"); // 执行 Lua 脚本 lua_getglobal(L, "add"); // 获取 Lua 函数 lua_pushnumber(L, 10); // 压入参数 lua_pushnumber(L, 20); lua_call(L, 2, 1); // 调用函数,2 表示有两个参数,1 表示有一个返回值 double result = lua_tonumber(L, -1); // 获取返回值 printf("result = %lf\n", result); lua_close(L); return 0; } ``` 上面的示例中,C/C++ 代码使用 Lua API 调用了 Lua 脚本中的 add 函数,并获取了该函数的返回值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫拾壹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值