標籤:
package cn.com;import java.util.List;import redis.clients.jedis.Jedis;import redis.clients.jedis.Transaction;public class Redis_Transactions {public static Jedis redis = new Jedis("localhost", 6379);// 串連redis/** * 基本事務用法 * 預設給user1,user2都初始化為1000 * 開啟事務 * 給user:1:money 加一 * 給user:2:money 減一 * 執行事務 * */public static void base_trans() throws InterruptedException{redis.flushDB();//清除資料redis.set("money", "1000");redis.set("money1", "1000"); long start = System.currentTimeMillis(); Transaction tx = redis.multi(); tx.incr("money");//給使用者user:1 加一塊錢 tx.decr("money1");//給使用者user:1 減一塊錢 List<Object> results = tx.exec(); long end = System.currentTimeMillis(); System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds"); System.out.println(redis.get("money")); System.out.println(redis.get("money1")); redis.disconnect(); }/** * 使用者事務 * 預設給user1,user2都初始化為1000 * 開啟事務 * 給user:1:money 加一 * 給user:2:money 減一 * 我們user:2:money 的值是a 是無法執行減1 的操作 那是否還是照樣執行 * 因為redis事務是比較簡單的,像下面這種問題需要開發人員自己控制,redis 事務是不做控制的 * */public static void user_trans() throws InterruptedException{redis.flushDB();//清除資料redis.set("user:1:money", "1000");redis.set("user:2:money", "a"); long start = System.currentTimeMillis(); Transaction tx = redis.multi(); tx.incr("user:1:money");//給使用者user:1 加一塊錢 tx.decr("user:2:money");//給使用者user:1 減一塊錢 List<Object> results = tx.exec(); long end = System.currentTimeMillis(); System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds"); System.out.println(redis.get("user:1:money")); System.out.println(redis.get("user:2:money")); redis.disconnect(); }/** * 執行事務的過程其他用戶端改變了其中的key值,解決資料一致性問題 * 通過watch 對key的監控來實現其他用戶端修改資料後,事務取消 * 用法 首先用watch 開始對key的監控 在開啟事務,順序一定要先監控在執行事務 * */public static void changedata_trans() throws InterruptedException{redis.flushDB();//清除資料redis.set("user:1:money", "1000");redis.set("user:2:money", "1000"); long start = System.currentTimeMillis(); redis.watch("user:1:money"); Transaction tx = redis.multi(); tx.incr("user:1:money");//給使用者user:1 加一塊錢 tx.decr("user:2:money");//給使用者user:1 減一塊錢 changedata();//改變資料的方法 List<Object> results = tx.exec(); long end = System.currentTimeMillis(); System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds"); System.out.println(redis.get("user:1:money")); System.out.println(redis.get("user:2:money")); redis.disconnect(); }/** * 類比新開用戶端對事務中監控的key對應的元素進行修改 * * **/public static void changedata(){ Jedis redis2 = new Jedis("localhost", 6379);// 串連redis redis2.set("user:1:money", "8888");} public static void main(String [] args) throws InterruptedException{changedata_trans(); }}
Redis學習筆記(7)-事務