1.1 EVAL script numkeys key [key ...] arg [arg ...] html
numkeys 是key的個數,後邊接着寫key1 key2... val1 val2....,舉例
redis
127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 val1 val2 1) "key1" 2) "key2" 3) "val1" 4) "val2"
1.2 SCRIPT LOAD script 編程
把腳本加載到腳本緩存中,返回SHA1校驗和。但不會立馬執行,舉例緩存
127.0.0.1:6379> SCRIPT LOAD "return 'hello world'" "5332031c6b470dc5a0dd9b4bf2030dea6d65de91"
1.3 EVALSHA sha1 numkeys key [key ...] arg [arg ...] 安全
根據緩存碼執行腳本內容。舉例網絡
127.0.0.1:6379> SCRIPT LOAD "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" "a42059b356c875f0717db19a51f6aaca9ae659ea" 127.0.0.1:6379> EVALSHA "a42059b356c875f0717db19a51f6aaca9ae659ea" 2 key1 key2 val1 val2 1) "key1" 2) "key2" 3) "val1" 4) "val2"
1.4 SCRIPT EXISTS script [script ...] dom
經過sha1校驗和判斷腳本是否在緩存中編程語言
1.5 SCRIPT FLUSH 函數
清空緩存lua
127.0.0.1:6379> SCRIPT LOAD "return 'hello jihite'" "3a43944275256411df941bdb76737e71412946fd" 127.0.0.1:6379> SCRIPT EXISTS "3a43944275256411df941bdb76737e71412946fd" 1) (integer) 1 127.0.0.1:6379> SCRIPT FLUSH OK 127.0.0.1:6379> SCRIPT EXISTS "3a43944275256411df941bdb76737e71412946fd" 1) (integer) 0
1.6 SCRIPT KILL
殺死目前正在執行的腳本
減小網絡開銷:多個請求經過腳本一次發送,減小網絡延遲
原子操做:將腳本做爲一個總體執行,中間不會插入其餘命令,無需使用事務
複用:客戶端發送的腳本永久存在redis中,其餘客戶端能夠複用腳本
可嵌入性:可嵌入JAVA,C#等多種編程語言,支持不一樣操做系統跨平臺交互
直接在redis-cli中直接寫lua腳本,這樣很是不方便編輯,一般狀況下咱們都是把lua script放到一個lua文件中,而後執行這個lua腳本,
示例:活躍用戶判斷:判斷一個遊戲用戶是否屬於活躍用戶,若是符合標準,則活躍用戶人數+1
if redis.call("EXISTS",KEYS[1]) == 1 then return redis.call("INCRBY",KEYS[1],ARGV[1]) else return nil end
存儲位置:
/Users/jihite/activeuser.lua
執行
$ redis-cli --eval /Users/jihite/activeuser.lua user , 1 (integer) 1 127.0.0.1:6379> get user "1" 127.0.0.1:6379> exit $ redis-cli --eval /Users/jihite/activeuser.lua user , 1 (integer) 2 $ redis-cli 127.0.0.1:6379> get user "2" 127.0.0.1:6379> exit $ redis-cli --eval /Users/jihite/activeuser.lua user , 4 (integer) 6
如生成隨機數這一命令,若是在master上執行完後,再在slave上執行會不同,這就破壞了主從節點的一致性
爲了解決這個問題, Redis 對 Lua 環境所能執行的腳本作了一個嚴格的限制 —— 全部腳本都必須是無反作用的純函數(pure function)。全部剛纔說的那種狀況壓根不存在。Redis 對 Lua 環境作了一些列相應的措施:
math
表原有的 math.random 函數和 math.randomseed 函數,新的函數具備這樣的性質:每次執行 Lua 腳本時,除非顯式地調用 math.randomseed
,不然 math.random
生成的僞隨機數序列老是相同的。https://www.runoob.com/redis/redis-scripting.html (基本使用)
https://www.cnblogs.com/Don/articles/5731856.html (實例)
http://www.javashuo.com/article/p-hrpnzniu-kh.html
https://redisbook.readthedocs.io/en/latest/feature/scripting.html#lua (安全性)