事務
3.1基本概念
事務的本質(zhì):一組命令的集合,一個事務中的所有命令都會被序列化,在事務的執(zhí)行過程中,會按照順序執(zhí)行。
一次性,順序性,排他性 執(zhí)行一些命令
---隊列 set set set 執(zhí)行---
redis事務沒有隔離級別的概念。所有的命令在事務中,并沒有直接被執(zhí)行,只有發(fā)起執(zhí)行命令的時候才會執(zhí)行!EXCUTE
redis單條命令是保證原子性,但是redis事務是不保證原子性的
redis的事務:
開啟事務(multi)
命令入隊(其他命令。。。。)
執(zhí)行事務(exec)
取消事務(discard)
eg:
127.0.0.1:6379> multi 開啟事務
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> setbit mybit 1 0
QUEUED
127.0.0.1:6379(TX)> setbit mybit 0 1
QUEUED
127.0.0.1:6379(TX)> setbit mybit 2 1
QUEUED
127.0.0.1:6379(TX)> getbit mybit 1
QUEUED
127.0.0.1:6379(TX)> BITCOUNT mybit 0 -1
QUEUED
127.0.0.1:6379(TX)> exec 執(zhí)行事務
?1)OK
?2)OK
?3)OK
?4)"v1"
?5)"v2"
?6)(integer) 0
?7)(integer) 0
?8)(integer) 1
?9)(integer) 0
10) (integer) 2
取消事務
eg:
127.0.0.1:6379> multi 開始事務
OK
127.0.0.1:6379(TX)> set k2 1
QUEUED
127.0.0.1:6379(TX)> set k3 3
QUEUED
127.0.0.1:6379(TX)> DISCARD 取消事務
OK
?事務隊列中命令都不會被執(zhí)行
編譯型異常(代碼有問題,命令有錯),事務中所有的命令都不會執(zhí)行
eg:
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> get k3
QUEUED
127.0.0.1:6379(TX)> setbit mybit 1 0
QUEUED
127.0.0.1:6379(TX)> setbit mybit 0 0
QUEUED
127.0.0.1:6379(TX)> getbit 1? //執(zhí)行事務報錯
(error) ERR wrong number of arguments for'getbit' command
127.0.0.1:6379(TX)> getbit mybit 1
QUEUED
127.0.0.1:6379(TX)> BITCOUNT mybit 0 -1
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discardedbecause of previous errors.? //所有的命令都不會被執(zhí)行
運行時異常,如果事務隊列中存在語法性錯誤,那么執(zhí)行命令的時候,其他命令是可以正常執(zhí)行的,錯誤命令拋出異常
eg:
127.0.0.1:6379> set k1"dfa"? //將k1設置為一個字符串,
OK
127.0.0.1:6379> multi //開始事務
OK
127.0.0.1:6379(TX)> set k2 2
QUEUED
127.0.0.1:6379(TX)> set k3 3
QUEUED
127.0.0.1:6379(TX)> incr k1 //將k1 加1,執(zhí)行的時候失敗
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> exec //執(zhí)行
1) OK
2) OK
3) (error) ERR value is not an integer or
out of range //其他命令正常執(zhí)行,只有這個命令報錯
4) "dfa"
5) "2"
3.2 監(jiān)視watch / 實現(xiàn)樂觀鎖
樂觀鎖:認為什么時候都不會出問題,所以會上鎖。更新數(shù)據(jù)的時候去判斷一下,在此期間是否有人修改過這個數(shù)據(jù)
獲取version,更改的時候比較version
悲觀鎖:執(zhí)行什么都加鎖
監(jiān)視:watch
watch [key...] 可以同時監(jiān)視多個變量,加鎖
unwatch?解鎖,如果修改值失敗,就先解鎖,然后重新獲取最近的值,再進行操作
四 .Jedis
Jedis:是redis官方推薦的java連接開發(fā)工具,使用Java操作redis中間件,應十分熟悉
我們使用java來操作redis
SpringBoot整合
之后再來補充這塊內(nèi)容