redis事务场景
package com.smart.InAction; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; import redis.clients.jedis.Tuple; import java.util.List; import java.util.Map; import java.util.Set; public class Market { public static void main(String[] args){ Jedis conn = new Jedis("192.168.223.132"); conn.auth("admin"); conn.select(0); testListItem(conn); testPurchaseItem(conn); } public static void testListItem(Jedis conn){ System.out.println("---------item list----------------"); String user="userX"; String item="itemX"; conn.sadd("inventory:"+user,item); Set<String> smembers = conn.smembers("inventory:" + user); for (String sm : smembers){ System.out.println(sm); } System.out.println(); System.out.println("Listing the item..."); boolean l = addMarket(conn, user, item, 10); System.out.println("Listing the item succeeded? " + l); Set<Tuple> tuples = conn.zrangeWithScores("market:", 0, -1); for(Tuple t: tuples){ System.out.println(t.getElement()+"-----------------"+t.getScore()); } } /** * 将用户的商品添加到商场上 * @param conn * @param sellerId * @param itemId * @param price */ public static boolean addMarket(Jedis conn,String sellerId,String itemId,double price){ String inventory="inventory:"+sellerId; String item=itemId+"."+sellerId; long end=System.currentTimeMillis()+5000; while (System.currentTimeMillis()<end){ conn.watch(inventory); if(!conn.sismember(inventory,itemId)){ conn.unwatch(); return false; } Transaction trans = conn.multi(); trans.zadd("market:",price,item); trans.srem(inventory,itemId); List<Object> result = trans.exec(); if(result==null){ // null response indicates that the transaction was aborted due to // the watched key changing. continue; } return true; } return false; } /** * 购买商品 * @param conn */ public static void testPurchaseItem(Jedis conn){ System.out.println("\n----- testPurchaseItem -----"); conn.hset("users:userY", "funds", "125"); Map<String, String> buyers = conn.hgetAll("users:userY"); System.out.println("--------buyers has some money-------"); for(Map.Entry<String,String> entry: buyers.entrySet()){ System.out.println(entry.getKey()+" "+entry.getValue()); } boolean p = purchaseItem(conn, "userY", "itemX", "userX", 10); System.out.println("Purchasing an item succeeded? " + p); Map<String, String> buyer = conn.hgetAll("users:userY"); System.out.println("The buyer left money is"); for(Map.Entry<String,String> entry : buyer.entrySet()){ System.out.println(entry.getKey()+" "+entry.getValue()); } System.out.println("the buyer's inventory is"); String buyerId="userY"; Set<String> smembers = conn.smembers("inventory:" + buyerId); for(String member : smembers){ System.out.println(" "+member); } } private static boolean purchaseItem(Jedis conn, String buyerId, String itemId, String sellerId, int lprice) { String buyer="users:"+buyerId; String seller="users:"+sellerId; String item=itemId+"."+sellerId; String inventory="inventory:"+buyerId; long end=System.currentTimeMillis()+10000; while(System.currentTimeMillis()<end){ conn.watch("market:",buyer); double price = conn.zscore("market:", item); double funds = Double.parseDouble(conn.hget(buyer, "funds")); if(price!=lprice || price > funds){ conn.unwatch(); return false; } Transaction trans = conn.multi(); trans.hincrBy(seller,"funds",(int)price); trans.hincrBy(buyer,"funds",(int)-price); trans.sadd(inventory,itemId); trans.zrem("market:",itemId); List<Object> result = trans.exec(); // null response indicates that the transaction was aborted due to // the watched key changing. if(result ==null){ continue; } return true; } return false; } }
立志如山 静心求实
浙公网安备 33010602011771号