Redis使用lua腳本


官方文檔地址:http://redis.cn/commands/eval.html

 

Redis中使用命令調用lua腳本是通過命令EVAL;

比如:

這里返回的是nil是應為redis沒有檢測到lua的返回值,這里稍作修改:

   

可以查看他的語法如下:

   

主要參數是:script numkeys,keys[],arg[]

  numkeys:是規定我們之后傳入參數的第幾個參數是我們的一些key,剩余的都會傳遞到ARGV中,

  eg:EVAL "return redis.call('SET',KEYS[1],ARGV[2])" 3  zl1 zl2 zl3 v1 v2 v3 v4     這里是zl1-4是傳遞給keys中,后面是傳給argv;

    這里獲取到zl1對應的值是v2,這句意思即是:numkeys等於3,表明zl1--v4中,zl1,zl2,zl3是key的數據,v1,v2,v3,v4是value的數據,KEYS[1]獲取到的是zl1,ARFV[2]獲取到的是v2;

    是用redis.pcall可以捕獲lua中的異常 

 

LUA中的數據類型和Redis中轉換:

Lua 類型和 Redis 類型之間存在着一一對應的轉換關系。

Redis 到 Lua 的轉換表。

  • Redis integer reply -> Lua number / Redis 整數轉換成 Lua 數字
  • Redis bulk reply -> Lua string / Redis bulk 回復轉換成 Lua 字符串
  • Redis multi bulk reply -> Lua table (may have other Redis data types nested) / Redis 多條 bulk 回復轉換成 Lua 表,表內可能有其他別的 Redis 數據類型
  • Redis status reply -> Lua table with a single ok field containing the status / Redis 狀態回復轉換成 Lua 表,表內的 ok 域包含了狀態信息
  • Redis error reply -> Lua table with a single err field containing the error / Redis 錯誤回復轉換成 Lua 表,表內的 err 域包含了錯誤信息
  • Redis Nil bulk reply and Nil multi bulk reply -> Lua false boolean type / Redis 的 Nil 回復和 Nil 多條回復轉換成 Lua 的布爾值 false

Lua 到 Redis 的轉換表。

  • Lua number -> Redis integer reply (the number is converted into an integer) / Lua 數字轉換成 Redis 整數
  • Lua string -> Redis bulk reply / Lua 字符串轉換成 Redis bulk 回復
  • Lua table (array) -> Redis multi bulk reply (truncated to the first nil inside the Lua array if any) / Lua 表(數組)轉換成 Redis 多條 bulk 回復
  • Lua table with a single ok field -> Redis status reply / 一個帶單個 ok 域的 Lua 表,轉換成 Redis 狀態回復
  • Lua table with a single err field -> Redis error reply / 一個帶單個 err 域的 Lua 表,轉換成 Redis 錯誤回復
  • Lua boolean false -> Redis Nil bulk reply. / Lua 的布爾值 false 轉換成 Redis 的 Nil bulk 回復

從 Lua 轉換到 Redis 有一條額外的規則,這條規則沒有和它對應的從 Redis 轉換到 Lua 的規則:

  • Lua boolean true -> Redis integer reply with value of 1. / Lua 布爾值 true 轉換成 Redis 整數回復中的 1

還有下面兩點需要重點注意:

  • lua中整數和浮點數之間沒有什么區別。因此,我們始終Lua的數字轉換成整數的回復,這樣將舍去小數部分。如果你想從Lua返回一個浮點數,你應該將它作為一個字符串(見比如ZSCORE命令)。
  • There is no simple way to have nils inside Lua arrays, this is a result of Lua table semantics, so when Redis converts a Lua array into Redis protocol the conversion is stopped if a nil is encountered.

Redis中使用Lua腳本的相關命令介紹

  可以將lua腳本緩存到redis中,調用的是時候直接調用即可;

  Redis中緩存腳本使用:SCRIPT LOAD  “腳本”

    eg: 

    這里的返回值是對應的字符串的一個加密值

    

    緩存之后的腳本調用: EVALSHA  cf63a54c34e159e75e5a3fe4794bb2ea636ee005 

     

    使用命令:SCRIPT FLUSH 刪除redis中的所有的lua腳本;

         SCRIPT KILL 殺死正在執行的lua腳本

         SCRIPT EXISTS  cf63a54c34e159e75e5a3fe4794bb2ea636ee005      -->返回1表示該腳本存在,否則不存在

 

 

 

由於redis是單線程執行的,所有在執行lua腳本的時候可以保證該操作的原子性;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM