亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在 Redis 實現 Lua 腳本事務

為什么在 Redis 實現 Lua 腳本事務

鳳凰求蠱 2019-03-13 11:09:05
為什么在 Redis 實現 Lua 腳本事務
查看完整描述

2 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

數據完整性

從很多方面來看,Redis 很像當初采用 InnoDB 前的 MySQL。而 Redis 采用了一種很合理的方式來保證數據完整性(復制,AOF 等),并且從 Redis2.6 開始引入的 Lua 腳本在功能與易用性方面為 Redis 的成長提供了很大助力。

相對來說,Lua 腳本與其他數據庫中的存儲過程很相似,但腳本的執行有些許不同。在本文中最重要的一點就是一旦將腳本寫入數據庫,它會一直執行直到以下任一種情況出現:

1. 完成所有工作,所有寫操作處理完成后腳本會自動退出。

2. 腳本運行時出錯并中途退出,所有以前執行的寫操作都已發生,但不會再有其他寫操作。

3. Redis 通過 SHUTDOWN NOSAVE 關閉時(不保存)。

4. 你附加了調試器來“使”腳本完成 #1 與 #2 (或其他手段來保證不會丟失數據)。

對于使用數據庫開發軟件的人,我想你也認同只有情景 #1 是最理想的。情景 #2,#3,#4 都會導致數據異常(#2 與
#4)和/或數據丟失(#3 和 #4)。如果你很重視數據,你應該盡可能地阻止數據異常與丟失。這不是哲學,而是工作(This is not
philosophy, this is doing your job)。但很遺憾目前的 Redis 也幫不了你多少。所以我決定改變這種情況。

查看完整回答
反對 回復 2019-03-22
?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊


MySQL 與 Postgres
在 1998-2003 年間,如果你想運行一個正規的數據庫驅動的網站/服務,但又沒有足夠的資金購買微軟或 Oracle 的數據庫,你可以選擇 MySQL 或 Postgres 。很多人都選擇了 MySQL,因為它速度較快——主要是因為 MyISAM 存儲引擎沒有提供事務功能以此來換取性能,但速度確實很快。另一些人轉向 Postgres,因為雖然在相同硬件上其性能明顯低于 MySQL,但 Postgres 不會丟失數據(說實話,MySQL 數據丟失的情況非常少見,但丟了可不是鬧著玩的)。
就這樣湊合著過了很久;MySQL 將其默認的存儲引擎從 MyISAM 過渡到了 InnoDB (其實很早就有了),這樣它的存儲引擎也得到了完整的事務支持和其他功能。與此同時,Postgres 也變快了,并添加了一個持續擴展的功能列表來使自己與眾不同?,F在對于 MySQL 與 Postgres 的選擇只看個人的體驗與偏好,除了有時業務需要或領導決定使用其他選擇。
數據完整性
從很多方面來看,Redis 很像當初采用 InnoDB 前的 MySQL。而 Redis 采用了一種很合理的方式來保證數據完整性(復制,AOF 等),并且從 Redis2.6 開始引入的 Lua 腳本在功能與易用性方面為 Redis 的成長提供了很大助力。
相對來說,Lua 腳本與其他數據庫中的存儲過程很相似,但腳本的執行有些許不同。在本文中最重要的一點就是一旦將腳本寫入數據庫,它會一直執行直到以下任一種情況出現:
1. 完成所有工作,所有寫操作處理完成后腳本會自動退出。
2. 腳本運行時出錯并中途退出,所有以前執行的寫操作都已發生,但不會再有其他寫操作。
3. Redis 通過 SHUTDOWN NOSAVE 關閉時(不保存)。
4. 你附加了調試器來“使”腳本完成 #1 與 #2 (或其他手段來保證不會丟失數據)。
對于使用數據庫開發軟件的人,我想你也認同只有情景 #1 是最理想的。情景 #2,#3,#4 都會導致數據異常(#2 與 #4)和/或數據丟失(#3 和 #4)。如果你很重視數據,你應該盡可能地阻止數據異常與丟失。這不是哲學,而是工作(This is not philosophy, this is doing your job)。但很遺憾目前的 Redis 也幫不了你多少。所以我決定改變這種情況。
實現 Lua 腳本事務
我嘗試解決上面列表中的 #2,#3,#4 問題,最終像下面這樣:
腳本完成所有的工作,處理完寫操作后正常退出
腳本執行過程中遇到錯誤退出,不更改任何數據(所有寫操作都回滾)
無論有沒有寫入數據,都不會有數據丟失。這應該是所有的數據庫都希望做到的,我打算把這個加到 Redis 中,因為我們都希望 Redis有 這個功能。
目前的 pull request 只是一個概念性的證明。也就是說,為了避免數據丟失,你要么 a) 顯式使用事務的變體運行腳本,要么 b) 強制所有 Lua 腳本調用帶配置選項的事務語義。
還有很多的辦法使現在這個 patch 變得更好,我希望能得到 Salvatore (Redisw 作者)和其他社區的幫助。



查看完整回答
反對 回復 2019-03-22
  • 2 回答
  • 0 關注
  • 897 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號