18.2.go語言redis中使用lua腳本

?在 Redis 中使用 Lua 腳本可以實現原子性操作、減少網絡開銷以及提高執行效率。

Redis 執行 Lua 腳本的原理

Redis 內置了 Lua 解釋器,能夠直接在服務器端執行 Lua 腳本。當執行 Lua 腳本時,Redis 會將腳本作為一個整體執行,保證腳本執行期間不會被其他命令插入,從而實現原子性操作。

基本使用方法

?使用EVAL命令執行 Lua 腳本

EVAL命令用于在 Redis 中執行 Lua 腳本,其基本語法如下:

EVAL script numkeys key [key ...] arg [arg ...]
  • script:要執行的 Lua 腳本。
  • numkeys:腳本中使用的鍵名參數的數量。
  • key [key ...]:鍵名參數列表。
  • arg [arg ...]:其他參數列表。
redis-cli EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 mykey myvalue
  • 腳本return redis.call('SET', KEYS[1], ARGV[1])的作用是調用 Redis 的SET命令,將ARGV[1]的值設置到KEYS[1]對應的鍵上。
  • 1表示腳本中使用的鍵名參數的數量為 1。
  • mykey是鍵名參數。
  • myvalue是其他參數。
使用EVALSHA命令執行預加載的腳本

為了避免每次執行腳本時都傳輸整個腳本內容,可以使用SCRIPT LOAD命令將腳本加載到 Redis 中,得到一個 SHA1 哈希值,然后使用EVALSHA命令通過哈希值來執行腳本。

# 加載腳本并獲取SHA1哈希值
redis-cli SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])"
# 輸出示例:"a1b2c3d4e5f6..."# 使用EVALSHA命令執行腳本
redis-cli EVALSHA "a1b2c3d4e5f6..." 1 mykey myvalue

?在 Go 語言中使用 Lua 腳本操作 Redis

以下是一個使用 Go 語言和go-redis庫執行 Lua 腳本的示例

package mainimport ("context""fmt""github.com/go-redis/redis/v8"
)func main() {rdb := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})ctx := context.Background()// 定義Lua腳本script := `local key = KEYS[1]local value = ARGV[1]return redis.call('SET', key, value)`// 執行Lua腳本result, err := rdb.Eval(ctx, script, []string{"mykey"}, "myvalue").Result()if err != nil {fmt.Println("Failed to execute Lua script:", err)return}fmt.Println("Script execution result:", result)
}    

Lua 腳本中的 Redis API

在 Lua 腳本中,可以使用redis.callredis.pcall函數來調用 Redis 命令:

  • redis.call:調用 Redis 命令,如果命令執行出錯,腳本會終止并返回錯誤信息。
  • redis.pcall:調用 Redis 命令,如果命令執行出錯,腳本不會終止,而是返回一個包含錯誤信息的 Lua 表。

call示例:

package mainimport ("context""fmt""github.com/go-redis/redis/v8"
)func main() {rdb := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})ctx := context.Background()// 定義Lua腳本script := `redis.call('SET', KEYS[1], ARGV[1])local value = redis.call('GET', KEYS[1])return value`// 執行Lua腳本result, err := rdb.Eval(ctx, script, []string{"mykey"}, "myvalue").Result()if err != nil {fmt.Println("Failed to execute Lua script:", err)return}fmt.Println("Script execution result:", result)
}    

pcall示例:?

package mainimport ("context""fmt""github.com/go-redis/redis/v8"
)func main() {rdb := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})ctx := context.Background()// 定義包含 redis.pcall 的 Lua 腳本script := `local result = redis.pcall('GET', 'nonexistent_key')if type(result) == 'table' and result.err thenreturn 'Error: ' .. result.errelsereturn resultend`// 執行 Lua 腳本result, err := rdb.Eval(ctx, script, []string{}).Result()if err != nil {fmt.Println("Failed to execute Lua script:", err)return}fmt.Println("Script execution result:", result)
}    

注意事項

  • 原子性:Lua 腳本在 Redis 中是原子執行的,但要注意腳本的執行時間不宜過長,否則會阻塞其他客戶端的請求。
  • 性能:合理使用 Lua 腳本可以減少網絡開銷和提高執行效率,但如果腳本過于復雜,可能會影響性能。
  • 數據類型:Lua 腳本中的數據類型和 Redis 的數據類型需要進行適當的轉換。

Lua 注釋

單行注釋

在 Lua 里,使用兩個連字符?--?開啟單行注釋。在?--?之后直到該行結束的內容都會被視為注釋,不會被 Lua 解釋器執行。

-- 這是一個單行注釋
local num = 10 -- 定義一個變量 num 并賦值為 10
多行注釋

多行注釋以?--[[?開頭,以?]]?結尾。在這兩個標記之間的所有內容都屬于注釋,無論跨多少行。

--[[
這是一個多行注釋
可以包含很多行內容
用于對代碼塊進行詳細說明
]]
local str = "Hello, World!"

Lua 基本語法

變量

Lua 是動態類型語言,變量不需要預先聲明類型。常見的變量類型有?nilbooleannumberstringtablefunctionthread?和?userdata

  • 全局變量:默認情況下,變量都是全局變量。未賦值的全局變量值為?nil
-- 定義一個全局變量
message = "Hello, Lua!"
print(message)
  • 局部變量:使用?local?關鍵字聲明局部變量,其作用域僅限于聲明它的代碼塊。
dolocal num = 20print(num) -- 可以在代碼塊內訪問
end
-- print(num) -- 這里會出錯,因為 num 是局部變量,超出作用域
數據類型
1. 布爾類型(boolean)

只有兩個值:true?和?false。在條件判斷中,除了?false?和?nil?被視為假,其他值都被視為真。

local isEnabled = true
if isEnabled thenprint("Enabled")
end
2. 數字類型(number)

Lua 中的數字類型默認是雙精度浮點數。

local num1 = 10
local num2 = 3.14
print(num1 + num2)
3. 字符串類型(string)

可以使用單引號或雙引號來表示字符串。

local str1 = 'Hello'
local str2 = "World"
print(str1 .. " " .. str2) -- 使用 .. 進行字符串拼接
4. 表類型(table)

Lua 中最強大的數據類型,可以當作數組、字典等使用。表使用花括號?{}?來創建。

-- 當作數組使用
local fruits = {"apple", "banana", "cherry"}
print(fruits[1]) -- 索引從 1 開始-- 當作字典使用
local person = {name = "John", age = 30}
print(person.name)
控制結構
1.?if-else?語句
local score = 80
if score >= 90 thenprint("A")
elseif score >= 80 thenprint("B")
elseprint("C")
end
2.?for?循環
  • 數值型?for?循環:用于遍歷一個數值范圍。
for i = 1, 5 doprint(i)
end
  • 泛型?for?循環:用于遍歷迭代器,如數組或表。
local fruits = {"apple", "banana", "cherry"}
for index, value in ipairs(fruits) doprint(index, value)
end
3.?while?循環
local count = 0
while count < 3 doprint(count)count = count + 1
end

函數

函數使用?function?關鍵字定義,可以有參數和返回值。

function add(a, b)return a + b
endlocal result = add(3, 5)
print(result)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77537.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77537.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77537.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

?Unity_Demolition Media Hap (播放Hap格式視頻 超16K大分辨率視頻 流暢播放以及幀同步解決方案)

播放大分辨率視頻以及實現局域網視頻同步是許多開發者會遇到的需求,AVPro有一個 Ultra Edition版本,也能播放Hap格式視頻,之外就是Demolition Media Hap插件啦,實測即使是 7208*3808 大分辨率的視頻幀率還是能穩定在30幀,它能幫助我們輕松解決這些問題??。 一、插件概述 …

AI大模型知識與醫療項目實踐 - Java架構師面試實戰

AI大模型知識與醫療項目實踐 - Java架構師面試實戰 本文模擬了一場互聯網大廠的Java架構師面試&#xff0c;圍繞AI大模型知識、工具以及其在醫療項目中的實踐和趨勢展開討論。 第一輪提問 面試官&#xff1a; 馬架構&#xff0c;請您介紹一下AI大模型的基本概念及其在醫療領…

Windows 的文件系統不區分大小寫,Linux區分

在 Windows 系統中&#xff0c;文件系統默認是不區分大小寫的。這意味著在 Windows 上&#xff0c;文件名 ui_BalanceMeasureScreenUI.h 和 ui_balancemeasurescreenui.h 被視為同一個文件。因此&#xff0c;即使你在代碼中使用了不同的大小寫方式來引用同一個文件&#xff0c;…

Unity 資源合理性檢測

一&#xff1a;表格過度配置&#xff0c;表格資源是否在工程中存在&#xff0c;并輸出不存在的資源 import pandas as pd import glob import osassets [] count 0# 遍歷configs文件夾下所有xlsx文件 for file_path in glob.glob(configs/*.xlsx):count 1try:sheets pd.re…

Python爬蟲實戰:獲取高考資源網各學科精品復習資料

一、引言 高考資源網擁有豐富的高考復習資料,對于我們而言,獲取這些資源并整理分享能為考生提供有價值的幫助。然而,手動從網站查找和下載資源效率低且易出錯。利用 Python 爬蟲技術可實現自動化資源獲取,提高工作效率。但在爬取過程中,需考慮網站反爬機制,采取相應措施…

DuckDB:現代數據分析的“SQLite“內核革命

在數據工程、數據科學快速演進的今天&#xff0c;一個新的名字正在快速躥紅&#xff1a;DuckDB。 有人稱它是數據分析領域的SQLite&#xff0c;也有人稱它為下一代輕量級OLAP引擎。 無論哪種稱呼&#xff0c;都離不開一個事實&#xff1a; DuckDB 重新定義了小型數據倉庫和本地…

GIS開發筆記(16)解決基于osg和osgearth三維地圖上添加placeNode圖標點擊不易拾取的問題

一、實現效果 二、實現原理 在圖標添加的位置同時添加一個紅色圓球,半徑為5000~8000米,圖標和圓球掛接到同一個group節點,group節點再掛接到根節點,當點擊到圓球時,通過遍歷父節點就可以找到被點擊的圖標節點。 三、參考代碼 //添加圖標代碼 #pragma once #include &…

計算機網絡學習筆記 1-3章

第 1 章 計算機網絡體系結構 【考綱內容】 &#xff08;一&#xff09;計算機網絡概述 計算機網絡的概念、組成與功能&#xff1b;計算機網絡的分類&#xff1b; 計算機網絡的性能指標 &#xff08;二&#xff09;計算機網絡體系結構與參考模型 計算機網絡分層結構&#xff…

基于NVIDIA RTX 4090的COLMAP 3.7安裝指南:Ubuntu 20.04 + CUDA 11.8環境配置【2025最新版!!】

一、引言 三維重建技術作為計算機視覺領域的核心方向&#xff0c;在數字孿生、自動駕駛等領域具有重要應用價值。COLMAP作為開源的SfM&#xff08;Structure-from-Motion&#xff09;工具&#xff0c;其GPU加速特性可顯著提升重建效率。由于最新研究三維重建的需要&#xff08…

Spring Boot 依賴管理: `spring-boot-starter-parent` 與 `spring-boot-dependencies`

前言 在 Spring Boot 的開發實踐中&#xff0c;依賴管理是構建高質量應用的基礎。spring-boot-starter-parent 和 spring-boot-dependencies 是 Spring Boot 提供的兩大核心依賴管理工具&#xff0c;它們在簡化依賴版本控制、統一配置等方面發揮著關鍵作用。 一、核心概念解析…

【MySQL】基本查詢

目錄 增加 查詢 基本查詢 where子句 結果排序 篩選分頁結果 修改(更新) 刪除 普通刪除 截斷表 插入查詢結果 聚合函數 分組查詢 這一節的內容是對表內容的增刪查改&#xff0c;其中重點是表的查詢 增加 語法&#xff1a; INSERT [INTO] table_name [(column [, …

【C++詳解】C++入門(二)引用、內聯函數、nullptr宏

文章目錄 一、引用引用的概念和定義引用的功能引用的特性const引用const用法回顧權限的放大縮小const引用的功能 指針和引用的關系 二、內聯函數三、nullptr補充結構體指針變量類型重定義 一、引用 引用的概念和定義 C祖師爺為了優化在部分場景中使用指針會出現的效率較低和比…

畢業設計-基于深度學習的實時網絡入侵檢測系統

項目技術說明 深度學習實時網絡入侵檢測系統是一種利用深度學習技術對網絡流量進行實時分析&#xff0c;以識別和阻止潛在網絡攻擊的安全解決方案。相比傳統基于規則的入侵檢測系統(IDS)&#xff0c;這種系統能夠通過學習網絡流量的正常模式和異常模式&#xff0c;更有效地檢測…

中藥企業數字化轉型:從傳統制造到智能制藥的跨越

在當今數字化浪潮下&#xff0c;中藥企業正積極擁抱變革&#xff0c;努力實現從傳統制造向智能制藥的跨越&#xff0c;以適應市場競爭和滿足人們對中藥質量與效率的更高要求。 在原料管理環節&#xff0c;企業通過采用物聯網技術&#xff0c;對中藥材種植、采集過程進行全程監…

Vue 2 的響應式 API 和 Vue 3 的組合式 API 的詳細對比,從核心機制、使用方式、代碼示例及優缺點展開

以下是 Vue 2 的響應式 API 和 Vue 3 的組合式 API 的詳細對比&#xff0c;從核心機制、使用方式、代碼示例及優缺點展開&#xff1a; 1. Vue 2 的響應式 API 核心機制 基于 Object.defineProperty&#xff1a; 通過劫持對象的 getter 和 setter 實現數據變化追蹤。限制&…

“八股訓練營”學習總結

在參加為期 40 天的八股訓練營的這段時間里&#xff0c;我收獲滿滿&#xff0c;不僅在知識技能上得到了提升&#xff0c;更在學習習慣和自我認知方面有了很大的進步。 在知識層面&#xff0c;訓練營涵蓋了網絡、數據庫、緩存以及python測試開發等多方面的知識點。 網絡方面&a…

Python對比兩張CAD圖并標記差異的解決方案

以下是使用Python對比兩張CAD圖并標記差異的解決方案&#xff0c;結合圖像處理和CAD結構分析&#xff1a; 一、環境準備與庫選擇 圖像處理庫&#xff1a;使用OpenCV進行圖像差異檢測、顏色空間轉換和輪廓分析。CAD解析庫&#xff1a;若為DXF格式&#xff0c;使用ezdxf解析實體…

記錄學習記錄學習《手動學習深度學習》這本書的筆記(九)

馬不停蹄地來到了第十二章&#xff1a;計算性能…… 感覺應該是講并行計算方面的&#xff0c;比如GPU、CPU、CUDA那些。 第十二章&#xff1a;計算性能 12.1 編譯器和解釋器 這里先提出了命令式編程和符號式編程的概念。 命令式編程VS符號式編程 目前為止&#xff0c;本書…

模板引擎語法-過濾器

模板引擎語法-過濾器 文章目錄 模板引擎語法-過濾器[toc]1.default過濾器2.default_if_none過濾器3.length過濾器4.addslashes過濾器5.capfirst過濾器6.cut過濾器7.date過濾器8.dictsort過濾器 1.default過濾器 default過濾器用于設置默認值。default過濾器對于變量的作用&…

make學習三:書寫規則

系列文章目錄 Make學習一&#xff1a;make初探 Make學習二&#xff1a;makefile組成要素 文章目錄 系列文章目錄前言默認目標規則語法order-only prerequisites文件名中的通配符偽目標 Phony Targets沒有 Prerequisites 和 recipe內建特殊目標名一個目標多條規則或多個目標共…