Redis 事務(wù)知識點(diǎn)相關(guān)總結(jié)
Redis中的事務(wù)介紹
MySQL中的事務(wù)大家都不陌生,Redis中的事務(wù)和MySQL中的事務(wù)不同,今天看下Redis事務(wù)中的一些知識點(diǎn)吧。
01 事務(wù)簡介
Redis中的事務(wù)使用multi、exec來標(biāo)記,其中multi代表事務(wù)開始,exec代表事務(wù)結(jié)束,multi和exec之間的命令是原子順序執(zhí)行的。下面是一個例子:
127.0.0.1:7397> multi OK 127.0.0.1:7397> set key_hello hello QUEUED 127.0.0.1:7397> set key_world world QUEUED 127.0.0.1:7397> exec 1) OK 2) OK
需要注意的是,命令執(zhí)行的中間結(jié)果返回都是queued,也就是說放到了隊(duì)列里面,沒有真正執(zhí)行。在exec之前,如果使用get命令來查看當(dāng)前的key_hello或者key_world的值,是無法獲取到的。
02 命令錯誤導(dǎo)致的事務(wù)提交失敗,所有命令都不執(zhí)行
如果調(diào)用API的時(shí)候,拼寫錯誤,則會造成整個事務(wù)無法執(zhí)行,例如下面的例子:
127.0.0.1:7397> multi OK 127.0.0.1:7397> incr counter QUEUED 127.0.0.1:7397> sett key_a aa (error) ERR unknown command `sett`, with args beginning with: `key_a`, `aa`, 127.0.0.1:7397> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:7397> get counter "10"
可以看到,因?yàn)閟et拼寫錯誤,寫成了sett,整個事務(wù)內(nèi)部的所有動作都失效。exec命令也報(bào)錯。
03 運(yùn)行時(shí)錯誤導(dǎo)致數(shù)據(jù)錯誤
如果語法正確,但是在運(yùn)行的時(shí)候出現(xiàn)了"運(yùn)行時(shí)"錯誤,例如元素的類型和操作符不匹配,例如對字符型值進(jìn)行自增操作,如下:
127.0.0.1:7397> get key_a "a" 127.0.0.1:7397> get key_b "b" 127.0.0.1:7397> multi OK 127.0.0.1:7397> incr key_a QUEUED 127.0.0.1:7397> set key_b bbb QUEUED 127.0.0.1:7397> exec 1) (error) ERR value is not an integer or out of range 2) OK 127.0.0.1:7397> get key_b "bbb"
對key_a進(jìn)行自增這類錯誤,它的語法是正確的,但是由于key_a是字符型的,自增操作是不合適的,事務(wù)中還對key_b進(jìn)行了賦值操作,在執(zhí)行exec的時(shí)候,key_b的值是被修改的,從"b"變成了“bbb”。
04 丟棄事務(wù)
直接看例子,在執(zhí)行的最后,使用discard關(guān)鍵字對事務(wù)進(jìn)行丟棄,那么事務(wù)執(zhí)行過程中產(chǎn)生的key是沒有值的。
127.0.0.1:7397> multi OK 127.0.0.1:7397> set key_aa aa QUEUED 127.0.0.1:7397> set key_bb bb QUEUED 127.0.0.1:7397> set key_cc cc QUEUED 127.0.0.1:7397> discard OK 127.0.0.1:7397> get key_aa (nil) 127.0.0.1:7397> get key_bb (nil) 127.0.0.1:7397> get key_cc (nil)
05 watch命令
有些場景中,需要在事務(wù)之前,確保事務(wù)中的key沒有被其他客戶端修改過,才執(zhí)行事務(wù),否則不執(zhí)行事務(wù),redis提供了watch命令來解決這類問題。
正確場景:
127.0.0.1:7397> watch key_a OK 127.0.0.1:7397> multi OK 127.0.0.1:7397> set key_a aaa QUEUED 127.0.0.1:7397> exec 1) OK 127.0.0.1:7397> get key_a "aaa"
使用watch監(jiān)控key_a的值,在exec之前,key_a的值沒有被其他事務(wù)修改過,那么exec的結(jié)果是成功的。
錯誤場景:
127.0.0.1:7397> watch key_a OK 127.0.0.1:7397> get key_a "aaa" ---------------------------------------- 此時(shí)在另外一個session上執(zhí)行set key_a aaaaaa ---------------------------------------- 127.0.0.1:7397> multi OK 127.0.0.1:7397> set key_a a QUEUED 127.0.0.1:7397> exec (nil)
在watch的過程中,其他session對key_a的值進(jìn)行了修改,那么會造成exec執(zhí)行失敗,返回nil
06 總結(jié)
1、Redis事務(wù)就是一次性、順序性、排他性的執(zhí)行一個隊(duì)列中的一系列命令,分為三個過程:開始事務(wù)、命令入隊(duì)、執(zhí)行事務(wù)。
2、Redis提供了簡單的事務(wù),使用multi、exec、discard這三個命令來控制
3、exec命令前,所有的原子操作都被放在隊(duì)列中緩存,并不會真正執(zhí)行
4、Redis事務(wù)不存在隔離級別的概念
5、事務(wù)中的單條命令是原子執(zhí)行的,但是事務(wù)本身不保證原子性,沒有回滾機(jī)制
以上就是Redis 事務(wù)相關(guān)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Redis 事務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis實(shí)現(xiàn)排行榜及相同積分按時(shí)間排序功能的實(shí)現(xiàn)
這篇文章主要介紹了Redis實(shí)現(xiàn)排行榜及相同積分按時(shí)間排序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
redis-cli創(chuàng)建redis集群的實(shí)現(xiàn)
本文主要介紹了redis-cli創(chuàng)建redis集群的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
詳談redis跟數(shù)據(jù)庫的數(shù)據(jù)同步問題
文章討論了在Redis和數(shù)據(jù)庫數(shù)據(jù)一致性問題上的解決方案,主要比較了先更新Redis緩存再更新數(shù)據(jù)庫和先更新數(shù)據(jù)庫再更新Redis緩存兩種方案,文章指出,刪除Redis緩存后再更新數(shù)據(jù)庫的方案更優(yōu),因?yàn)樗梢员苊鈹?shù)據(jù)不一致的問題,但可能產(chǎn)生高并發(fā)問題2025-01-01
redis在Linux系統(tǒng)下的環(huán)境配置和redis的全局命令大全
在Linux系統(tǒng)中我們經(jīng)常使用Redis作為高性能的緩存數(shù)據(jù)庫,然而有時(shí)候我們需要在系統(tǒng)中多個地方使用Redis命令,這就需要將Redis的全局命令設(shè)置好,這篇文章主要給大家介紹了關(guān)于redis在Linux系統(tǒng)下的環(huán)境配置和redis的全局命令大全的相關(guān)資料,需要的朋友可以參考下2024-05-05
Redis分布式鎖的實(shí)現(xiàn)方式(redis面試題)
這篇文章主要介紹了Redis分布式鎖的實(shí)現(xiàn)方式(面試常見),需要的朋友可以參考下2020-01-01
Redis 事務(wù)知識點(diǎn)相關(guān)總結(jié)
這篇文章主要介紹了Redis 事務(wù)相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Redis,感興趣的朋友可以了解下2021-03-03

