1. Install LUA
Installing LUA on Mac is very simple, just use the brew
related commands directly;
brew install lua
lua -vCommand you can see that lua has been installed.
Execute the command:
lua test.lua
The output is:
- Interactive programming: Enter the syntax directly in the command line, and you can execute it immediately and see the execution effect.
- Scripting is programming: write a script file and then execute it.
--
--[[
多行注释
多行注释
--]]
2, keywords are as follows Lua's reserved keywords, like Java, cannot be used as constants or variables.
local;
In addition, names that generally start with an underscore followed by a string of uppercase letters (such as _VERSION) are reserved for Lua internal global variables.
2) Local variables-- 局部变量赋值
local b=2
4. Data typesLua is a dynamically typed language. Variables do not need to be typed, only variables need to be assigned values. Values can be stored in variables, passed as arguments or returned as results. There are 8 basic types in Lua: nil, boolean, number, string, userdata, function, thread and table.
..
Connect two strings;
string.sub()
is used to intercept strings;
string.sub(s, i [, j])
- s: characters to be intercepted String;
- i: start position of interception;
- j: end position of interception, default is -1, last character;
string.find() Used for string search
string.find (str, substr, [init, [plain]])
- Search for the specified string in a specified target string str Content substr. If a matching substring is found, the starting index and ending index of the substring will be returned. If it does not exist, nil will be returned.
init
Specifies the starting position of the search, the default is 1, it can be a negative number, indicating the number of characters from back to front.
#plain
Indicates whether to use simple mode, the default is false, true only does a simple search for substrings, false indicates using regular pattern matching.
then, and the flow control ends with
end.
if(xxx) then print("xxx") else if(xx) then print("xx") else print("x") end6. Loop1) for loopThere are two major categories of for statements in Lua programming language: array for loop and generic for loop1> Array for loop
Syntax format:
for var=exp1,exp2,exp3 do <执行体> endvar changes from exp1 to exp2, each change increments var with exp3 as the step size, and executes it once" executor". exp3 is optional and defaults to 1 if not specified.
2> 泛型for循环
通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句;
语法格式:
--打印数组a的所有值 a = {"one", "two", "three"} for i, v in ipairs(a) do print(i, v) end
i 是数组索引值,v 是对应索引的数组元素值。
ipairs是Lua提供的一个迭代器函数,用来迭代数组。
2)while循环
while 循环语句在判断条件为 true 时会重复执行循环体语句。
语法格式:
while(condition) do statements end
statements(循环体语句) 可以是一条或多条语句,condition(条件) 可以是任意表达式;
在 condition(条件) 为 true 时执行循环体语句。
3)break提前退出循环
和Java中的break一个作用,用于退出当前循环或语句;
7、函数
在Lua中,函数是对语句和表达式进行抽象的主要方法。类似于Java中的方法。
Lua 函数主要有两种用途:
完成指定的任务,这种情况下函数作为调用语句使用;
计算并返回值,这种情况下函数作为赋值语句的表达式使用;
函数的编写方式如下:
--[[ 函数返回两个值的最大值 --]] function max(num1, num2) if (num1 > num2) then result = num1; else result = num2; end return result; end -- 调用函数 print("两值比较最大值为 ",max(10,4)) print("两值比较最大值为 ",max(5,6))
三、Java中执行Lua脚本
Java中执行Lua脚本有两种方式:字符串的方式、文件的方式;
Java中想要执行LUA脚本,首先需要在pom中引入相关依赖:
<dependency> <groupId>org.luaj</groupId> <artifactId>luaj-jse</artifactId> <version>3.0.1</version> </dependency>
1、字符串方式
对于简单的lua脚本,可以直接用java字符串写;
package com.saint.base.lua; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.jse.JsePlatform; public class LuaString { public static void main(String[] args) { String luaStr = "print 'Saint is best man'"; Globals globals = JsePlatform.standardGlobals(); LuaValue luaValue = globals.load(luaStr); luaValue.call(); } }
控制台输出:
2、文件方式
对于一些比较常用的、复杂的脚本可以选择存放在文件中,在Java中再调用lua文件;
package com.saint.base.lua; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.jse.JsePlatform; import java.io.FileNotFoundException; public class LuaFile { public static void main(String[] args) throws FileNotFoundException { // lua脚本的文件路径 String luaPath = "/xxxx/javaTest.lua"; Globals globals = JsePlatform.standardGlobals(); //加载脚本文件login.lua,并编译 globals.loadfile(luaPath).call(); LuaValue func1 = globals.get(LuaValue.valueOf("print1")); func1.call(); LuaValue func2 = globals.get(LuaValue.valueOf("print2")); String luaResp = func2.call(LuaValue.valueOf("saint-input-param")).toString(); System.out.println("lua file return is : " + luaResp); } }
lua脚本文件:
控制台输出:
3、Luaj概述
Luaj在包装执行具体的Lua代码时, 有三种不同的模式;
纯脚本解析执行(不选用任何Compiler)
To Lua字节码(LuaC, lua-to-lua-bytecode compiler)(默认选用)
To Java字节码(LuaJC, lua-to-java-bytecode compiler)
Luaj中的Globals对象不是线程安全的, 因此最佳实践是每个线程一个Globals对象。
事实上, 可以采用ThreadLocal的方式来存储该对象。
2)性能问题
Lua脚本在JAVA中运行,相比于直接运行Java代码会慢很多,大约1000倍。
四、Redis + Lua(EVAL命令)
在使用Redisson、Jedis+Lua时,我们可以通过redis客户端集成的、手写的LUA脚本来保证一系列命令在Redis中可以"原子执行"。
在redis执行lua脚本时,相当于一个redis级别的锁,不能执行其他操作,类似于原子操作,这也是redisson实现的一个关键点。
比如Redisson中的lua脚本:
Redisson如何实现分布式锁,可以看文章:https://www.yisu.com/article/277312.htm
lua脚本中有如下几个概念:
redis.call():执行redis命令。
KEYS[n]:指脚本中第n个参数,比如KEYS[1]指脚本中的第一个参数。
ARGV[n]:指脚本中第n个参数的值,比如ARGV[1]指脚本中的第一个参数的值。
返回值中nil与false同一个意思。
1、EVAL命令
redis2.6.0版本起 采用内置的Lua解释器 通过EVAL命令去执行脚本;
redis中的EVAL命令可以用于执行一段lua代码。命令格式如下:
第一个参数script:表示lua脚本的内容;
第二参数numkeys:表示有多少个键值对。
其余参数:先把numkeys个key列出来,再把numkeys个arg列出来。
Lua脚本中可以使用2个函数调用redis命令;
redis.call()
redis.pcall()
redis.call()与redis.pcall()相似,二者唯一不同之处:
如果执行的redis命令执行失败,redis.call()将产生一个Lua error,从而迫使EVAL命令返回一个错误给命令的调用者;
然而redis.pcall()将会捕捉这个错误,并返回代表这个错误的Lua表。
有那么一段逻辑;
如果Redis某个key的整数值 和 某个value相等,则将key对应的整数值 + 1000;否则将key的值设置为9999;
lua脚本执行命令如下:
EVAL "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('INCRBY', KEYS[1], 1000); else redis.call('set', KEYS[1], 9999); return nil; end;" 1 test 100
根据test值的不同,不同的执行结果如下:
The above is the detailed content of How to use Lua script in Java ecosystem/Redis. For more information, please follow other related articles on the PHP Chinese website!

Redis goes beyond SQL databases because of its high performance and flexibility. 1) Redis achieves extremely fast read and write speed through memory storage. 2) It supports a variety of data structures, such as lists and collections, suitable for complex data processing. 3) Single-threaded model simplifies development, but high concurrency may become a bottleneck.

Redis is superior to traditional databases in high concurrency and low latency scenarios, but is not suitable for complex queries and transaction processing. 1.Redis uses memory storage, fast read and write speed, suitable for high concurrency and low latency requirements. 2. Traditional databases are based on disk, support complex queries and transaction processing, and have strong data consistency and persistence. 3. Redis is suitable as a supplement or substitute for traditional databases, but it needs to be selected according to specific business needs.

Redisisahigh-performancein-memorydatastructurestorethatexcelsinspeedandversatility.1)Itsupportsvariousdatastructureslikestrings,lists,andsets.2)Redisisanin-memorydatabasewithpersistenceoptions,ensuringfastperformanceanddatasafety.3)Itoffersatomicoper

Redis is primarily a database, but it is more than just a database. 1. As a database, Redis supports persistence and is suitable for high-performance needs. 2. As a cache, Redis improves application response speed. 3. As a message broker, Redis supports publish-subscribe mode, suitable for real-time communication.

Redisisamultifacetedtoolthatservesasadatabase,server,andmore.Itfunctionsasanin-memorydatastructurestore,supportsvariousdatastructures,andcanbeusedasacache,messagebroker,sessionstorage,andfordistributedlocking.

Redisisanopen-source,in-memorydatastructurestoreusedasadatabase,cache,andmessagebroker,excellinginspeedandversatility.Itiswidelyusedforcaching,real-timeanalytics,sessionmanagement,andleaderboardsduetoitssupportforvariousdatastructuresandfastdataacces

Redis is an open source memory data structure storage used as a database, cache and message broker, suitable for scenarios where fast response and high concurrency are required. 1.Redis uses memory to store data and provides microsecond read and write speed. 2. It supports a variety of data structures, such as strings, lists, collections, etc. 3. Redis realizes data persistence through RDB and AOF mechanisms. 4. Use single-threaded model and multiplexing technology to handle requests efficiently. 5. Performance optimization strategies include LRU algorithm and cluster mode.

Redis's functions mainly include cache, session management and other functions: 1) The cache function stores data through memory to improve reading speed, and is suitable for high-frequency access scenarios such as e-commerce websites; 2) The session management function shares session data in a distributed system and automatically cleans it through an expiration time mechanism; 3) Other functions such as publish-subscribe mode, distributed locks and counters, suitable for real-time message push and multi-threaded systems and other scenarios.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

SublimeText3 Linux new version
SublimeText3 Linux latest version

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

SublimeText3 English version
Recommended: Win version, supports code prompts!

Dreamweaver Mac version
Visual web development tools
