redis命令之-script指令碼學習
script
新增到指令碼快取中,但並不立即執行這個指令碼"5332031c6b470dc5a0dd9b4bf2030dea6d65de91" ----SHA1 校驗和
127.0.0.1:6379> script exists "5332031c6b470dc5a0dd9b4bf2030dea6d65de91" ---檢查有沒有被快取
1) (integer) 1
127.0.0.1:6379> evalsha 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0 ----EVALSHA 命令,可以使用指令碼的 SHA1 校驗和來呼叫這個指令碼
"hello world"
127.0.0.1:6379> script flush ---清空快取
OK
127.0.0.1:6379> script exists "5332031c6b470dc5a0dd9b4bf2030dea6d65de91"
1) (integer) 0
EVAL script numkeys key [key ...] arg [arg ...] ---EVAL 命令也會將指令碼新增到指令碼快取中,但是它會立即對輸入的指令碼進行求值。
從 Redis 2.6.0 版本開始,透過內建的 Lua 直譯器,可以使用 EVAL 命令對 Lua 指令碼進行求值。
script
引數是一段 Lua 5.1 指令碼程式,它會被執行在 Redis 伺服器上下文中,這段指令碼不必(也不應該)定義為一個 Lua 函式。
numkeys
引數用於指定鍵名引數的個數。
鍵名引數 key [key ...]
從 EVAL 的第三個引數開始算起,表示在指令碼中所用到的那些 Redis 鍵(key),這些鍵名引數可以在 Lua 中透過全域性變數 KEYS
陣列,用 1
為基址的形式訪問( KEYS[1]
, KEYS[2]
,以此類推)。
在命令的最後,那些不是鍵名引數的附加引數 arg [arg ...]
,可以在 Lua 中透過全域性變數 ARGV
陣列訪問,訪問的形式和 KEYS
變數類似(ARGV[1]
、 ARGV[2]
,諸如此類)。
127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
其中
"return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"
是被求值的 Lua 指令碼,數字 2
指定了鍵名引數的數量, key1
和 key2
是鍵名引數,分別使用 KEYS[1]
和 KEYS[2]
訪問,而最後的 first
和 second
則是附加引數,可以透過 ARGV[1]
和 ARGV[2]
訪問它們。在 Lua 指令碼中,可以使用兩個不同函式來執行 Redis 命令,它們分別是:
-
redis.call()
-
redis.pcall() -----用來呼叫redis命令
這兩個函式的唯一區別在於它們使用不同的方式處理執行命令所產生的錯誤,在後面的『錯誤處理』部分會講到這一點。
redis.call()
和 redis.pcall()
兩個函式的引數可以是任何格式良好(well formed)的 Redis 命令:
"barbarbarbar"
127.0.0.1:6379> eval "return redis.call('get',KEYS[1])" 1 foo ---等價,引數模式
"barbarbarbar"
127.0.0.1:6379> eval "return redis.call('append','foo','ONLYU')" 0 ---呼叫redis的append命令,,,其他什麼的命令都可以
(integer) 17
127.0.0.1:6379> eval "return redis.call('get','foo')" 0
"barbarbarbarONLYU"
如:127.0.0.1:6379> eval "return redis.call('expire','foo','200')" 0 ----如:expire,其它命令跟著套
(integer) 1
127.0.0.1:6379> eval "return redis.call('persist','foo')" 0
(integer) 1
還可以透過scipt load來載入
127.0.0.1:6379> script load "return redis.call('get','foo')" --將指令碼
script
新增到指令碼快取中,但並不立即執行這個指令碼"6b1bf486c81ceb7edf3c093f4c48582e38c0e791" ----SHA1 校驗
127.0.0.1:6379> evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0 ---EVALSHA 命令,可以使用指令碼的 SHA1 校驗和來呼叫這個指令碼
"barbarbarbarONLYU"
===================eval與script load的區別:eval是立刻執行指令碼進行求值,而load需要再呼叫evalsha來求值===============
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-1793640/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- shell和bash指令碼命令學習指令碼
- redis學習(九) redis事務和redis指令碼的比較Redis指令碼
- Linux命令和shell指令碼學習Linux指令碼
- redis學習——基礎指令Redis
- redis原始碼分析(六)、redis命令學習總結—Redis 集合(Set)Redis原始碼
- redis原始碼學習之slowlogRedis原始碼
- Elsa V3學習之指令碼指令碼
- Redis 學習筆記命令Redis筆記
- redis原始碼分析(三)redis命令學習總結—string字串Redis原始碼字串
- redis原始碼分析(五)、redis命令學習總結—雜湊HashRedis原始碼
- redis原始碼分析(七)、redis命令學習總結—Redis 有序集合(sorted set)Redis原始碼
- 指令碼學習指令碼
- aix命令之_capture 和 scriptAIAPT
- redis原始碼分析(四)、redis命令學習總結—連結串列ListRedis原始碼
- redis原始碼學習之工作流程初探Redis原始碼
- redis原始碼學習之lua執行原理Redis原始碼
- Per指令碼學習指令碼
- ASM 學習 指令碼ASM指令碼
- redis原始碼學習Redis原始碼
- 【Redis學習筆記】2018-07-11 Redis指令學習5Redis筆記
- 【Redis學習筆記】2018-07-10 Redis指令學習3Redis筆記
- 常用指令碼學習手冊——Bat指令碼指令碼BAT
- Redis學習手冊(Key操作命令)Redis
- C#指令碼引擎CS-ScriptC#指令碼
- Bootstrap 之 Metronic 模板的學習之路 – (4)原始碼分析之指令碼部分boot原始碼指令碼
- 在Redis-Sentinel的client-reconfig-script指令碼中設定VIPRedisclient指令碼
- Redis學習筆記(三)使用Lua指令碼實現分散式鎖Redis筆記指令碼分散式
- 《Shell指令碼學習指南》學習筆記指令碼筆記
- Redis學習之管道機制Redis
- Redis - Lua 指令碼Redis指令碼
- Redis的指令碼Redis指令碼
- Linux篇一:經典指令碼scriptLinux指令碼
- TCL學習之info命令
- Redis基礎知識(學習筆記21--Lua 指令碼語言)Redis筆記指令碼
- Shell指令碼學習筆記指令碼筆記
- 學習Ant編譯指令碼編譯指令碼
- awk指令碼學習小結指令碼
- Redis原始碼學習——基礎資料結構之SDSRedis原始碼資料結構