成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis數據庫高級實用特性:事務控制

運維 數據庫運維 其他數據庫 Redis
在這篇文章中將為大家介紹Redis高級實用特性中的事務控制特性。

Redis對事務的支持目前還比較簡單。redis只能保證一個client發起的事務中的命令可以連續的執行,而中間不會插入其他client的命令。 由于redis是單線程來處理所有client的請求的所以做到這點是很容易的。一般情況下redis在接受到一個client發來的命令后會立即處理并 返回處理結果,但是當一個client在一個連接中發出multi命令有,這個連接會進入一個事務上下文,該連接后續的命令并不是立即執行,而是先放到一個隊列中。當從此連接受到exec命令后,redis會順序的執行隊列中的所有命令。并將所有命令的運行結果打包到一起返回給client.然后此連接就 結束事務上下文。

1、簡單事務控制

  下面可以看一個例子:

  1. redis 127.0.0.1:6379> get age 
  2. "33" 
  3. redis 127.0.0.1:6379> multi 
  4. OK 
  5. redis 127.0.0.1:6379> set age 10 
  6. QUEUED 
  7. redis 127.0.0.1:6379> set age 20 
  8. QUEUED 
  9. redis 127.0.0.1:6379> exec 
  10. 1) OK 
  11. 2) OK 
  12. redis 127.0.0.1:6379> get age 
  13. "20" 
  14. redis 127.0.0.1:6379> 

  從這個例子我們可以看到2個set age命令發出后并沒執行而是被放到了隊列中。調用exec后2個命令才被連續的執行,最后返回的是兩條命令執行后的結果。

2、如何取消一個事務

  我們可以調用discard命令來取消一個事務,讓事務回滾。接著上面例子:

  1. redis 127.0.0.1:6379> get age 
  2. "20" 
  3. redis 127.0.0.1:6379> multi 
  4. OK 
  5. redis 127.0.0.1:6379> set age 30 
  6. QUEUED 
  7. redis 127.0.0.1:6379> set age 40 
  8. QUEUED 
  9. redis 127.0.0.1:6379> discard 
  10. OK 
  11. redis 127.0.0.1:6379> get age 
  12. "20" 
  13. redis 127.0.0.1:6379> 

可以發現這次2個set age命令都沒被執行。discard命令其實就是清空事務的命令隊列并退出事務上下文,也就是我們常說的事務回滾。

  3、樂觀鎖復雜事務控制

  在本小節開始前,我們有必要向讀者朋友簡單介紹一下樂觀鎖的概念,并舉例說明樂觀鎖是怎么工作的。

  樂觀鎖:大多數是基于數據版本(version)的記錄機制實現的。何謂數據版本?即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表添加一個 “version”字段來實現讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號加1。

  此時,將提交數據的版本號與數據庫表對應記錄的當前版本號進行比對,如果提交的數據版本號大于數據庫表當前版本號,則予以更新,否則認為是過期數據。

  樂觀鎖實例:假設數據庫中帳戶信息表中有一個version字段,當前值為1;而當前帳戶余額字段(balance)為$100。下面我們將用時序表的方式來為大家演示樂觀鎖的實現原理:

操作員A
操作員B
(1)、操作員A此時將用戶信息讀出(此時version=1),并準備從其帳戶余額中扣除$50($100-$50)
(2)、在操作員A操作的過程中,操作員B也讀入此用戶信息(此時version=1),并準備從其帳戶余額中扣除$20($100-$20)
(3)、操作員A完成了修改工作,將數據版本號加1(此時version=2),連同帳戶扣除后余額(balance=$50),提交至數據庫更新,此時由于提交數據版本大于數據庫記錄當前版本,數據被更新,數據庫記錄version更新為2
 
 
 
(4)、操作員B完成了操作,也將版本號加1(version=2)并試圖向數據庫提交數據(balance=$80),但此時比對數據庫記錄版本時發現,操作員B提交的數據版本號為2,數據庫記錄當前版本也為2,不滿足“提交版本必須大于記錄當前版本才能執行更新”的樂觀鎖策略,因此,操作員B的提交被駁回

   這樣,就避免了操作員B用基于version=1的舊數據修改的結果來覆蓋操作員A的操作結果的可能。

  即然樂觀鎖比悲觀鎖要好很多,redis是否也支持呢?答案是支持, redis從2.1.0開始就支持樂觀鎖了,可以顯式的使用watch對某個key進行加鎖,避免悲觀鎖帶來的一系列問題。

  Redis樂觀鎖實例:

  假設有一個age的key,我們開2個session來對age進行賦值操作,我們來看一下結果如何。

Session 1
Session 2
(1)第1步
redis 127.0.0.1:6379> get age
"10"
redis 127.0.0.1:6379> watch age
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379>
 
 
(2)第2步
redis 127.0.0.1:6379> set age 30
OK
redis 127.0.0.1:6379> get age
"30"
redis 127.0.0.1:6379>
(3)第3步
redis 127.0.0.1:6379> set age 20
QUEUED
redis 127.0.0.1:6379> exec
(nil)
redis 127.0.0.1:6379> get age
"30"
redis 127.0.0.1:6379>
 

   從以上實例可以看到在

  第一步,Session 1 還沒有來得及對age的值進行修改

  第二步,Session 2 已經將age的值設為30

  第三步,Session 1 希望將age的值設為20,但結果一執行返回是nil,說明執行失敗,之后我們再取一下age的值是30,這是由于Session 1中對age加了樂觀鎖導致的。

  watch命令會監視給定的key,當exec時候如果監視的key從調用watch后發生過變化,則整個事務會失敗。也可以調用watch多次監視多個key.這 樣就可以對指定的key加樂觀鎖了。注意watch的key是對整個連接有效的,事務也一樣。如果連接斷開,監視和事務都會被自動清除。當然了exec,discard,unwatch命令都會清除連接中的所有監視。

  redis的事務實現是如此簡單,當然會存在一些問題。第一個問題是redis只能保證事務的每個命令連續執行,但是如果事務中的一個命令失敗了,并不回滾其他命令,比如使用的命令類型不匹配。下面將以一個實例的例子來說明這個問題:

  1. redis 127.0.0.1:6379> get age 
  2. "30" 
  3. redis 127.0.0.1:6379> get name 
  4. "HongWan" 
  5. redis 127.0.0.1:6379> multi 
  6. OK 
  7. redis 127.0.0.1:6379> incr age 
  8. QUEUED 
  9. redis 127.0.0.1:6379> incr name 
  10. QUEUED 
  11. redis 127.0.0.1:6379> exec 
  12. 1) (integer) 31 
  13. 2) (error) ERR value is not an integer or out of range 
  14. redis 127.0.0.1:6379> get age 
  15. "31" 
  16. redis 127.0.0.1:6379> get name 
  17. "HongWan" 
  18. redis 127.0.0.1:6379> 

從這個例子中可以看到,age由于是個數字,那么它可以有自增運算,但是name是個字符串,無法對其進行自增運算,所以會報錯,如果按傳統關系型數據庫的思路來講,整個事務都會回滾,但是我們看到redis卻是將可以執行的命令提交了,所以這個現象對于習慣于關系型數據庫操作的朋友來說是很別扭的,這一點也是redis今天需要改進的地方。

【編輯推薦】

  1. Redis2.6將釋出 新功能一覽
  2. 使用Redis的五個注意事項
  3. Redis高可用性之Failover過渡方案
  4. Redis能干啥?細看11種Web應用場景
  5. 主流NoSQL數據庫之Redis全面評測

責任編輯:彭凡 來源: ITPUB
相關推薦

2023-11-29 16:20:21

2010-09-08 15:55:20

SQL事務特性

2018-07-17 10:58:45

數據庫數據庫事務隔離級別

2012-07-20 09:11:51

2011-08-02 15:04:49

2009-09-24 14:12:22

Hibernate數據

2010-10-08 09:38:55

Android數據庫事

2025-04-08 06:00:00

2024-05-28 00:00:30

Golang數據庫

2017-08-22 17:10:45

數據庫MySQL事務模型

2020-06-17 16:56:36

數據庫MySQL跨行事務

2024-07-10 08:00:00

數據庫流式數據庫

2010-06-13 10:46:52

MySQL 數據庫

2017-10-13 15:06:18

數據庫PostgreSQL特性

2025-01-10 09:25:10

NOSQL數據庫ACID

2018-07-20 11:10:21

數據庫事務隔離性

2009-08-06 18:10:06

C#數據庫事務

2011-08-12 13:33:31

Oracle數據庫自治事務

2023-10-11 08:09:53

事務隔離級別

2018-09-06 14:53:39

數據庫事務隔離隔離級別
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品—区二区三区 | 国产欧美在线视频 | 国产91亚洲精品一区二区三区 | 免费在线观看一级毛片 | 欧美精品一区免费 | 日本a v在线播放 | 欧美福利专区 | 亚洲精品乱码久久久久久按摩 | 日韩在线免费视频 | 日韩av一区二区在线观看 | www.夜夜骑 | 国内久久精品 | 黄色av观看| 伊人精品在线视频 | 国产国拍亚洲精品av | 国产精品污www一区二区三区 | 免费黄色片视频 | 五月天婷婷激情 | 黄视频免费观看 | 亚洲精品国产成人 | 国产一区二区在线免费观看 | 在线黄色网 | 欧美一区二区久久 | 亚洲精品日本 | 99这里只有精品视频 | 久久综合成人精品亚洲另类欧美 | 国产精品久久久久久久免费观看 | av天天爽 | 欧美福利在线 | 91成人| 91影院在线观看 | 久久国产精99精产国高潮 | 日日草天天干 | 男女免费网站 | 日韩欧美精品在线播放 | 一区二区片 | 日日综合 | 亚洲国产精品成人综合久久久 | 国产激情三区 | 亚洲综合二区 | 亚洲午夜精品 |