redis命令之-script指令碼學習

小亮520cl發表於2015-09-07
127.0.0.1:6379> script load "return 'hello world'"      -----將指令碼 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 命令:

> eval "return redis.call('set','foo','bar')" 0
OK
> eval "return redis.call('set',KEYS[1],'bar')" 1 foo              ---與上面的等價,只不過是引數模式
OK
127.0.0.1:6379> eval "return redis.call('get','foo')" 0
"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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章