redis也提供事務機制來滿足acid性質。
事務的整個過程會經歷三個階段:
事務開始
multi命令標誌著事務的開始。
命令入隊
如果客戶端傳送的是exec discard watch multi四個命令,那麼就會立即執行,其他的命令只會放入事務佇列中等待執行。
事務執行
當伺服器接收到了exec命令之後,將被伺服器立即執行,伺服器會遍歷這個客戶端的事務佇列,執行所有儲存的命令,最後將所得的結果都返回給客戶端。
watch命令是乙個樂觀鎖,它可以在exec命令執行之前,監視任意數量的資料庫鍵,檢查被監視的鍵是否至少有乙個已經被修改過了,如果是的花,伺服器將拒絕執行事務,並向客戶端返回事務失敗的回覆。
watch監視機制
redis通過乙個字典資料結構標記每個被監視的鍵,鍵對應的值就是監視的客戶端序號,如發生資料該錶,相應的客戶端的標誌將會被置位,表示事務的安全性已經被破壞了。在之後的exec命令執行之前,就會查詢這個字典,確定事務安全。
對於redis事務功能,事務佇列中的命令要麼都執行,要麼都不執行,這就體現了其原子性。
不同於傳統的關係型資料庫,redis不支援事務回滾機制,如果事務佇列的執行中發生了錯誤,整個事務還是會繼續執行。這樣設計的原因是,回滾機制太複雜,這種錯誤一般都是後台程式的問題,也只會出現來開發的環境中,實際的生產環境中很少出現,所以沒必要。
一致性就是指在事務執行前後資料也是保持一致的。
redis通過錯誤檢測和簡單的設計保證事務的一致性。
入隊錯誤
在事務命令入隊的過程中,發現命令有問題,就會不執行這個事務。
執行錯誤
在實際執行過程中,發生了錯誤,伺服器不會中斷事務的執行。這種錯誤不會對資料庫產生修改,也就不會影響一致性。
伺服器停機
如果在執行事務的過程中停機,那麼會伺服器所使用的持久化模式,保持資料的一致。
redis採用單執行緒的方式來執行事務,並且伺服器保證事務執行期間不會被中斷,事務總是以序列的方式執行,所以是具有隔離性的。
redis的rdb和aof就滿足了永續性的要求。
Redis設計與實現(四)
typedef struct intestintest那麼在整數集合怎麼保證它的有序性?它根據的是陣列的插入排序,先確定好位置,然後插進去,後邊的元素後移。在整數集合中可以儲存int 16,int 32,int 64的整數 那在整數集合中怎樣處理這幾種整數型別之間的關係呢?假設陣列中的最大值為x。那...
Redis 設計與實現 (七) 事務
事務 acid,指資料庫事務正確執行的四個基本要素的縮寫。包含 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability redis 通過multi exec watch 實現事務 一 事務開始 mulit mulit 標誌事務開始,將客戶...
Redis設計與實現 四 跳躍表
跳躍表是乙個有序的資料結構,跳躍是通過在當前節點儲存多個其他節點的指標,來達到跳躍的目的。它支援平均o logn 最差o n 複雜度的節點查詢,還可以通過順序性來批量處理節點。在大部分情況下,跳躍表的效率和平衡樹是一樣的,但是邏輯上比平衡樹更加簡單。redis通過跳躍表實現有序集合鍵的底層實現之一。...