Redis 事務閱讀簡記

注:文章大部分摘自《Redis開發與運維》 部分內容源自自己理解,請讀者 “按需獲取” 

一、事務相關概念介紹
    
    1、數據庫事務定義:
        數據庫事務(Database Transaction) ,是指作爲單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。
        事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。
        通過將一組相關操作組合爲一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。
        一個邏輯工作單元要成爲事務,必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。
        事務是數據庫運行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。
    
    2、ACID定義:
        ACID,指數據庫事務正確執行的四個基本要素的縮寫。
        包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。
        一個支持事務(Transaction)的數據庫,必須要具有這四種特性,否則在事務過程(Transaction processing)
        當中無法保證數據的正確性,交易過程極可能達不到交易方的要求。
    
    3、Redis對事務的支持定義:
        爲了保證多條命令組合的原子性,Redis提供了“簡單的事務功能”
        之所以說它簡單,主要是因爲它不支持事務中的回滾特性,同時無法實現命令之間的邏輯關係計算
        
二、Redis對事務的支持
    
    1、Redis2.6以前:Redis通過提供multi、exec、discard等原生命令來支持簡單事務操作
    
    2、Redis2.6以後:Redis提供了Lua腳本插件,通過Lua腳本同樣可以實現“事務”的相關功能(一次Lua腳本的執行在Redis服務端是一次原子操作)
    
    3、Redis在Lua腳本的“協助”下,通過客戶端自己編寫Lua腳本、組織邏輯,可以做到完全的事物(需要客戶端自己實現)
    
三、Lua腳本在Redis中的作用

    1、拓展Redis命令,幫助開發者定製自己的Redis命令
    
    2、“順帶”提供客戶自己實現“事務”的途徑(注:此處並不是Redis提供事物支持)
    
    
四、Redis與Lua

    在Redis中執行Lua腳本有兩種方法:eval和evalsha
    
    1、eval命令:Redis提供eval命令來執行Lua腳本內容,每次執行時Redis客戶端會把腳本作爲字符串發送給服務端,服務端會將執行結果返回給客戶端
    
    2、evalsha命令:Redis還提供evalsha命令來執行Lua腳本。該命令執行時,Redis客戶端首先要將Lua腳本加載到Redis服務端,得到該腳本的SHA1校驗和,evalsha命令使用SHA1作爲參數可以直接執行對應Lua腳本,避免每次發送Lua腳本的開銷。這樣客戶端就不需要每次執行腳本內容,而腳本也會常駐在服務端,腳本功能得到了複用。

五、Lua腳本保證Redis服務端事務操作的侷限性

    1、由於每次腳本執行都只能將腳本命令發送到一個Redis Server(即一個Redis Node)上,所以當對集羣操作時,一次Lua腳本需要保證裏面的key都在一個Node上,
        當key分散在不同的node上時,Lua腳本即會執行失敗。(該點可以通過增加hash_tag解決掉)
        
    2、使用Lua腳本實現的事務,需要客戶端自行設計、編碼

六、Lua腳本功能爲Redis開發和運維人員帶來的好處:

    1、Lua腳本在Redis中是原子執行的,執行過程中間不會插入其他命令。
    
    2、Lua腳本可以幫助開發和運維人員創造出自己定製的命令,並可以將這些命令常駐在Redis內存中,實現複用的效果。
    
    3、Lua腳本可以將多條命令一次性打包,有效地減少網絡開銷。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章