導航:首頁 > 程序命令 > lua運行命令

lua運行命令

發布時間:2022-12-12 15:33:30

Ⅰ Redis中使用Lua

在一些互聯網項目中,難免會設計到一些原子性操作,例如實時交易量的累加,分布式鎖的實現,那麼採用lua腳本可以幫助我們完成一個原子性的操作

Redis會使用相同的 Lua 解釋器來運行所有命令。Redis 還保證以原子方式執行腳本:在執行腳本時不會執行其他腳本或 Redis 命令。

使用Lua腳本的好處有

基本用法

例如

返回結果

使用Lua實現分布式鎖
加鎖

解鎖

Ⅱ Redis 中使用 Lua 腳本

Redis 本身已經提供了豐富的命令,但是直接用來處理一些復雜業務時可能還不夠方便,會有一定的局限性。因此,在 Redis2.6 版本開始提供了對 Lua 腳本的支持,Lua 腳本的使用還是比較廣泛的,比如商品秒殺、分布式鎖等,使用 Lua 腳本可以帶來以下的好處:

為了讓例子更加的貼近實際應用,這里實現一個簡單版的分布式鎖。這里先用 Jedis 操作。

上邊詳細的介紹了分布式鎖的實現過程,以及可能出現的問題,最終,我們決定刪除鎖的操作使用 Lua 腳本實現,對應的腳本如下:

Lua 腳本中執行具體的 Redis 命令,需要使用 redis.call() 方法, KEYS 表示客戶端發起腳本執行命令時攜帶的 Redis key 的一個集合, ARGV 則是其它參數的一個集合,主意下標從1開始。結合我們的業務,這里的 KEYS[1] 則表示 lock , ARGV[1] 則是一個隨機字元串。整個腳本的含義就是,如果客戶端傳遞的 lock 的 value 和 Redis 中存儲的一致,就刪除 lock 。

Lua 腳本的語法還是比較簡單的,具體內容可以自行學習。

前邊的准備工作基本結束了,文章開始說過執行腳本有兩種途徑,下邊我們具體來看:

這里使用 jedis.eval() 發送腳本到 Redis 伺服器執行,後兩個參數分別是 key 的集合,以及 value 參數的集合。

先將腳本以文件形式放到 Redis 里,例如這樣:

然後通過如下命令讓 Redis 伺服器緩存腳本:

script load 命令會在 Redis 伺服器緩存 Lua 腳本,並且腳本內容經過 SHA-1 簽名演算法處理後,會返回腳本內容的 SHA1 校驗和的編碼,然後在端調用時,傳入編碼字元串作為參數,這樣 Redis 伺服器就會執行對應緩存的腳本了,就不用了每次發送具體的腳本內容了。

還有兩個比較有用的命令:

除了使用上邊的命令緩存腳本、生成腳本的 SHA1 校驗和的編碼,還可以使用 Jedis 實現,但最終的 SHA1 編碼內容是不同的:

實際的項目中,可能更多的會在 SpringBoot 項目中整合 Redis,此時執行 Lua 腳本的基本流程如下:

核心的類就是 DefaultRedisScript ,它實現了 RedisScript 介面。 execute() 方法最後一個參數是可變類型的,用來傳遞多個 value 參數。初次執行 execute() 方法時,其內部會自動緩存 Lua 腳本到 Redis 伺服器;同時每次執行腳本時會根據腳本內容自動計算出對應的 SHA1 校驗和的編碼,去匹配、執行緩存的腳本。

具體的 SHA1 校驗和的編碼,可以在 execute() 方法執行後,使用 redisScript.getSha1() 查看。使用 SpringBoot 方式 執行 Lua 腳本生成的 SHA1 校驗和的編碼和前邊直接使用 Jedis 生成的一致。

無論用那種方式在 Redis 中使用 Lua 腳本,其中的原理都是類似的。

Ⅲ redis使用lua

redis中執行lua可以通過兩種方式:

第一種是將lua腳本或命令直接使用redis執行,第二種相當於把腳本或命令保存到redis中,然後使用一串sha碼調用(可以理解為調用函數)

例子(在redis中執行):

輸出:

這里傳入的key個數為1,所以redis是key而world是參數

這個操作相當於把腳本載入到redis,得到一個SHA1的校驗和,然後使用這個SHA1碼來調用對於的Lua腳本,避免每次去發送Lua腳本。

例子:

執行evalsha

如:

redis提供了幾個命令來管理腳本

用於將Lua腳本載入到redis內存中

用於判斷sha1值是否已經載入到redis內存中

返回個數

用於清除redis內存已經載入的所有腳本

用於殺掉正在執行的Lua腳本

如果Lua腳本比較耗時,甚至Lua腳本存在問題,那麼此時Lua腳本的執行會阻塞redis,直到腳本執行完畢或者外部干預將其結束

有一點需要注意,如果Lua腳本正在執行寫操作, script kill 命令不會生效,這時只能等待腳本執行結束,或使用 shutdown save 停掉redis服務

可參看 redis官方文檔

有兩種方式可以調用

這兩種方法都可以調用,區別是call()方法是遇到就停止執行後面的內容並直接返回錯誤,而pcall遇到異常會忽略掉繼續執行

其他命令可參看文檔這里不贅述

一個使用Lua腳本執行redis scan命令進行批量刪除的例子,文件名為 del-batch.lua

調用

執行了之後會刪除符合規則 TEST_KEY* 的key

調用結果

Ⅳ 怎麼用命令運行lua文本文件

寫好腳本script.lua,然後在控制台(cmd)下輸入Lua script.lua,

需要Lua後邊正確輸入你的腳本所在的路徑.

Ⅳ lua後綴文件怎麼打開以及怎麼使用

Ⅵ 請問LUA用os.execute執行命令時有沒有辦法不等待執行完畢直接返回啊

沒辦法。os.execute應該是使用系統的system調用。你說的那種應該是使用類似popen或者其他的方法。除非多線程,否則os.execute肯定阻塞直到調用返回,而tcpmp這種一般要打開管道方便寫對方輸入,同時讀對方輸出的。

Ⅶ Windows 下編譯 LuaJIT

這里使用 Visual studio 自帶的命令行工具來進行編譯,所以需要安裝好VS。

首先打開VS命令行工具。可以按 Win + S ,輸入 prompt 來找到它。如圖。

解壓 LuaJIT 源碼,並進入到解壓目錄 /src 下。輸入 msvcbuild 開始編譯。

看到 === Successfully built LuaJIT for xxxxx === 則是編譯成功了。
在解壓目錄 /src 下可以找到編譯生成的 luajit.exe 和 lua51.dll .

打開cmd。
如果沒有添加環境變數則先定位到LuaJit安裝目錄。
輸入 luajit +文件名 即可運行Lua腳本。
輸入 luajit -b +Lua腳本+目標文件名,即可編譯腳本。

Ⅷ 請問自己的軟體如何運行Lua腳本

programming in lua 有相關的例子,一般腳本語言和c/c++之類的互相調用分兩類,一類是擴展,就是將c/c++模塊封裝起來給腳本語言用,用swig做封裝很方便的,一類是嵌入,就是在c/c++等應用中嵌入lua引擎,一般是用來分離經常變化的邏輯部分,比如WOW就是用lua語言作為擴展,用戶可以編寫lua腳本來完成一些特定功能的機器人。你要做的就是使用lua c api來在你的程序中執行lua。類似這種:

int iErr = 0;
lua_State *lua = lua_open (); // Open Lua
luaopen_io (lua); // Load io library
if ((iErr = luaL_loadfile (lua, "test.lua")) == 0)
{
// Call main...
if ((iErr = lua_pcall (lua, 0, LUA_MULTRET, 0)) == 0)
{
// Push the function name onto the stack
lua_pushstring (lua, "helloWorld");
// Function is located in the Global Table
lua_gettable (lua, LUA_GLOBALSINDEX);
lua_pcall (lua, 0, 0, 0);
}
}
lua_close (lua);

Ⅸ Lua調用uci命令及linux命令

最近項目接觸到Openwrt的編譯和使用,op本身是一個定製的linux系統,兼容的包和語言也有很多,隨著物聯網的發展,相信在路由器方面的應用會越來越多,luci作為一個已經在openwrt上集成的web管理工具有很強大的功能,但我的項目裡面需要修改和使用自己的配置文件,因此整理一下lua+uci的使用。

Ⅹ Lua常用的文件操作

一、基本的文件讀寫

(1) io.open

功能:按指定的模式打開一個文件,成功則返迴文件句柄,失敗則返回nil+錯誤信息

file = io.open (filename [, mode])

mode 的值有:

r  以只讀方式打開文件,該文件必須存在。

w  打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。

a   以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)

r+  以可讀寫方式打開文件,該文件必須存在。

w+  打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。

a+   與a類似,但此文件可讀可寫

b   二進制模式,如果文件是二進制文件,可以加上b

+   號表示對文件既可以讀也可以寫

(2)  file:write(...)

功能:按指定的參數格式輸出文件內容,參數必須為字元或數字,若要輸出其它值,則需通過tostring或string.format進行轉換

(3)  file:close()

功能:關閉文件,我抽U盤才懶得'安全刪除硬體',一般都直接拔了.這個命令也一樣,反正lua有垃圾自動回收........

(4) io.lines ([filename])

功能:打開指定的文件filename為讀模式並返回一個迭代函數,每次調用將獲得文件中的一行內容,當到文件尾時,將返回nil,並自動關閉文件

(5) io.popen ([prog [, mode]])

功能:開始程序prog於額外的進程,並返回用於prog的文件句柄(並不支持所有的系統平台)

二、常用文件操作

(1)判斷文件是否存在

function checkFileExist(path)

        local file = io.open(path, "rb")

        if file then file:close() end

        return file ~= nil

 end

(2)判斷文件夾是否存在()

os.execute("cd "..dirPath)

返回值為0便是存在,不為0時表示不存在

(3)創建文件夾

os.execute("mkdir "..dirPath)

(4)刪除文件

os.remove(filepath)

eg:創建多層文件夾

Configs.debugFilePath = "E:/test1/test2/test3/test4/test.txt"

function checkDirExist()

    local dirlist = string.split(Configs.debugFilePath,"/")

    local filenamelen = string.len(dirlist[#dirlist])

    local dirpath = string.sub(Configs.debugFilePath,1,string.len(Configs.debugFilePath)-filenamelen-1)

    local path_tb={}

    local new_path=""

    -- 分割路徑保存到table

    for s in string.gmatch(dirpath,"([^'/']+)") do

        if s~=nil then

            table.insert(path_tb,s)

        end

    end

    -- 遍歷並拼接路徑檢測是否存在,不存在則新建

    for k,v in ipairs(path_tb) do

        if k==1 then

            new_path=v

        else

            new_path=new_path.."\\"..v

        end   

        if os.execute("cd "..new_path) ~= 0 then

            os.execute("mkdir "..new_path)

        end

    end

end

(5)獲得文件夾下的所有文件路徑(windows)

io.popen("dir path /b /s")

eg:

local dirinfo= io.popen("dir path /b /s")

local all = dirinfo:read("*all")

閱讀全文

與lua運行命令相關的資料

熱點內容
小米sd卡解壓 瀏覽:996
程序員那麼可愛陸漓替老袁說情 瀏覽:28
當女程序員遇見問題 瀏覽:746
32位編譯器什麼意思 瀏覽:355
php多參數函數 瀏覽:17
通達信板塊動作源碼 瀏覽:751
matlab完全自學一本通pdf 瀏覽:250
php源碼本地安裝 瀏覽:961
伺服器怎麼用不會斷電 瀏覽:301
主從伺服器有什麼用 瀏覽:213
jstlpdf 瀏覽:15
安卓原神在哪個app下載 瀏覽:808
單片機編程技術什麼意思 瀏覽:104
e點課堂源碼 瀏覽:46
免費打擊墊app哪個好 瀏覽:532
程序員必裝的6款軟體 瀏覽:750
基於單片機的遙控器設計 瀏覽:521
安卓如何取消圓圖標 瀏覽:11
收件伺服器怎麼樣 瀏覽:48
建築設計規范pdf 瀏覽:99