前言
為了在我的一個基本函式庫中降低Redis的通訊成本,我將一系列作業封裝到LUA腳本中,借助Redis提供的EVAL指令來簡化操作。
EVAL能夠提供的特性:
#可以在LUA腳本中封裝若干操作,如果有多條Redis指令,封裝好之後只需向Redis一次發送所有參數即可獲得結果
Redis可以保證Lua腳本運行期間不會有其他命令插入執行,提供像資料庫事務一樣的原子性
Redis會根據腳本的SHA值快取腳本,已經快取過的腳本不需要再次傳輸Lua程式碼,減少了通訊成本,此外在自己程式碼中改變Lua腳本,執行時Redis必定也會使用最新的程式碼。
導入常見的Go函式庫如 "github.com/go-redis/redis",就可以實作下列程式碼。
產生一段Lua腳本
// KEYS: key for record // ARGV: fieldName, currentUnixTimestamp, recordTTL // Update expire field of record key to current timestamp, and renew key expiration var updateRecordExpireScript = redis.NewScript(` redis.call("EXPIRE", KEYS[1], ARGV[3]) redis.call("HSET", KEYS[1], ARGV[1], ARGV[2]) return 1 `)
該變數建立時,Lua程式碼不會被執行,也不需要有已儲存的Redis連線。
Redis提供的Lua腳本支持,預設有KEYS、ARGV兩個數組,KEYS代表腳本運行時傳入的若干鍵值,ARGV代表傳入的若干參數。由於Lua程式碼需要保持簡潔,難免難以讀懂,最好為這些參數寫一些註解
#注意:上面一段程式碼使用``跨行,`所在的行雖然空白回車,也會被認為是一行,報錯時不要看錯代碼行號。
執行一段Lua腳本
updateRecordExpireScript.Run(c.Client, []string{recordKey(key)}, expireField, time.Now().UTC().UnixNano(), int64(c.opt.RecordTTL/time.Second)).Err()
執行時,Run將會先透過EVALSHA嘗試透過快取執行腳本。如果沒有緩存,則使用EVAL運行,這時Lua腳本才會被整個傳入Redis。
Lua腳本的限制
Redis不提供引入額外的包,例如os等,只有redis這一包可用。
Lua腳本將會在一個函數中執行,所有變數必須使用local宣告
return傳回多個值時,Redis將會只給你第一個
腳本中的型別限制
#腳本回傳nil時,Go中得到的是
err = redis.Nil
(與Get找不到值相同)#腳本回傳false時,Go中得到的是nil,當腳本回傳true時, Go中得到的是int64型別的1
在腳本回傳{"ok": ...}時,Go中得到的是redis的status型別(true/false)
腳本回傳{"err": ...}時,Go中得到的是err值,也可以透過
return redis.error_reply("My Error")
達成腳本傳回number型別時,Go中得到的是int64型別
在腳本中,如果需要將傳入的KEYS/ ARGV中的值從字串類型轉換為數字類型,則應使用to_number函數
#如果腳本運行了很久會發生什麼?
Lua腳本運行期間,為了避免被其他操作污染數據,這段期間將不能執行其它命令,一直等到執行完畢才可以繼續執行其它請求。當Lua腳本執行時間超過了lua-time-limit時,其他請求將會收到Busy錯誤,除非這些請求是SCRIPT KILL(殺掉腳本)或SHUTDOWN NOSAVE(不儲存結果直接關閉Redis)
更多內容參考以下地址,我這裡主要是根據使用Go的經驗提供一些總結。 https://redis.io/commands/eval
一段更「複雜」的腳本,它要求在取得一個key值時,如果該值訪問較多,就延長生存週期。另外也要比較更新時間,如果不需要更新,直接傳回取到的值,否則回傳redis.Nil
// KEYS: rec:key, key // ARGV: currentUnixTimestamp, hotHit, recordTTL, ttl // When there's a hit, var fetchRecordScript = redis.NewScript(local value = redis.call("GET", KEYS[2]) if(value == nil) then return nil end local hit = redis.call("HINCRBY", KEYS[1], "hit", 1) redis.call("EXPIRE", KEYS[1], ARGV[3]) local minHotHit = tonumber(ARGV[2]) local keyTTL = tonumber(ARGV[4]) if(hit > minHotHit)then keyTTL = keyTTL * 2 end redis.call("EXPIRE", KEYS[2], keyTTL) local expire = tonumber(redis.call("HGET", KEYS[1], "expire")) local unixTime = tonumber(ARGV[1]) if(expire == nil or expire
以上是Go語言中怎麼透過Lua腳本操作Redis的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Redis'sserver-sedierations offerfunctions andTriggersForexeCutingCompleXoperationsontheserver.1)函數functionsAllowCompOustomoperationsInlua,JavaScript,javaScript,orredis'sscriptinglanguigh,增強效率和增強性。 2)

redisisbothadatabaseandaserver.1)asadatabase,ituseSin-memorystorageforfastaccess,ifealforreal-timeapplications andCaching.2)Asaserver,ItsupportsPub/submessagingAndluAsessingandluAsessingandluascriptingftingftingftingftingftingftingftingfinteral-timecommunicationandserverserverserverserverserverserverserver-soperations。

Redis是NoSQL數據庫,提供高性能和靈活性。 1)通過鍵值對存儲數據,適合處理大規模數據和高並發。 2)內存存儲和單線程模型確保快速讀寫和原子性。 3)使用RDB和AOF機制進行數據持久化,支持高可用性和橫向擴展。

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

Redis和SQL數據庫的主要區別在於:Redis是內存數據庫,適用於高性能和靈活性需求;SQL數據庫是關係型數據庫,適用於復雜查詢和數據一致性需求。具體來說,1)Redis提供高速數據訪問和緩存服務,支持多種數據類型,適用於緩存和實時數據處理;2)SQL數據庫通過表格結構管理數據,支持複雜查詢和事務處理,適用於電商和金融系統等需要數據一致性的場景。

REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations

Redis與其他數據庫相比,具有以下獨特優勢:1)速度極快,讀寫操作通常在微秒級別;2)支持豐富的數據結構和操作;3)靈活的使用場景,如緩存、計數器和發布訂閱。選擇Redis還是其他數據庫需根據具體需求和場景,Redis在高性能、低延遲應用中表現出色。

Redis在數據存儲和管理中扮演著關鍵角色,通過其多種數據結構和持久化機製成為現代應用的核心。 1)Redis支持字符串、列表、集合、有序集合和哈希表等數據結構,適用於緩存和復雜業務邏輯。 2)通過RDB和AOF兩種持久化方式,Redis確保數據的可靠存儲和快速恢復。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載
最受歡迎的的開源編輯器