黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 Redis分布式事務(wù)

Redis分布式事務(wù)

更新時(shí)間:2022-02-15 09:34:28 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1584次

redis 中的事務(wù)由放置在MULTI和EXEC(或DISCARD用于回滾)之間的命令塊組成。一旦MULTI 遇到 a ,該連接上的命令就不會(huì)被執(zhí)行- 它們被排隊(duì)(并且調(diào)用者得到QUEUED 每個(gè)的回復(fù))。當(dāng)EXEC遇到 an 時(shí),它們都被應(yīng)用在一個(gè)單元中(即沒(méi)有其他連接在操作之間獲得時(shí)間)。如果DISCARD看到 a 而不是 a EXEC,則所有內(nèi)容都將被丟棄。因?yàn)槭聞?wù)內(nèi)部的命令是排隊(duì)的,所以你不能在事務(wù)內(nèi)部做出決定 。例如,在 SQL 數(shù)據(jù)庫(kù)中,您可能會(huì)執(zhí)行以下操作(偽代碼 - 僅用于說(shuō)明):

// assign a new unique id only if they don't already
// have one, in a transaction to ensure no thread-races
var newId = CreateNewUniqueID(); // optimistic
using(var tran = conn.BeginTran())
{
	var cust = GetCustomer(conn, custId, tran);
	var uniqueId = cust.UniqueID;
	if(uniqueId == null)
	{
		cust.UniqueId = newId;
		SaveCustomer(conn, cust, tran);
	}
	tran.Complete();
}

那么如何在 Redis 中做到這一點(diǎn)呢?

這在 redis 事務(wù)中根本不可能:一旦事務(wù)打開(kāi),您就無(wú)法獲取數(shù)據(jù)- 您的操作已排隊(duì)。幸運(yùn)的是,還有另外兩個(gè)命令可以幫助我們:WATCH和UNWATCH.

WATCH {key}告訴 Redis 我們對(duì)指定的鍵感興趣以用于事務(wù)。Redis 會(huì)自動(dòng)跟蹤這個(gè)鍵,任何更改都會(huì)使我們的事務(wù)回滾 -EXEC與DISCARD(調(diào)用者可以檢測(cè)到這一點(diǎn)并從頭開(kāi)始重試)相同。所以你可以做的是:WATCH一個(gè)鍵,以正常方式從那個(gè)鍵中檢查數(shù)據(jù),然后MULTI/EXEC你的更改。如果,當(dāng)您檢查數(shù)據(jù)時(shí),您發(fā)現(xiàn)您實(shí)際上并不需要該事務(wù),您可以使用UNWATCH忘記所有被監(jiān)視的鍵??。請(qǐng)注意,監(jiān)視的鍵也會(huì)在EXEC和期間重置DISCARD。所以在 Redis 層,這在概念上是:

WATCH {custKey}
HEXISTS {custKey} "UniqueId"
-- (check the reply, then either:)
MULTI
HSET {custKey} "UniqueId" {newId}
EXEC
-- (or, if we find there was already an unique-id:)
UNWATCH

這可能看起來(lái)很奇怪 - 有一個(gè)MULTI/EXEC只跨越一個(gè)操作 - 但重要的是我們現(xiàn)在也在跟蹤{custKey}所有其他連接的更改 - 如果其他任何人更改密鑰,事務(wù)將被中止。

在 StackExchange.Redis 中呢?

StackExchange.Redis 使用多路復(fù)用器方法這一事實(shí)使情況變得更加復(fù)雜。我們不能簡(jiǎn)單地讓并發(fā)調(diào)用者發(fā)出WATCH/ UNWATCH/ MULTI/ EXEC/ DISCARD:它們都會(huì)混在一起。所以提供了一個(gè)額外的抽象——另外讓事情變得更簡(jiǎn)單:約束。約束基本上是預(yù)先準(zhǔn)備好的測(cè)試,包括WATCH、某種測(cè)試和對(duì)結(jié)果的檢查。如果所有約束都通過(guò),則發(fā)出MULTI/ ;EXEC否則UNWATCH發(fā)出。這一切都是以防止命令與其他調(diào)用者混合在一起的方式完成的。所以我們的例子變成了:

var newId = CreateNewId();
var tran = db.CreateTransaction();
tran.AddCondition(Condition.HashNotExists(custKey, "UniqueID"));
tran.HashSetAsync(custKey, "UniqueID", newId);
bool committed = tran.Execute();
// ^^^ if true: it was applied; if false: it was rolled back

請(qǐng)注意,從返回的對(duì)象CreateTransaction只能訪問(wèn)異步方法 - 因?yàn)槊總€(gè)操作的結(jié)果要等到Execute(或ExecuteAsync)完成之后才能知道。如果未應(yīng)用操作,所有Tasks 將被標(biāo)記為取消 - 否則,在命令執(zhí)行后,您可以正常獲取每個(gè)結(jié)果。

可用條件的集合并不廣泛,但涵蓋了最常見(jiàn)的場(chǎng)景;如果您想查看其他條件,請(qǐng)與我聯(lián)系(或更好:提交拉取請(qǐng)求)。

內(nèi)置操作通過(guò)When

還需要注意的是,Redis 已經(jīng)預(yù)料到了許多常見(jiàn)的場(chǎng)景(特別是:key/hash 的存在,就像上面一樣),并且存在單操作原子命令。這些是通過(guò)When參數(shù)訪問(wèn)的——所以我們前面的例子也可以寫成:

var newId = CreateNewId();
bool wasSet = db.HashSet(custKey, "UniqueID", newId, When.NotExists);

(這里是使用命令的When.NotExists原因,而不是)HSETNXHSET

Lua

您還應(yīng)該記住,Redis 2.6 及更高版本支持 Lua 腳本,這是一種通用工具,用于在服務(wù)器上作為單個(gè)原子單元執(zhí)行多個(gè)操作。由于在 Lua 腳本期間沒(méi)有為其他連接提供服務(wù),它的行為很像一個(gè)事務(wù),但沒(méi)有MULTI/EXEC等的復(fù)雜性。這也避免了調(diào)用者和服務(wù)器之間的帶寬和延遲等問(wèn)題,但權(quán)衡是它壟斷了腳本期間的服務(wù)器。

在 Redis 層(假設(shè)HSETNX不存在),這可以實(shí)現(xiàn)為:

EVAL "if redis.call('hexists', KEYS[1], 'UniqueId') then return redis.call('hset', KEYS[1], 'UniqueId', ARGV[1]) else return 0 end" 1 {custKey} {newId}

這可以通過(guò)以下方式在 StackExchange.Redis 中使用:

var wasSet = (bool) db.ScriptEvaluate(@"if redis.call('hexists', KEYS[1], 'UniqueId') then return redis.call('hset', KEYS[1], 'UniqueId', ARGV[1]) else return 0 end",
        new RedisKey[] { custKey }, new RedisValue[] { newId });

(請(qǐng)注意,來(lái)自ScriptEvaluateand的響應(yīng)ScriptEvaluateAsync是可變的,具體取決于您的確切腳本;響應(yīng)可以通過(guò)強(qiáng)制轉(zhuǎn)換來(lái)解釋 - 在這種情況下為 a bool)

通過(guò)上述相信大家對(duì)Redis分布式事務(wù)已經(jīng)有所了解,大家如果對(duì)此比較感性趣,想了解更多相關(guān)知識(shí),不妨來(lái)關(guān)注一下動(dòng)力節(jié)點(diǎn)的Redis教程,里面的課程內(nèi)容從淺到深,通俗易懂,適合沒(méi)有基礎(chǔ)的朋友學(xué)習(xí),希望對(duì)大家能夠有所幫助。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 男人午夜网站 | 首页 国产 日韩 欧美 动漫 | 国产高清看片日韩欧美久久 | 一级一级特黄女人精品毛片视频 | 成年人免费看片 | 一级人做人a爰免费视频 | 欧美成人午夜在线全部免费 | 一区二区三区影院 | 日韩欧美一区二区三区不卡 | 亚洲怡春院 | 丁香六月在线视频 | 国产精品香蕉成人网在线观看 | 55夜色66夜色国产亚洲精品区 | 羞羞网站在线免费观看 | 日本精品影院 | 日韩中文网 | 国产日韩欧美精品 | 日韩爽爽爽视频免费播放 | 高清 国产 日韩 欧美 | 亚洲高清成人欧美动作片 | 一级大片免费 | 性欧美13处丶14处 | 特级毛片ww特级毛片w免费版 | 精品久久久久久综合日本 | 黄视频免费| 欧美视频在线免费 | 欧洲成人在线视频 | 99久久免费国产精精品 | 丁香激情六月 | 日本婷婷 | 爱啪啪网站| 2022国产精品最新在线 | 永久免费视频网站在线观看 | 韩国xxxx色视频在线观看 | 国产精品视频网 | h国产| 天天爽天天摸 | 999视频在线播放777 | 免费人成又黄又爽的视频强 | 无遮挡免费视频 | 700av第一福利在线导航 |