Reids基礎事務以及watch監控事務和回滾

2021-08-31 21:00:16 字數 2382 閱讀 2602

redis也是有事務的

redis執行事務的三個過程:

1.開啟事務 multi

2.命令進入佇列

3.執行事務 exec

如果要求在乙個連線中,在spring會使用sessioncallback介面來處理。這是為了減少效能損耗

redis的基礎事務:

multi開啟事務,直到exec執行事務,期間的命令將以佇列形式存在,直到exec命令的出現,才會一次性傳送佇列裡的命令去執行,執行過程中其他客戶端也不能再插入任何命令了。也可以直接discard回滾事務(取消了事務中的命令),到exec時已經沒有命令可以執行了。

注意開啟事務後,命令不會馬上執行,而是加入到佇列中,只有當執行事務exec的時候才會順序執行,其實還有乙個watch命令,監聽某些鍵,當exec的時候他會檢測該鍵值有無發生變化,如果沒有則執行命令,否則回滾事務。

舉個例子:這裡用同乙個連線操作redis命令還有lambda表示式(代替匿名類)

注意不知道為什麼,在idea中使用lambda表示式會出現紅色的下劃線提醒,但是可以執行,沒有問題……疑惑ing

@test

public void xx() ;

string value =(string) redistemplate.execute(sessioncallback);

system.out.println(value);

}

輸出:

null

value1

第乙個value輸出null,原因是此時命令只是被加入到佇列中,而咩有被執行,所有是null

第二個value已經執行完畢了

注意使用sessioncallback介面可以保證所有的命令都是通過乙個redis鏈結進行操作

如果想要得到redis執行事務各個命令的結果可以使用list list = ops.exec();

**再來**下redis的事務回滾:

事務回滾是為了保證資料的一致性性,要麼同時完成,要麼同時失敗。

redis的事務回滾和資料庫有點不一樣。

redis事務遇到命令格式正確而資料型別不正確:

multi

set key1 value1

set key2 value2

incr key1

del key2

exec

注意:incr是自增,命令加入到佇列的時候不會報錯,但是執行exec的時候,就會遇到型別錯誤(value1是字串而不是數字),而之前和之後的命令都會被執行,就本身不會執行。

如果是命令格式錯誤,那麼直接事務回滾。

結論:

執行事務命令的時候,命令入隊的時候redis會檢測事務的命令是否正確,如果不正確,全部命令回滾,相當於什麼也沒有執行。如果命令不正確,但是運算元據結構有問題,那麼該命令執行錯誤,而其之前和之後的命令都會被正常執行。

所以對於一些重要操作,我們要檢測資料的正確性以保證事務的正確執行,避免資料不一致。

那為什麼redis要設定如此簡陋的事務呢?

當然是為了保證最重要的問題-----效能。

再來看看:watch命令監控事務。

watch命令可以決定事務是執行還是回滾。watch命令,監控某些鍵值對,當執行事務exec的時候,首先會判斷被watch命令監控的鍵值對前後是否發生變化,最後都會取消監控。所以watch是一次性消費的。

redis在監控事務的時候參考了多執行緒的cas(compare and swap),在資料高併發的操作中,這種機制也叫作樂觀鎖。但是有時候會存在aba問題,即被監控的值變換為a-b-a,事務前後的值最終沒有變,但是過程中改變了,如果此時併發處理就會出現問題。

但是在redis事務中,並不阻塞其他連線的併發,而只是通過比較watch監控的鍵值對去保證資料的一致性,可以再非阻塞的多執行緒環境中併發執行,不會產生aba問題,因為就算修改被watch監控的值為原來的值,還是會認為他被修改過了,有點繞。舉個例子:

開啟乙個客戶端:

./redis-cli               ./redis-cli 

set key1 value1 null

watch key1 null

multi null

set key2 value2 set key1 value1

exec

返回結果(nil)

表示事務回滾了。

reids基礎知識和命令

redis本質上是乙個高效能的鍵值資料庫,是nosql資料庫的一種.通常被認為是乙個資料結構伺服器,主要是因為其有著豐富的資料結構 字串string 列表list,集合set 雜湊表hash 有序集合zset。計數器,快取,訊息佇列 發布 訂閱功能 分布式鎖實現 速度快 使用標準c寫,所有資料都在記...

spring事務以及事務傳播

事務必須服從acid原則。acid指的是原子性 atomicity 一致性 consistency 隔離性 isolation spring的事務管理的幾種實現方式 1.程式設計式 首先基於pojo的話一般就是用這種,在 中呼叫begintransaction commit rollback 等事務...

事務的特徵以及Hibernate事務

事務應該具有4個屬性 原子性 一致性 隔離性 永續性。這四個屬性通常稱為acid特性。hibernate封裝了jdbc和jta事務,應用程式可以繞過hibernate api,直接通過jdbc和jta的api來宣告事務。其中,jta可以用來處理分布式事務。應用程式通過hibernate api宣告事...