Redis中的事務及樂觀鎖的實現

 

介紹

    Redis中的事務(transaction)是一組命令的集合。
    事務同命令同樣都是Redis最小的執行單位,一個事務中的命令要麼都執行,要麼都不執行。
    Redis事務的實現須要用到 MULTI 和 EXEC 兩個命令,事務開始的時候先向Redis服務器發送 MULTI 命令,而後依次發送須要在本次事務中處理的命令,最後再發送 EXEC 命令表示事務命令結束。java

事務中的命令

Redis的事務中使用的4個命令:
    1.multi,開啓Redis的事務,置客戶端爲事務態;
    2.exec,提交事務,執行從multi到此命令前的命令隊列,置客戶端爲非事務態;
    3.discard,取消事務,置客戶端爲非事務態;
    4.watch,監視鍵值對,做用時若是事務提交exec時發現監視的監視對發生變化,事務將被取消;redis

樂觀鎖

    樂觀鎖基於CAS思想,是不具備互斥性,不會產生鎖等待而消耗資源,可是須要反覆的重試,但也是由於重試的機制,能比較快的響應。服務器

    redis中能夠使用watch命令會監視給定的key,當exec時候若是監視的key從調用watch後發生過變化,則整個事務會失敗。也能夠調用watch屢次監視多個key。這樣就能夠對指定的key加樂觀鎖了。注意watch的key是對整個鏈接有效的,事務也同樣。若是鏈接斷開,監視和事務都會被自動清除。固然了exec,discard,unwatch命令都會清除鏈接中的全部監視。spa

redis-cli的操做

redis中的操做:.net

127.0.0.1:6379> set locktest 1
OK
127.0.0.1:6379> get locktest
"1"
127.0.0.1:6379> watch locktest
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set locktest 3
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get locktest
"3"
127.0.0.1:6379>

代碼實現

if("OK".equals(jedis.watch(key))){
    String oldData = jedis.get(key);
    Transaction tx = jedis.multi();
    tx.set(key, "new value");
    //transaction do some work
    //if throw some Exception
    //tx.discard();
    List<Object> results = tx.exec();
    if (results != null) {
        flag = true;
        System.out.println("得到樂觀鎖耗時" + ((System.currentTimeMillis() - start) / 1000.0) + "秒");
    } else {
        jedis.unwatch();
    }
}

 

Redis樂觀鎖實現(基於事務型Transaction && watch):code

    https://www.jianshu.com/p/d777eb9f27dfblog

    http://blog.csdn.net/evankaka/article/details/70570200隊列

相關文章
相關標籤/搜索