Jadual Kandungan
1. Pasang LUA
3. Pembolehubah
Pembolehubah global tidak perlu diisytiharkan Selepas memberikan nilai kepada pembolehubah, pembolehubah global dibuat
2) Operasi rentetan
var berubah daripada exp1 kepada exp2, setiap perubahan meningkat var dengan exp3 sebagai saiz langkah dan melaksanakannya sekali. exp3 adalah pilihan dan lalai kepada 1 jika tidak dinyatakan.
2)while循环
3)break提前退出循环
7、函数
三、Java中执行Lua脚本
1、字符串方式
2、文件方式
3、Luaj概述
四、Redis + Lua(EVAL命令)
1、EVAL命令
Rumah pangkalan data Redis Cara menggunakan skrip Lua dalam ekosistem Java/Redis

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

Jun 02, 2023 pm 10:41 PM
java redis lua

1. Pasang LUA

Sangat mudah untuk memasang LUA pada Mac, hanya gunakan brew arahan yang berkaitan; Perintah

Lihat bahawa lua telah dipasang.

Cara menggunakan skrip Lua dalam ekosistem Java/Redis1) Hanya gunakan

untuk mencipta fail test.lua dengan kandungan: lua -v

Jalankan arahan:

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

brew install lua
Salin selepas log masuk

Outputnya ialah:

2. Pengenalan kepada sintaks lua

Lua menyediakan pengaturcaraan interaktif dan skrip pengaturcaraan Formula: Cara menggunakan skrip Lua dalam ekosistem Java/Redis

Pengaturcaraan interaktif: Masukkan sintaks terus dalam baris arahan, anda boleh melaksanakannya serta-merta dan melihat kesan pelaksanaan.

  • Skrip ialah pengaturcaraan: menulis fail skrip dan kemudian melaksanakannya.

  • 1 Komen

    lua menyediakan dua kaedah ulasan: ulasan satu baris dan komen berbilang baris
1) Ulasan satu baris

Gunakan dua tanda tolak;

2) Komen berbilang baris

lua test.lua
Salin selepas log masuk

2 kata kunci untuk Lua , seperti Java, kata kunci terpelihara tidak boleh digunakan sebagai pemalar atau pembolehubah. --

3. Pembolehubah

Secara lalai, semua pembolehubah yang ditakrifkan ialah pembolehubah global jika anda ingin menggunakan pembolehubah tempatan, ia perlu diisytiharkan sebagai

;

Cara menggunakan skrip Lua dalam ekosistem Java/Redis1) Pembolehubah global

Pembolehubah global tidak perlu diisytiharkan Selepas memberikan nilai kepada pembolehubah, pembolehubah global dibuat

Tidak ada ralat semasa mengakses pembolehubah global yang tidak dimulakan, tetapi anda akan mendapat keputusan: nillocal

Selagi pembolehubah diberikan nilai nil, anda boleh memadamkan pembolehubah global. ; dengan kata lain, jika dan hanya jika pembolehubah adalah nil, pembolehubah itu tidak wujud.

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

Selain itu, nama yang biasanya bermula dengan garis bawah diikuti dengan rentetan huruf besar (seperti _VERSION) dikhaskan untuk pembolehubah global dalaman Lua.

2) Pembolehubah setempat Cara menggunakan skrip Lua dalam ekosistem Java/Redis

--[[
 多行注释
 多行注释
 --]]
Salin selepas log masuk

4 Jenis data

Lua ialah bahasa yang ditaip secara dinamik tidak perlu ditaip, hanya pembolehubah yang perlu nilai yang diberikan. Nilai boleh disimpan dalam pembolehubah, diluluskan sebagai hujah atau dikembalikan sebagai hasil.

Terdapat 8 jenis asas dalam Lua: nol, boolean, nombor, rentetan, data pengguna, fungsi, benang dan jadual.

1) Tatasusunan Lua

Dalam tatasusunan Lua, nilai indeks bermula dari 1 dan boleh ditentukan untuk bermula dari 0.

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

2) Operasi rentetan

Cara menggunakan skrip Lua dalam ekosistem Java/Redis Gabungkan dua rentetan;

digunakan untuk memintas rentetan;
    rreee
  • ..s: rentetan yang akan dipintas; kedudukan permulaan pemintasan;

  • j: kedudukan akhir pemintasan, lalai ialah -1, aksara terakhir; string.sub()

    -- 局部变量赋值
    local b=2
    Salin selepas log masuk

Cari substr kandungan yang ditentukan dalam rentetan sasaran yang ditentukan Jika subrentetan yang sepadan ditemui, permulaan subrentetan akan dikembalikan Indeks dan indeks tamat, kembalikan nil jika mereka tidak wujud.
  • menentukan kedudukan permulaan carian Lalai ialah 1. Ia boleh menjadi nombor negatif, menunjukkan bilangan aksara yang dikira dari belakang ke hadapan.
  • menunjukkan sama ada untuk menggunakan mod mudah lalai adalah benar hanya melakukan carian mudah untuk subrentetan yang menunjukkan padanan corak biasa.

5 if-else

string.find()Hasil ungkapan bersyarat boleh menjadi sebarang nilai yang Lua menganggap palsu dan nil sebagai palsu, dan benar dan bukan nol kepada menjadi benar.

    Struktur if-else keseluruhan adalah serupa dengan bahasa peringkat tinggi yang kami gunakan (Java, GO Bezanya ialah jika anda ingin melakukan beberapa logik lain selepas ungkapan if() dalam LUA berpuas hati, anda perlu mengikuti dengan teliti
  • , dan kawalan aliran berakhir dengan

    .

    string.sub(s, i [, j])
    Salin selepas log masuk
  • 6. Gelung
  • 1) untuk gelunginit

    Terdapat dua kategori utama bagi pernyataan dalam bahasa pengaturcaraan Lua: tatasusunan untuk gelung dan generik untuk gelung
  • 1> Tatasusunan untuk gelung

    plain

    Format sintaks:
string.find (str, substr, [init, [plain]])
Salin selepas log masuk

var berubah daripada exp1 kepada exp2, setiap perubahan meningkat var dengan exp3 sebagai saiz langkah dan melaksanakannya sekali. exp3 adalah pilihan dan lalai kepada 1 jika tidak dinyatakan.

2> 泛型for循环

通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句;

语法格式:

--打印数组a的所有值  
a = {"one", "two", "three"}
for i, v in ipairs(a) do
    print(i, v)
end
Salin selepas log masuk
  • i 是数组索引值,v 是对应索引的数组元素值。

  • ipairs是Lua提供的一个迭代器函数,用来迭代数组。

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

2)while循环

while 循环语句在判断条件为 true 时会重复执行循环体语句。

语法格式:

while(condition)
do
   statements
end
Salin selepas log masuk
  • statements(循环体语句) 可以是一条或多条语句,condition(条件) 可以是任意表达式;

  • 在 condition(条件) 为 true 时执行循环体语句。

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

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))
Salin selepas log masuk

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

三、Java中执行Lua脚本

Java中执行Lua脚本有两种方式:字符串的方式、文件的方式;

Java中想要执行LUA脚本,首先需要在pom中引入相关依赖:

<dependency>
    <groupId>org.luaj</groupId>
    <artifactId>luaj-jse</artifactId>
    <version>3.0.1</version>
</dependency>
Salin selepas log masuk

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 &#39;Saint is best man&#39;";
        Globals globals = JsePlatform.standardGlobals();
        LuaValue luaValue = globals.load(luaStr);
        luaValue.call();
    }
}
Salin selepas log masuk

控制台输出:

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

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);
    }
}
Salin selepas log masuk

lua脚本文件:

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

控制台输出:

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

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脚本:

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

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代码。命令格式如下:

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

  • 第一个参数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(&#39;get&#39;, KEYS[1]) == ARGV[1] then return redis.call(&#39;INCRBY&#39;, KEYS[1], 1000); else redis.call(&#39;set&#39;, KEYS[1], 9999); return nil; end;" 1 test 100
Salin selepas log masuk

根据test值的不同,不同的执行结果如下:

Cara menggunakan skrip Lua dalam ekosistem Java/Redis

Atas ialah kandungan terperinci Cara menggunakan skrip Lua dalam ekosistem Java/Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

PHP vs Python: Memahami Perbezaan PHP vs Python: Memahami Perbezaan Apr 11, 2025 am 12:15 AM

PHP dan Python masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1.Php sesuai untuk pembangunan web, dengan sintaks mudah dan kecekapan pelaksanaan yang tinggi. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan yang kaya.

Cara Membina Mod Kluster Redis Cara Membina Mod Kluster Redis Apr 10, 2025 pm 10:15 PM

Mod Redis cluster menyebarkan contoh Redis ke pelbagai pelayan melalui sharding, meningkatkan skalabilitas dan ketersediaan. Langkah -langkah pembinaan adalah seperti berikut: Buat contoh Redis ganjil dengan pelabuhan yang berbeza; Buat 3 contoh sentinel, memantau contoh redis dan failover; Konfigurasi fail konfigurasi sentinel, tambahkan pemantauan maklumat contoh dan tetapan failover; Konfigurasi fail konfigurasi contoh Redis, aktifkan mod kluster dan tentukan laluan fail maklumat kluster; Buat fail nodes.conf, yang mengandungi maklumat setiap contoh Redis; Mulakan kluster, laksanakan perintah Buat untuk membuat kluster dan tentukan bilangan replika; Log masuk ke kluster untuk melaksanakan perintah maklumat kluster untuk mengesahkan status kluster; buat

Cara menggunakan perintah redis Cara menggunakan perintah redis Apr 10, 2025 pm 08:45 PM

Menggunakan Arahan Redis memerlukan langkah -langkah berikut: Buka klien Redis. Masukkan arahan (nilai kunci kata kerja). Menyediakan parameter yang diperlukan (berbeza dari arahan ke arahan). Tekan Enter untuk melaksanakan arahan. Redis mengembalikan tindak balas yang menunjukkan hasil operasi (biasanya OK atau -r).

Cara membaca kod sumber redis Cara membaca kod sumber redis Apr 10, 2025 pm 08:27 PM

Cara terbaik untuk memahami kod sumber REDIS adalah dengan langkah demi langkah: Dapatkan akrab dengan asas -asas Redis. Pilih modul atau fungsi tertentu sebagai titik permulaan. Mulakan dengan titik masuk modul atau fungsi dan lihat baris kod mengikut baris. Lihat kod melalui rantaian panggilan fungsi. Berhati -hati dengan struktur data asas yang digunakan oleh REDIS. Kenal pasti algoritma yang digunakan oleh Redis.

Cara membersihkan data redis Cara membersihkan data redis Apr 10, 2025 pm 10:06 PM

Cara Mengosongkan Data Redis: Gunakan perintah Flushall untuk membersihkan semua nilai utama. Gunakan perintah flushdb untuk membersihkan nilai utama pangkalan data yang dipilih sekarang. Gunakan Pilih untuk menukar pangkalan data, dan kemudian gunakan FlushDB untuk membersihkan pelbagai pangkalan data. Gunakan perintah DEL untuk memadam kunci tertentu. Gunakan alat REDIS-CLI untuk membersihkan data.

Cara Membaca Gilir Redis Cara Membaca Gilir Redis Apr 10, 2025 pm 10:12 PM

Untuk membaca giliran dari Redis, anda perlu mendapatkan nama giliran, membaca unsur -unsur menggunakan arahan LPOP, dan memproses barisan kosong. Langkah-langkah khusus adalah seperti berikut: Dapatkan nama giliran: Namakannya dengan awalan "giliran:" seperti "giliran: my-queue". Gunakan arahan LPOP: Keluarkan elemen dari kepala barisan dan kembalikan nilainya, seperti LPOP Queue: My-Queue. Memproses Baris kosong: Jika barisan kosong, LPOP mengembalikan nihil, dan anda boleh menyemak sama ada barisan wujud sebelum membaca elemen.

Cara memulakan pelayan dengan redis Cara memulakan pelayan dengan redis Apr 10, 2025 pm 08:12 PM

Langkah -langkah untuk memulakan pelayan Redis termasuk: Pasang Redis mengikut sistem operasi. Mulakan perkhidmatan Redis melalui Redis-server (Linux/macOS) atau redis-server.exe (Windows). Gunakan redis-cli ping (linux/macOS) atau redis-cli.exe ping (windows) perintah untuk memeriksa status perkhidmatan. Gunakan klien Redis, seperti redis-cli, python, atau node.js untuk mengakses pelayan.

Cara menggunakan kunci redis Cara menggunakan kunci redis Apr 10, 2025 pm 08:39 PM

Menggunakan REDIS untuk mengunci operasi memerlukan mendapatkan kunci melalui arahan SETNX, dan kemudian menggunakan perintah luput untuk menetapkan masa tamat tempoh. Langkah-langkah khusus adalah: (1) Gunakan arahan SETNX untuk cuba menetapkan pasangan nilai utama; (2) Gunakan perintah luput untuk menetapkan masa tamat tempoh untuk kunci; (3) Gunakan perintah DEL untuk memadam kunci apabila kunci tidak lagi diperlukan.

See all articles