搜尋
首頁資料庫Redisredis事務及相關指令介紹

redis事務及相關指令介紹

Nov 27, 2019 pm 04:38 PM
redis

redis事務及相關指令介紹

一、概述​​:

和眾多其它資料庫一樣,Redis作為NoSQL資料庫也同樣提供了事務機制。在Redis中,MULTI/EXEC/DISCARD/WATCH這四個命令是我們實現交易的基石。相信對有關係型資料庫開發經驗的開發者而言這一概念並不陌生,即便如此,我們還是會簡要的列出Redis中事務的實現特徵:(推薦:redis視頻教程

1). 在事務中的所有命令都將會被串行化的順序執行,事務執行期間,Redis不會再為其它客戶端的請求提供任何服務,從而保證了事物中的所有命令被原子的執行。

2). 和關係型資料庫中的事務相比,在Redis事務中如果有某一條命令執行失敗,其後的命令仍然會被繼續執行。

3). 我們可以透過MULTI指令開啟一個事務,有關係型資料庫開發經驗的人可以將其理解為"BEGIN TRANSACTION"語句。在該語句之後執行的命令都會被視為事務之內的操作,最後我們可以透過執行EXEC/DISCARD指令來提交/回滾該交易內的所有操作。這兩個Redis指令可被視為等同於關係型資料庫中的COMMIT/ROLLBACK語句。

4). 在交易開啟之前,如果客戶端與伺服器之間出現通訊故障並導致網路斷開,其後所有待執行的語句都將不會被伺服器執行。然而如果網路中斷事件是發生在客戶端執行EXEC命令之後,那麼該事務中的所有命令都會被伺服器執行。

5). 當使用Append-Only模式時,Redis會透過呼叫系統函數write將該交易內的所有寫入操作在本次呼叫中全部寫入磁碟。然而如果在寫入的過程中出現系統崩潰,如電源故障導致的宕機,那麼此時也許只有部分資料被寫入到磁碟,而另外一部分資料卻已經遺失。

Redis伺服器會在重新啟動時執行一系列必要的一致性檢測,一旦發現類似問題,就會立即退出並給出相應的錯誤提示。此時,我們就要充分利用Redis工具包中提供的redis-check-aof工具,該工具可以幫助我們定位到資料不一致的錯誤,並將已經寫入的部分資料回滾。修復之後我們就可以再次重新啟動Redis伺服器了。

二、相關指令清單:

##傳回值D
指令原型 時間複雜度 指令描述

M

U

#L

T

##I


用於標記事務的開始,其後執行的命令都會存入指令佇列,直到執行EXEC時,這些指令才會被原子的執行。 總是回傳OK
##E

X

E

##C


執行在一個交易內命令佇列中的所有指令,同時將目前連線的狀態還原為正常狀態,即非交易狀態。如果在交易中執行了WATCH指令,那麼只有當WATCH所監控的Keys沒有被修改的前提下,EXEC指令才能執行交易佇列中的所有指令,否則EXEC將放棄目前交易中的所有指令。
原子性的回傳事務中各條指令的回傳結果。如果在事務中使用了WATCH,一旦事務被放棄,EXEC將返回NULL-multi-bulk回應。

I

S

C

A

R

D


回滾交易佇列中的所有指令,同時再將目前連線的狀態還原為正常狀態,即非交易狀態。如果WATCH指令被使用,則該指令將UNWATCH所有的Keys。 總是回傳OK。

W

A

T

C

H

k

e

y

 [key ...]

#O(1) 在MULTI指令執行之前,可以指定待監控的Keys,然而在執行EXEC之前,如果被監控的Keys發生修改,EXEC將放棄執行該事務佇列中的所有命令。 總是回傳OK。

U

N

W

A

T

C

H

O(1) 取消目前交易中指定監控的Keys,如果執行了EXEC或DISCARD指令,則無需再手動執行該指令了,因為在此之後,事務中所有被監控的Keys都將自動取消。 總是回傳OK。

三、命令範例:

1、事務被正常執行:
#在Shell命令列下執行Redis的客戶端工具。

 /> redis-cli

#在目前連線上啟動一個新的交易。

redis 127.0.0.1:6379> multi
OK

#執行事務中的第一條指令,從該指令的回傳結果可以看出,該指令並沒有立即執行,而是存於交易的指令佇列。

redis 127.0.0.1:6379> incr t1
QUEUED

#又執行一個新的指令,從結果可以看出,該指令也被存於交易的指令佇列。

redis 127.0.0.1:6379> incr t2
QUEUED

#執行事務命令佇列中的所有命令,從結果可以看出,佇列中命令的結果會傳回。

redis 127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1

2、 事務中存在失敗的指令:
#開啟一個新的交易。

redis 127.0.0.1:6379> multi
OK

#設定鍵a的值為string類型的3。

redis 127.0.0.1:6379> set a 3
QUEUED

#從鍵a所關聯的值的頭部彈出元素,由於該值是字串類型,而lpop指令僅能用於List類型,因此在執行exec指令時,該命令將會失敗。

redis 127.0.0.1:6379> lpop a
QUEUED

#再次設定鍵a的值為字串4。

redis 127.0.0.1:6379> set a 4
QUEUED

#取得鍵a的值,以便確認該值是否被交易中的第二個set指令設定成功。

redis 127.0.0.1:6379> get a
QUEUED

#從結果可以看出,事務中的第二個指令lpop執行失敗,而其後的set與get指令都執行成功,這點是Redis的事務與關係型資料庫中的事務之間最為重要的差異。
redis 127.0.0.1:6379> exec
1) OK
2) (error) ERR Operation against a key holding the wrong kind of value
3) OK
4) "4"
3、回滾事務:
#為鍵t2設定一個事務執行前的值。

redis 127.0.0.1:6379> set t2 tt
OK

#開啟一個交易。

redis 127.0.0.1:6379> multi
OK

#在交易內為該鍵設定一個新值。

redis 127.0.0.1:6379> set t2 ttnew
QUEUED

#放棄事務。

redis 127.0.0.1:6379> discard
OK

#查看鍵t2的值,從結果可以看出該鍵的值仍為交易開始之前的值。

redis 127.0.0.1:6379> get t2
"tt"

四、WATCH指令與基於CAS的樂觀鎖定:

在Redis的交易中,WATCH指令可用於提供CAS(check -and-set)功能。假設我們透過WATCH指令在事務執行之前監控了多個Keys,倘若在WATCH之後有任何Key的值發生了變化,EXEC命令執行的事務都將被放棄,同時返回Null multi-bulk應答以通知呼叫者事務執行失敗。

例如,我們再次假設Redis中並未提供incr指令來完成鍵值的原子性遞增,如果要實現該功能,我們只能自行編寫對應的程式碼。其偽碼如下:

      val = GET mykey
      val = val + 1
      SET mykey $val

以上程式碼只有在單一連線的情況下才可以保證執行結果是正確的,因為如果在同一時刻有多個客戶端在同時執行該段程式碼,那麼就會出現多執行緒程式中常出現的一種錯誤場景--競態爭用(race condition)。

例如,客戶端A和B都在同一時刻讀取了mykey的原有值,假設該值為10,此後兩個客戶端又均將該值加一後set回Redis伺服器,這樣就會導致mykey的結果為11,而不是我們認為的12。為了解決類似的問題,我們需要藉助WATCH指令的幫助,請看以下程式碼:

      WATCH mykey
      val = GET mykey
      val = val + 1
      MULTI
      SET mykey $val
      EXEC

和先前程式碼不同的是,新程式碼在取得mykey的值之前先透過WATCH指令監控了該鍵,此後又將set命令包圍在事務中,這樣就可以有效的保證每個連接在執行EXEC之前,如果當前連接獲取的mykey的值被其它連接的客戶端修改,那麼當前連接的EXEC命令將執行失敗。這樣呼叫者在判斷回傳值後就可以獲悉val是否重新設定成功。

更多redis知識請關注redis教學欄位。

以上是redis事務及相關指令介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除
REDIS的服務器端操作:它提供的REDIS的服務器端操作:它提供的Apr 29, 2025 am 12:21 AM

Redis'sserver-sedierations offerfunctions andTriggersForexeCutingCompleXoperationsontheserver.1)函數functionsAllowCompOustomoperationsInlua,JavaScript,javaScript,orredis'sscriptinglanguigh,增強效率和增強性。 2)

REDIS:數據庫還是服務器?揭開角色的神秘面紗REDIS:數據庫還是服務器?揭開角色的神秘面紗Apr 28, 2025 am 12:06 AM

redisisbothadatabaseandaserver.1)asadatabase,ituseSin-memorystorageforfastaccess,ifealforreal-timeapplications andCaching.2)Asaserver,ItsupportsPub/submessagingAndluAsessingandluAsessingandluascriptingftingftingftingftingftingftingftingfinteral-timecommunicationandserverserverserverserverserverserverserver-soperations。

REDIS:NOSQL方法的優勢REDIS:NOSQL方法的優勢Apr 27, 2025 am 12:09 AM

Redis是NoSQL數據庫,提供高性能和靈活性。 1)通過鍵值對存儲數據,適合處理大規模數據和高並發。 2)內存存儲和單線程模型確保快速讀寫和原子性。 3)使用RDB和AOF機制進行數據持久化,支持高可用性和橫向擴展。

REDIS:了解其架構和目的REDIS:了解其架構和目的Apr 26, 2025 am 12:11 AM

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

REDIS與SQL數據庫:關鍵差異REDIS與SQL數據庫:關鍵差異Apr 25, 2025 am 12:02 AM

Redis和SQL數據庫的主要區別在於:Redis是內存數據庫,適用於高性能和靈活性需求;SQL數據庫是關係型數據庫,適用於復雜查詢和數據一致性需求。具體來說,1)Redis提供高速數據訪問和緩存服務,支持多種數據類型,適用於緩存和實時數據處理;2)SQL數據庫通過表格結構管理數據,支持複雜查詢和事務處理,適用於電商和金融系統等需要數據一致性的場景。

REDIS:它如何充當數據存儲和服務REDIS:它如何充當數據存儲和服務Apr 24, 2025 am 12:08 AM

REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations

REDIS與其他數據庫:比較分析REDIS與其他數據庫:比較分析Apr 23, 2025 am 12:16 AM

Redis與其他數據庫相比,具有以下獨特優勢:1)速度極快,讀寫操作通常在微秒級別;2)支持豐富的數據結構和操作;3)靈活的使用場景,如緩存、計數器和發布訂閱。選擇Redis還是其他數據庫需根據具體需求和場景,Redis在高性能、低延遲應用中表現出色。

REDIS的角色:探索數據存儲和管理功能REDIS的角色:探索數據存儲和管理功能Apr 22, 2025 am 12:10 AM

Redis在數據存儲和管理中扮演著關鍵角色,通過其多種數據結構和持久化機製成為現代應用的核心。 1)Redis支持字符串、列表、集合、有序集合和哈希表等數據結構,適用於緩存和復雜業務邏輯。 2)通過RDB和AOF兩種持久化方式,Redis確保數據的可靠存儲和快速恢復。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版