MatchRedisUtil.java

package yzr.pro.consumer.server.util;

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import yzr.com.service.IService;
import yzr.common.cache.JedisSingleHandle;
import yzr.common.model.vct.Order;
import yzr.common.util.StringUtil;
import yzr.pro.consumer.server.matcher.MatchPublicMethod;

public class MatchRedisUtil {
    
    private static JedisSingleHandle jedis = new JedisSingleHandle();
    
    /**
     * 将交易单 放入redis的Zset
     */
    public static void putOrderToRedisZset(Order order, String code, String sset_name_prefix, IService vctOpenService) {
        // 把交易单号放入redis的zset中:
        String sset_name = sset_name_prefix + "_"+order.getCoinId() + "_"+order.getCurrencyId();
        Set<String> samePriceOrderSet = jedis.zrangeByScore(sset_name, order.getPrice().doubleValue(),
                order.getPrice().doubleValue());
        if (samePriceOrderSet == null || samePriceOrderSet.isEmpty()) {
            // 如果队列没有相同价格的卖出交易,则直接将交易单加入队列。
            jedis.zadd(sset_name, order.getPrice().doubleValue(), code);
        }
        else { // 如果队列有相同价格的交易,则需要将交易单附加在后面。
            Iterator<String> orderIterator = samePriceOrderSet.iterator();
            String samePriceOrderList = null;
            int i = 0;
            while (orderIterator.hasNext()) {
                samePriceOrderList = orderIterator.next();
                i++;
                jedis.zrem(sset_name, samePriceOrderList); // 先需要删除 包含成交的交易单的zset
            }
            //
            if (i > 1) { // 找到了多个orderList,则从数据库重现组织此price的交易单列表:
                samePriceOrderList = MatchPublicMethod.getAllNotFinishOrder(vctOpenService,
                        order.getCoinId(), order.getCurrencyId(), order.getPrice(), order.getType());
            }
            //
            String onePriceOrderList_new = null;
            if (samePriceOrderList == null || samePriceOrderList.trim().isEmpty()) {
                onePriceOrderList_new = code;
            }
            else if (samePriceOrderList.contains(code)) {
                onePriceOrderList_new = samePriceOrderList;
            }
            else {
                onePriceOrderList_new = samePriceOrderList + ","+code;
            }
            //
            jedis.zadd(sset_name, order.getPrice().doubleValue(), onePriceOrderList_new);
        }
    }
    
    /**
     * 从redis的zset中移除 该交易单号
     */
    public static void removeOrderFromRedisZset(String sset_name_match, Double price, String code,
            int type, Long coinId, Long currencyId, IService vctOpenService) {
        Set<String> match_set = jedis.zrangeByScore(sset_name_match, price, price);
        if (match_set == null || match_set.isEmpty()) {
            return;
        }
        //
        Iterator<String> orderIterator = match_set.iterator();
        String onePriceOrderList = null;
        int i = 0;
        while (orderIterator.hasNext()) {
            onePriceOrderList = orderIterator.next();
            i++;
            jedis.zrem(sset_name_match, onePriceOrderList); // 先需要删除 包含成交的交易单的zset
        }
        //
        String onePriceOrderList_new = null;
        if (i == 1) { // 只找到了一个orderList(正常情况)
            onePriceOrderList_new = StringUtil.replaceCode(onePriceOrderList, code);
        }
        else { // 找到了多个orderList,则从数据库重现组织此price的交易单列表:
            if (vctOpenService != null) { // 可以从数据库读数据
                onePriceOrderList_new = MatchPublicMethod.getAllNotFinishOrder(vctOpenService,
                        coinId, currencyId, BigDecimal.valueOf(price), type);
            }
            else {
                onePriceOrderList_new = StringUtil.replaceCode(onePriceOrderList, code);
            }
        }
        //
        if (onePriceOrderList_new != null && !onePriceOrderList_new.trim().isEmpty()) {
            jedis.zadd(sset_name_match, price, onePriceOrderList_new);
        }
    }
    
//    public static void main(String[] args) {
//        Set<String> orderSet = new HashSet<String>();
//        orderSet.add("AA");
//        orderSet.add("BB");
//        orderSet.add("CC");
//        System.out.println(orderSet.toString());
//    }

}

posted @ 2018-04-03 17:31  涓水之子  阅读(82)  评论(0)    收藏  举报