1. 程式人生 > >Redis 事務是原子性的嗎

Redis 事務是原子性的嗎

原子性(Atomicity)
原子意味著操作的不可再分,要麼執行要麼不執行。Redis 本身提供的所有 API 都是原子操作,那麼 Redis 事務其實是要保證批量操作的原子性。Redis 實現批量操作的原理是在一個事務上下文中(通過 MULTI命令開啟),所有提交的操作請求都先被放入佇列中快取,在 EXEC 命令提交時一次性批量執行。這樣保證了批量操作的一次性執行過程,但 Redis 在事務執行過程的錯誤情況做出了權衡取捨,那就是放棄了回滾。
Redis 官方文件對此給出的解釋是:
  1. Redis 操作失敗的原因只可能是語法錯誤或者錯誤的資料庫型別操作,這些都是在開發層面能發現的問題不會進入到生產環境,因此不需要回滾。
  2. Redis 內部設計推崇簡單和高效能,因此不需要回滾能力。
據實而說第一條說法感覺有點站不住腳,可以想象得到 Redis 操作失敗的原因絕對不止語法層面的錯誤,特別是一些像依賴作業系統、檔案系統的操作。第二條說法更實在,Redis 的應用場景明顯不是為了資料儲存的高可靠而設計的,而是為了資料訪問的高效能而設計,設計者為了簡單性和高效能而部分放棄了原子性。 出於以上考慮 Redis 的事務執行有以下特點:
  1. 批量操作在傳送 EXEC 命令前被放入佇列快取
  2. 收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行
  3. 在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中
一致性(Consistency) 一致性意味著事務結束後系統的資料依然保證一致。在事務開始之前,資料保持有效的狀態,事務結束後也如此。顯然在前面討論原子性時,Redis 捨棄了回滾的設計,基本上也就捨棄對資料一致性的有效保證。不過對於一個高效的 key-value store 或 data structure server,資料操作一致性很多時候更多應該依賴應用層面,事實也是我們使用 Redis 時很多時候都是分片和叢集的,資料一致性無法依靠任何事務機制。 隔離性(Isolation) 隔離性保證了在事務完成之前,該事務外部不能看到事務裡的資料改變。也不能訪問一些中間狀態,因為假如事務終止的話,這些狀態將永遠不會發生。
Redis 採用單執行緒設計,在一個事務完成之前,其他客戶端提交的各種操作都無法執行因此自然沒法看見事務執行的中間狀態,隔離性得到保證。 永續性(Durability) Redis 一般情況下都只進行記憶體計算和操作,永續性無法保證。但 Redis 也提供了2種資料持久化模式,SNAPSHOT 和 AOF,SNAPSHOT的持久化操作與命令操作是不同步的,無法保證事務的永續性。而AOF模式意味著每條命令的執行都需要進行系統呼叫操作磁碟寫入檔案,可以保證永續性,但會大大降低 Redis 的訪問效能。 Redis 在2.6版本開始提供指令碼(Lua scripting)能力,一種更靈活的批量命令組織方式用於取代目前的事務機制。指令碼提供了更強大和靈活的程式設計能力,但也是一把雙刃劍,由於 Redis 需要保證指令碼執行的原子性和隔離性,指令碼執行期間會阻塞其他命令的執行,因此建議寫一些高效的指令碼。不過從開發者的角度來說使用Lua指令碼的成本(學習成本、開發成本、維護成本)都要更大,特別是一些開發者如果將應用的業務邏輯放入指令碼中來執行,是不是讓人想起了資料庫的儲存過程。

相關推薦

Redis 併發原子原理

Redis原子性原理 摘要: 1、Redis是單程序單執行緒的網路模型,用的是epoll,poll,select網路模型,這些網路模型都是單執行緒處理網路請求 2、Redis的單執行緒處理所有的客戶端連線請求,命令讀寫請求。(有些任務比如rdb和aof等操作是fork子程序處理的,不會影

順序,一致性,原子:現代多核體系結構與原子操作·CAS與自旋鎖·自旋鎖與併發程式設計的原語·語句原子和程式設計邏輯的原子·行鎖與資料庫事務原子·binlog與資料庫同

順序性: 亂序執行·邏輯正確性  現代體系結構的每一個核的指令流水是亂序執行的,但是他能夠保證其執行效果正確,即等同於順序執行。 不過這帶來的問題是對於一個核在主觀上它的執行狀態最終保證正確,但是對於別的核,如果在某一箇中間時間點需要觀察它呢?看到的是一個不正確的

Redis 事務原子

原子性(Atomicity) 原子意味著操作的不可再分,要麼執行要麼不執行。Redis 本身提供的所有 API 都是原子操作,那麼 Redis 事務其實是要保證批量操作的原子性。Redis 實現批量操作的原理是在一個事務上下文中(通過 MULTI命令開啟),所有提交的操作請求都先被放入佇列中快取,在 EXE

不支援原子Redis 事務也叫事務

> 文章收錄在 GitHub [JavaKeeper](https://github.com/Jstarfish/JavaKeeper) ,N線網際網路開發必備技能兵器譜 ![](https://cdn.jsdelivr.net/gh/Jstarfish/picBed/img/202008241616

redis事務不是原子

最新 通過 存儲 內部 定義 部分 不能 所有 客戶 Reference: https://blog.csdn.net/u011692780/article/details/81213010 一、事務的四大特性 關系型數據庫的事務具有四個特性: 1. 原子性 2. 一致

【高頻 Redis 面試題】Redis 事務是否具備原子

### 一、Redis 事務的實現原理 一個事務從開始到結束通常會經歷以下三個階段: #### 1、事務開始 客戶端傳送 **MULTI** 命令,伺服器執行 MULTI 命令邏輯。 伺服器會在客戶端狀態(redisClient)的 **`flags`** 屬性開啟 **REDIS_MULTI** 標

Redis-List命令和Zset有序集合命令的併發原子原理

一、Redis-List命令和Zset有序集合命令的併發原子性原理 這個併發原則處理的過程是要基於當前的key在客戶端發生了併發產生了阻塞才會執行, 否者會返回NULL不做處理,多個命令併發操作這個KEY,就可能產生阻塞 db->blocking_keys 字典維護的雜湊表,存放客

Redis list zset併發原子處理

redis  list命令和zset有序集合為啥是原子性,不會出現資料錯亂 例如當lpush和zadd的時候 如果當前的集合是LIST和有序集合的話且當前客戶端存在阻塞的話 會把當前的操作放入一個叫ready_keys的dict裡面,然後後面REDIS一個一個按照插入的順

redis實現秒殺功能例子(採用lua的原子保證資料的一致性)

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.spring

事務原子與提交區別

1.現象      程式中打開了事務進行插入,但是沒有commit,表中的資料已經存在,就是回滾也不能刪除插入的資料2.原因     本表的Storage Engine 為myisam,不是innoDB,不支援事務處理 rollback()3.解決方法     使用 alter table xxxx engi

事務四大特徵:原子,一致性,隔離和永續性(ACID)

Transaction 也就是所謂的事務了,通俗理解就是一件事情。從小,父母就教育我們,做事情要有始有終,不能半途而廢。 事務也是這樣,不能做一半就不做了,要麼做完,要麼就不做。也就是說,事務必須是一個不可分割的整體,就像我們在化學課裡學到的原子,原子是構成物質的最小單位

事務(Transaction) 之分散式事務TransactionScope,原子

事物(Transaction)是訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。事物通常由高階資料庫操縱語言或程式語言(如SQL,C++或Java)書寫的使用者程式的執行所引起,並用形如begin transaction和commit transaction

redis原子讀寫操作之LUA指令碼和watch機制

最近在開發電商平臺的子系統——儲值卡系統,系統核心業務涉及到金額消費以及庫存控制,因此為了解決建立在記憶體上高併發情況下的事務控制,使用了spring封裝的RedisTemplate執行lua指令碼進行原子性操作,確保金額消費,庫存按順序處理,解決資源爭搶。  1.使用lua指令碼  Redis 使用單個 L

事務四大特征:原子,一致性,隔離和持久(ACID)

四大 ola 物理 約束 任務 這一 abi 工作單元 單元 事務四大特征:原子性,一致性,隔離性和持久性。 1. 原子性(Atomicity) 一個原子事務要麽完整執行,要麽幹脆不執行。這意味著,工作單元中的每項任務都必須正確執行。如果有任一任務執行失敗,則整

新姿勢!Redis中調用Lua腳本以實現原子操作

使用方法 default 2.6 nil 變量 data ready 語法 commands 背景:有一服務提供者Leader,有多個消息訂閱者Workers。Leader是一個排隊程序,維護了一個用戶隊列,當某個資源空閑下來並被分配至隊列中的用戶時,Leader會向訂閱者

跟面試官侃半小時MySQL事務,說完原子、一致性、永續性的實現

提到MySQL的事務,我相信對MySQL有了解的同學都能聊上幾句,無論是面試求職,還是日常開發,MySQL的事務都跟我們息息相關。 而事務的ACID(即原子性Atomicity、一致性Consistency、隔離性Isolation、永續性Durability)可以說涵蓋了事務的全部知識點,所以,我們不僅要知

Redis和Memcache能測試對比

數據 redis 3.3 replace class 內存 知識 獲取數據 lac Redis和Memcache在寫入性能上面差別不大,讀取性能上面尤其是批量讀取性能上面Memcache全面勝出,當然Redis也有自己的優點:比如數據持久化、支持更多的數據結構(Set Li

Java線程安全 關於原子與volatile的試驗

har length rgs 無法 over pub boolean 即使 dex 1. 變量遞增試驗 1 static /*volatile*/ int shared=0;//volatile也無法保證++操作的原子性 2 static synchr

多線程並發之原子(六)

解決 tile start 基本上 barrier stack import 說明 ken 最近在網上找到好多的多線程關於原子性的例子,說的都不是非常的明確,對於剛學習多線程的新手而言很容誤導學員,在這裏,我通過多個例子對多線程的原子性加以說明。 例子一:傳統技術自增

聊聊高並發(十九)理解並發編程的幾種"" -- 可見,有序性,原子

sock clas 關註 條件 infoq zed 應該 單獨 ssa 這篇的主題本應該放在最初的幾篇。討論的是並發編程最基礎的幾個核心概念。可是這幾個概念又牽扯到非常多的實際技術。比方Java內存模型。各種鎖的實現,volatile的實現。原子變量等等,每個都可以展開