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());
// }
}
浙公网安备 33010602011771号