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;
    }


}

 

posted on 2019-05-19 22:43  溪水静幽  阅读(270)  评论(0)    收藏  举报