介紹
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