1. 程式人生 > >redis事物特性

redis事物特性

Redis的事務特性

資料ACID特性滿足了幾條?
為了保持簡單,redis事務保證了其中的一致性和隔離性;
不滿足原子性和永續性;

原子性

redis事務在執行的中途遇到錯誤,不會回滾,而是繼續執行後續命令;(違反原子性)

事務可以理解為一個打包的批量執行指令碼,但批量指令並非原子化的操作;
中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成後續的指令不做;
比如:

redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK

如果在set b bbb處失敗,set a已成功不會回滾,set c還會繼續執行;

永續性

事務不過是用佇列包裹起了一組 Redis 命令,並沒有提供任何額外的永續性功能,所以事務的永續性由 Redis 所使用的持久化模式決定:

  • 在單純的記憶體模式下,事務肯定是不持久的。
  • 在 RDB 模式下,伺服器可能在事務執行之後、RDB 檔案更新之前的這段時間失敗,所以 RDB 模式下的 Redis 事務也是不持久的。
  • 在 AOF 的“總是 SYNC ”模式下,事務的每條命令在執行成功之後,都會立即呼叫 fsync 或 fdatasync 將事務資料寫入到 AOF 檔案。但是,這種儲存是由後臺執行緒進行的,主執行緒不會阻塞直到儲存成功,所以從命令執行成功到資料儲存到硬碟之間,還是有一段非常小的間隔,所以這種模式 下的事務也是不持久的。
  • 其他 AOF 模式也和“總是 SYNC ”模式類似,所以它們都是不持久的。

隔離性和一致性

redis事務在執行的過程中,不會處理其它命令,而是等所有命令都執行完後,再處理其它命令(滿足隔離性)
redis事務在執行過程中發生錯誤或程序被終結,都能保證資料的一致性;(詳見參考資料1)

redis事務的缺陷

除了不保證原子性和永續性,在實際使用中還有以下問題:

1) 遇到有查詢的情況穿插在事務中間,不會返回結果;
設定事務開始標誌後,所有的命令都是queued,即使是查詢指令;
如果後續的更新操作需要依賴於前面的查詢指令,那redis事務就無法有效的完成任務;
例如:

redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> get b
QUEUED
業務邏輯...
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) bbb
3) OK

第二步 get a 返回的是queued,並不是a的查詢結果,
如果後續的set操作依賴於get的結果(存在依賴業務邏輯),就不能將get操作放在事務操作中;

2) 事務中的每條命令都與redis伺服器進行了一次網路互動;
redis 事務指定開始後,執行一個事務返回的都是queued,那這個入隊操作是在客戶端實現,還是在伺服器端實現的?
檢視原始碼,很容易發現是在伺服器端實現;
在Redis.c中有這麼一段:

int processCommand(redisClient *c) {
...
    /* Exec the command */
    if (c->flags & REDIS_MULTI &&
        c->cmd->proc != execCommand && c->cmd->proc != discardCommand &&
        c->cmd->proc != multiCommand && c->cmd->proc != watchCommand)
    {
        queueMultiCommand(c); // 將事務中的命令都放入到佇列中,然後返回"QUEUED"
        addReply(c,shared.queued);
    } else {
        if (server.vm_enabled && server.vm_max_threads > 0 &&
            blockClientOnSwappedKeys(c)) return REDIS_ERR;

        //呼叫該命令函式來處理命令
        call(c);
    }
    return REDIS_OK;
}

這裡就涉及到客戶端與伺服器端的多次互動,明明是需要一次批量執行的n條命令,還需要通過多次網路互動,有些浪費;

更新操作中的查詢實現

如果有這樣的需求:在事務開始後,中間穿插有查詢邏輯;
那麼使用redis事務(單庫),無法滿足這個要求;

可能的解決方案:

  1. 可以考慮使用多個庫,讀寫分離,查詢庫只用來查詢,更新庫用來開事務做寫操作;

  2. 不再使用redis的事務指令,自己在客戶端將待執行的命令批量打包,決定是否回滾還是全部執行;這樣可以在更新的間隙執行查詢邏輯;而不需要將查詢邏輯提前到事務指令multi之前;

  3. 將查詢業務邏輯提前;嚴格規範程式碼編寫要求,所有的redis查詢邏輯都放在事務之外:

     redis 127.0.0.1:7000> get b
     bbb
     業務邏輯...
     redis 127.0.0.1:7000> multi
     OK
     redis 127.0.0.1:7000> set a aaa
     QUEUED
     redis 127.0.0.1:7000> set c ccc
     QUEUED
     redis 127.0.0.1:7000> exec
     1) OK
     2) OK

優化網路特性

將多個命令打包批量傳送到redis伺服器執行,減少網路互動,優化效能,可能的解決方案:

  1. 對於所有的get/set操作,可使用現有的mget/mset指令;
  2. 對於各種不同型別的更新操作,可使用lua指令碼將命令打包後,傳送到伺服器端一次執行;

相關推薦

redis事物特性

Redis的事務特性 資料ACID特性滿足了幾條? 為了保持簡單,redis事務保證了其中的一致性和隔離性; 不滿足原子性和永續性; 原子性 redis事務在執行的中途遇到錯誤,不會回滾,而是繼續執行後續命令;(違反原子性) 事務可以理解為一個打包的批量執行指令碼,但批量指令並非原子化的操作; 中間某條指令

Redis 事物

解釋 批量 ren card ans 成功 是否 用法 基本 MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事務的基礎。 Multi 和 Exec Multi:開啟一個事務,它總是返回 OK 。執行之後, 客戶端可以繼續向服務器發送任意多條

Redis學習(8)-redis其他特性

font 提前 redis學習 清空 exec 自己 mysql數據庫 data 批量執行 消息訂閱與發布 subscribe  Channel:訂閱頻道 psubscribe  channel*:批量訂閱頻道:例如:psubscribe  S*,訂閱以S開頭的頻道。 pu

1.Redis事物

的人 ember 序號 edi tro net 描述 aud table   1.事物(有的人叫做原子操作)的概念應該不用我多說了吧。做軟件開發這一行的人應該都知道。就是多條命令,要麽全部按順序執行,只要中間出錯就會進行數據回滾。   操作示例:   先以 MULTI

05-redis事物

分享圖片 開始 image jpg 其他 redis事物 ima 執行 分享 可以一次性執行多個命令,本質是一組命令的集合,一個事物中的所有命令都會序列化,按順序的串行化執行而不會被其他命令插入,不許加塞。 一個列隊中,一次性、順序性、排他性的執行一系列命令 。

Redis八大特性

引言:Redis現在是越來越火了,因為它不僅有良好的讀寫效能,而且還可以用作分散式、高併發,我們一起來看看這個大佬都有什麼特性。 特性一,速度極快。官方給出的資料是 10 萬次 ops 的讀寫,這主要歸功於這些資料都存在於記憶體中,這也是區別於其他關係型資料庫的一點。由於 Redis 是開源的,

Redis常用特性

釋出訂閱 ·伺服器狀態在pubsub_channels字典儲存了所有頻道的訂閱關係:SUBSCRIBE命令負責將客戶端和被訂閱的頻道關聯到這個字典裡面,而UNSUBSCRIBE命令則負責解除客戶端和被退訂頻道之間的關聯。 ·伺服器狀態在pubsub_patterns連結串列儲存了所有模式的訂閱關係:PSU

Redis事物特點和持久化方式

Redis的事物不支援完整的ACID,Redis雖然提供事物功能,但是Redis的事物和關係資料庫事務不可同日而語,Redis的事物只能保證隔離性和一致性(I和C),無法保證原子性和永續性(A和D),具體實現原理如下: 原子性         &

Redis 高階特性

Redis 資料結構 Redis 常用的資料型別主要有以下五種: String Hash List Set Sorted set Redis 內部使用一個 redisObject 物件來表示所有的 key 和 value。   String

Redis - 事物

redis事物控制 關於事物     事物(資料庫事物)是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行 redis事物與mysql事物的不同     1.與mysql等資料庫不同,redis事物不提供回滾操作。

Redis事物

隔離級別 過程 edi exe 讀取 car 操作數 不能 開始 redis事物定義:   》Redis事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。   》Redis事務的主要作用就是串聯多

3、Redis 叢集特性之容錯、資料遷移

前言: 該篇中主要講解一下redis的容錯以及資料的遷移(橫向拓展) redis 叢集資訊 在前面章節中講到將Node加入到cluster以後列印瞭如下日誌: [[email protected] src]# ./redis-trib.rb create --

十一 Redis 事物

事務 Redis 的事務功能允許使用者將多個命令包裹起來,然後一次性地、按 順序地執行被包裹的所有命令。 在事務執行的過程中,伺服器不會中斷事務而改去執行其他命令請求,只有在事務包裹的所有命令都被執行完畢之後,伺服器才會去處理其他命令請求。 事務使用示例 現在, 讓我們假設 SETEX 命令並不存

Redis 事物、悲觀、樂觀鎖 (詳細)

  1,概論       事物這東西相信大家都不陌生吧,在學習Spring,Mybatis等框架中,       只要是涉及到資料儲存和修改的,都會有事物的存在,       廢話就不多說了下面我們來簡單的介紹下Redis事物以及鎖。 2,Redis事物簡介?     Re

深入淺出聊聊 Redis 高階特性

深入淺出聊聊 Redis 高階特性 String 在 redis 內部儲存預設就是一個字串,被 redisObject 所引用,當遇到 incr,decr 等操作時會轉成數值型進行計算,此時 redisObject 的 encoding 欄位為int。    

redis 事物(四)

Redis 事務可以一次執行多個命令, 並且帶有以下兩個重要的保證: 事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。 事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。 一個事務

淺談Redis特性

在這篇文章中,我們將談論 Redis(REmote DIctionary Server)。Redis是一個開源的、記憶體式的、鍵值儲存資料庫。它也被稱為作為鍵值儲存的字典伺服器,這些鍵值不僅可以是字串,還可以是hashes(雜湊型別)、sets(集合)、list

Redis高階特性及應用場景

Redis高階特性及應用場景 redis中鍵的生存時間(expire) redis中可以使用expire命令設定一個鍵的生存時間,到時間後redis會自動刪除它。 過期時間可以設定為秒或者毫秒精度。過期時間解析度總是 1 毫秒。過期資訊被複制和持久化到磁碟,當 R

redis事物transaction

star watch命令 標記 才會 命令 返回值 分別是 watch add MULTI 用於標記事務塊的開始。Redis會將後續的命令逐個放入隊列中,然後才能使用EXEC命令原子化地執行這個命令序列。 這個命令的運行格式如下所示: MULTI這個命令的返回值是一個

Redis 基礎特性講解

1.Redis基礎雜項小節 1.是什麼 Redis: Remote Dictionary Server(遠端字典伺服器) 是一個高效能的(key/value) 分散式記憶體資料庫,是當前熱門的NoSql資料庫之一 2.能幹嘛 記憶體儲存和持久化 模擬類似於HttpSession這種需要設定過期時間的功能 釋