无码视频在线观看,99人妻,国产午夜视频,久久久久国产一级毛片高清版新婚

  • 始創(chuàng)于2000年 股票代碼:831685
    咨詢熱線:0371-60135900 注冊有禮 登錄
    • 掛牌上市企業(yè)
    • 60秒人工響應(yīng)
    • 99.99%連通率
    • 7*24h人工
    • 故障100倍補(bǔ)償
    全部產(chǎn)品
    您的位置: 網(wǎng)站首頁 > 幫助中心>文章內(nèi)容

    Redis數(shù)據(jù)庫高級實用特性:事務(wù)控制

    發(fā)布時間:  2012/8/7 18:07:33

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

    1、簡單事務(wù)控制

    下面可以看一個例子:

    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命令發(fā)出后并沒執(zhí)行而是被放到了隊列中。調(diào)用exec后2個命令才被連續(xù)的執(zhí)行,最后返回的是兩條命令執(zhí)行后的結(jié)果。

    2、如何取消一個事務(wù)

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

    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> 

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

    3、樂觀鎖復(fù)雜事務(wù)控制

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

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

    此時,將提交數(shù)據(jù)的版本號與數(shù)據(jù)庫表對應(yīng)記錄的當(dāng)前版本號進(jìn)行比對,如果提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當(dāng)前版本號,則予以更新,否則認(rèn)為是過期數(shù)據(jù)。

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

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

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

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

    Redis樂觀鎖實例:

    假設(shè)有一個age的key,我們開2個session來對age進(jìn)行賦值操作,我們來看一下結(jié)果如何。

    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的值進(jìn)行修改

    第二步,Session 2 已經(jīng)將age的值設(shè)為30

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

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

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

    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由于是個數(shù)字,那么它可以有自增運(yùn)算,但是name是個字符串,無法對其進(jìn)行自增運(yùn)算,所以會報錯,如果按傳統(tǒng)關(guān)系型數(shù)據(jù)庫的思路來講,整個事務(wù)都會回滾,但是我們看到redis卻是將可以執(zhí)行的命令提交了,所以這個現(xiàn)象對于習(xí)慣于關(guān)系型數(shù)據(jù)庫操作的朋友來說是很別扭的,這一點也是redis今天需要改進(jìn)的地方。


    本文出自:億恩科技【mszdt.com】

    服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經(jīng)營性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經(jīng)營性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經(jīng)營性ICP/ISP證:贛B2-20080012
  • 服務(wù)器/云主機(jī) 24小時售后服務(wù)電話:0371-60135900
  • 虛擬主機(jī)/智能建站 24小時售后服務(wù)電話:0371-60135900
  • 專注服務(wù)器托管17年
    掃掃關(guān)注-微信公眾號
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號總部企業(yè)基地億恩大廈  法律顧問:河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號
      1
     
     
     
     

    0371-60135900
    7*24小時客服服務(wù)熱線