標籤:

Redis Lua腳本

記得上半年讀書,看到Lua腳本的時候就跳過了。因為項目用不到,也因為自己技術視野不夠寬闊。後來看到一篇介紹秒殺技術的文章,利用Lua腳本保證原子性,這才引起自己的重視。

Redis單個命令都是原子操作,如果想讓多個命令聚合成一個原子操作怎麼辦呢?

1)事務

2)Lua腳本

Redis內部內嵌了Lua環境(包含解釋器),在啟動時會對Lua環境執行一系列修改,從而確保其滿足redis在功能性和安全性的需求。

執行Lua腳本命令有:EVAL 和 EVALSHA。

EVAL script numkeys key [key ...] arg [arg ...]

> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second1) "key1"2) "key2"3) "first"4) "second"

在 Lua 腳本中,可以使用兩個不同函數來執行 Redis 命令,它們分別是:

  • redis.call()
  • redis.pcall()

這兩個函數的唯一區別在於它們使用不同的方式處理執行命令所產生的錯誤。

redis會創建一個lua_scripts字典,key是Lua腳本的SHA1校驗和(checksum),value是SHA1校驗和對應的Lua腳本。

EVALSHA sha1 numkeys key [key ...] arg [arg ...]

> set foo barOK> eval "return redis.call(get,foo)" 0"bar"> evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0"bar"

使用EVALSHA可以減小傳播的數據,減小帶寬的損耗

主伺服器複製eval命令和複製其他redis命令一樣,都是把相同的命令直接傳播給從伺服器

Redis 提供了以下幾個 SCRIPT 命令,用於對腳本子系統(scripting subsystem)進行控制:

  • SCRIPT FLUSH :清除所有腳本緩存
  • SCRIPT EXISTS :根據給定的腳本校驗和,檢查指定的腳本是否存在於腳本緩存
  • SCRIPT LOAD :將一個腳本裝入腳本緩存,但並不立即運行它
  • SCRIPT KILL :殺死當前正在運行的腳本

參考資料:

《Redis設計與實現》

EVAL - Redis 命令參考

推薦閱讀:

15位阿里Redis、MongoDB、HBase大咖直播分享,全方位解析資料庫技術!
redis是個單線程的程序,為什麼會這麼快呢?每秒10000?這個有點不解,具體是快在哪裡呢?EPOLL?內存?
消息隊列ActiveMQ的使用詳解
redis的安裝和分散式配置簡潔教程
Spring Boot使用Redis進行消息的發布訂閱

TAG:Redis |