Redis執行Lua腳本示例

Redis在2.6推出了腳本功能,允許開發者使用Lua語言編寫腳本傳到Redis中執行。使用腳本的好處如下:

1.減少網絡開銷:本來5次網絡請求的操作,可以用一個請求完成,原先5次請求的邏輯放在redis服務器上完成。使用腳本,減少了網絡往返時延。
2.原子操作:Redis會將整個腳本作爲一個整體執行,中間不會被其他命令插入。
3.複用:客戶端發送的腳本會永久存儲在Redis中,意味着其他客戶端可以複用這一腳本而不需要使用代碼完成同樣的邏輯。

實現一個訪問頻率控制,某個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) 1
[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語言實現的關卡。

https://www.cnblogs.com/yanghuahui/p/3697996.html

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章