Redis事件與事務

來源:互聯網
上載者:User
一、Redis特點 特性:速度快、基於索引值對的資料結構伺服器、功能豐富、簡單穩定、用戶端語言多、持久化、主從複製、支援高可用和分布式 單線程架構:redis使用單線程架構和I/O多工模型來實現高效能的記憶體資料庫服務。一條命令從用戶端到服務端不會立刻被執行,所有命令都會進入一個隊列中,然後逐個被執行。(執行順序不確定的)。

單線程如何滿足線上運行速度。  純記憶體訪問:所有資料放在記憶體中,響應時間長度大約100納秒。  非阻塞I/O,使用epoll作為I/O多工技術的實現,再加上Redis自身的事件處理模型將poll中的串連、讀寫、關閉都轉換為事件,不在網路I/O上浪費過多的時間。 單線程避免了線程切換和競態產生的消耗。 二、事件

Redis伺服器是一個事件驅動程式。處理以下兩類事件: 檔案事件:Redis伺服器通過通訊端與用戶端進行串連,檔案事件就是伺服器對通訊端操作的抽象。 時間事件:伺服器對定時操作的抽象。 1.檔案事件

Redis 基於Reactor模式開發了自己的網路事件處理器即檔案事件處理器

檔案事件處理器使用I/O多工程式來同時監聽多個通訊端,並根據通訊端目前執行的任務來為通訊端關聯不同的交易處理器。

當被監聽的通訊端準備好執行串連應答、讀取、寫入、關閉等操作時,與操作相對應的檔案事件就會產生,這時檔案事件處理器就會調用通訊端之前關聯好的事件處理器來處理這些事件。

檔案事件處理器 由四個部分組成:通訊端、I/O多工程式、檔案事件指派器以及事件處理器 I/O多工程式總是會將所有產生事件的通訊端放到一個隊列裡面,然後通過這個隊列以有序、同步、每次一個通訊端的方式向檔案事件指派器傳送通訊端。當上一個通訊端產生的事件被處理完畢之後,I/O多工程式才會繼續向檔案事件指派器傳送下一個通訊端。

I/O多工程式 I/O多工程式的功能是通過封裝常見的select、epoll、evport和kqueue這些I/O多工函數庫來實現的。2.時間事件 分類 定時事件:指定時間執行一次。 周期性事件:每隔一段時間執行一次。

目前Redis只使用周期性事件,而沒有使用定時事件。 一個事件時間主要由三個屬性群組成:

1)id:伺服器為時間事件建立的全域唯一ID

2) when:毫秒精度的UNIX時間戳記,記錄了時間事件的到達時間

3) timeProc:時間事件處理器,一個函數 實現 伺服器將所有時間事件都放在一個無序鏈表中,每當時間事件執行器運行時,遍曆整個鏈表,尋找所有已到達的時間事件,並調用相應的事件處理器。(該鏈表為無序鏈表,不按when屬性的大小排序) Redis事務

Redis通過 MULTI 、 EXEC 、 WATCH 等命令來實現事務功能。事務提供了一種將多個命令請求打包,然後一次性、按順序地執行多個命令的機制,並且在事務執行期間,伺服器不會中斷事務而改去執行其他用戶端的命令請求,它會將事務中的所有命令都執行完畢,然後才去處理其他用戶端的命令請求。 1.事務的實現

下面給了一個事務的簡單例子:

127.0.0.1:6379> multiOK127.0.0.1:6379> set "name" "wangjia06"QUEUED127.0.0.1:6379> get "name"QUEUED127.0.0.1:6379> set "company" "dianping"QUEUED127.0.0.1:6379> get "company"QUEUED127.0.0.1:6379> set age 28QUEUED127.0.0.1:6379> get ageQUEUED127.0.0.1:6379> exec1) OK2) "wangjia06"3) OK4) "dianping"5) OK6) "28"

退出一個事務可以用 MULTI 命令, 此時再執行事務會報錯:

127.0.0.1:6379> multiOK127.0.0.1:6379> get "company"QUEUED127.0.0.1:6379> get "age"QUEUED127.0.0.1:6379> discardOK127.0.0.1:6379> exec(error) ERR EXEC without MULTI

一個事務包括三個步驟: 事務開始:事務以 MULTI 開始,返回OK命令。 命令入隊:每個事務命令成功進入隊列後,返回 QUEUED 。 事務執行: EXEC 執行事務。

Redis事務內會遇到兩種錯誤: 隊列入隊不成功:語法錯誤,錯誤的命令名字或者一些重要的條件如OOM條件。這種用戶端會進行校正,如果入隊成功則返回QUEUED ,否則返回錯誤。如果一個命令入隊失敗,大多數用戶端會終止該事務。

127.0.0.1:6379> get name"wangjia08"127.0.0.1:6379> multiOK127.0.0.1:6379> set name "wangjia09"QUEUED127.0.0.1:6379> get(error) ERR wrong number of arguments for 'get' command127.0.0.1:6379> get nameQUEUED127.0.0.1:6379> exec(error) EXECABORT Transaction discarded because of previous errors.127.0.0.1:6379>
命令執行時報錯:如對一個String值進行列表操作。所有其他的命令會被正常執行即使在事務執行中一些命令失敗。
127.0.0.1:6379> multiOK127.0.0.1:6379> set sex manQUEUED127.0.0.1:6379> lpop sexQUEUED127.0.0.1:6379> exec1) OK2) (error) WRONGTYPE Operation against a key holding the wrong kind of value127.0.0.1:6379> get sex"man"127.0.0.1:6379>

Redis不支援交易回復功能,原因大概有兩點: 一個redis命令執行失敗,一般是語法錯誤或者應該在開發階段被檢測出來,而不是在生產環境。 redis追求簡單、速度快,所以不提供交易回復功能. 2.WATCH命令的實現

watch 命令給redis事務提供了一個 CAS 功能。它是一個樂觀鎖,檢查被監視的健是否至少有一個已經被修改過了,如果是的話拒絕執行,並返回nil代表執行失敗。

如下面例子,在一個用戶端開啟事務前對鍵“name”進行監視,若在這個事務執行前,另一個用戶端修改了鍵“name”的值,之後事務執行後就會報nil。

127.0.0.1:6379> watch "name"OK127.0.0.1:6379> multiOK127.0.0.1:6379> set age 10QUEUED127.0.0.1:6379> get "name"QUEUED127.0.0.1:6379> exec(nil)
127.0.0.1:6379> set "name" "wangjia08"OK

watch 命令監視多個鍵:

127.0.0.1:6379> watch "name" "age"OK127.0.0.1:6379> multiOK127.0.0.1:6379> get "name"QUEUED127.0.0.1:6379> get "age"QUEUED127.0.0.1:6379> exec(nil)127.0.0.1:6379>
127.0.0.1:6379> set "age" 11OK
3.事務的ACID性質 原子性:redis事務多個操作當做一個整體來執行,要麼執行事務中的所有操作,要麼一個也不執行。 一致性:“一致”指的是資料符合資料庫本身的定義和要求,沒有包含非法的或無效的錯誤資料 入隊錯誤:伺服器拒絕執行該事務。 執行錯誤:出錯的命令會被伺服器識別出來,並進行相應的錯誤處理,不會對資料庫做任何修改,也不會對資料一致性造成影響。 伺服器停機: RDB 、 AOF 還原資料庫狀態 隔離性:單線程執行事務,且伺服器保證事務期間不會對事務進行中斷 持久性:當一個事務執行完畢時,執行這個事務所得的結果已經被儲存到非揮發性儲存體介質(比如硬碟)裡面了。Redis事務的持久性由Redis所使用的持久化模式決定(無持久化模式、 RDB 、 AOF )。Redis工作在無持久化模式下時,事務無持久性。在 AOF 模式下 appenfsync 為 no 時,事務也無持久性
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.