1. 程式人生 > 資料庫 >Redis執行Lua指令碼的好處與示例程式碼

Redis執行Lua指令碼的好處與示例程式碼

前言

Redis從2.6版本開始引入對Lua指令碼的支援,通過在伺服器中嵌入Lua環境,Redis客戶端可以使用Lua指令碼,直接在服務端原子的執行多個Redis命令。

其中,使用EVAL命令可以直接對輸入的指令碼進行求值:

redis>EVAL "return 'hello world'" 0
"hello world"

使用指令碼的好處如下:

1.減少網路開銷:本來5次網路請求的操作,可以用一個請求完成,原先5次請求的邏輯放在redis伺服器上完成。使用指令碼,減少了網路往返時延。

2.原子操作:Redis會將整個指令碼作為一個整體執行,中間不會被其他命令插入。

3.複用:客戶端傳送的指令碼會永久儲存在Redis中,意味著其他客戶端可以複用這一指令碼而不需要使用程式碼完成同樣的邏輯。

Redis執行Lua指令碼

實現一個訪問頻率控制,某個ip在短時間內頻繁訪問頁面,需要記錄並檢測出來,就可以通過Lua指令碼高效的實現
在redis客戶端機器上,新建一個檔案ratelimiting.lua,內容如下

local times = redis.call('incr',KEYS[1])

if times == 1 then
 redis.call('expire',KEYS[1],ARGV[1])
end

if times > tonumber(ARGV[2]) then
 return 0
end
return 1

在redis客戶端機器上,如何測試這個指令碼呢?如下:

redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1,10 3

--eval引數是告訴redis-cli讀取並執行後面的Lua指令碼,ratelimiting.lua是指令碼的位置,後面跟著是傳給Lua指令碼的引數。其中","前的rate.limiting:127.0.0.1是要操作的鍵,可以再指令碼中用KEYS[1]獲取,","後面的10和3是引數,在指令碼中能夠使用ARGV[1]和ARGV[2]獲得。注:","兩邊的空格不能省略,否則會出錯

結合指令碼的內容可知這行命令的作用是將訪問頻率限制為每10秒最多3次,所以在終端中不斷的執行此命令會發現當訪問頻率在10秒內小於或等於3次時返回1,否則返回0。

測試執行如下:

[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1,10 3
(integer) 1
[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1,10 3
(integer) 0
[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1,10 3
(integer) 0

補充:

現在Lua指令碼用在很多遊戲上,主要是Lua指令碼做到可以嵌入到其他程式中執行,遊戲升級的時候,可以直接升級指令碼,而不用重新安裝遊戲。比如遊戲的很多關卡,只需要增加lua指令碼,在遊戲中嵌入Lua直譯器,遊戲團隊線上更新Lua指令碼,然後遊戲自動下載最新的遊戲關卡。例如之前很多的遊戲《憤怒的小鳥》就是用Lua語言實現的關卡。

摘自《Redis入門指南》

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。