google cache

package io.bhex.broker.server.grpc.server.service.statistics;

import com.google.common.base.Strings;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import io.bhex.base.token.GetTokenRequest;
import io.bhex.base.token.TokenDetail;
import io.bhex.broker.common.util.JsonUtil;
import io.bhex.broker.grpc.statistics.FinanceRealTime;
import io.bhex.broker.grpc.statistics.FinanceRealTimeResponse;
import io.bhex.broker.server.domain.RateBo;
import io.bhex.broker.server.grpc.client.service.GrpcTokenService;
import io.bhex.broker.server.model.Symbol;
import io.bhex.broker.server.statistics.clear.mapper.StatisticsClearOdsMapper;
import io.bhex.broker.server.statistics.statistics.mapper.StatisticsOdsMapper;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import xyz.coins.commonutils.JsonConvertor;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

/**

  • @author wangsc

  • @description 统计Ods服务

  • @date 2020-06-19 19:59
    */
    @Service
    @Slf4j
    public class StatisticsOdsService {

    @Resource
    private StatisticsOdsMapper statisticsOdsMapper;

    @Resource
    private StatisticsClearOdsMapper statisticsClearOdsMapper;

    @Resource
    private GrpcTokenService grpcTokenService;

    private final Integer PH_DEPOSIT = 701;
    private final Integer PH_WITHDRAWAL = 702;
    private final Integer FIAT_DEPOSIT = 12;
    private final Integer FIAT_WITHDRAWAL = 22;
    private final Integer CHAIN_DEPOSIT = 10;
    private final Integer CHAIN_WITHDRAWAL = 20;
    private final Integer BUY_LOAD = 16;
    private final Integer PAY_BILL = 17;
    private final Integer INVOICE_PAY = 24;

    private LoadingCache<String, RateBo> TOKEN_RATE_CACHE;

    private LoadingCache<String, BigDecimal> BALANCE_FLOW_CACHE;

    @Resource
    @Qualifier("quoteRedisTemplate")
    private RedisTemplate quoteRedisTemplate;

    private final String RATE_KEY = "MKT:QUOTE:RATE";

    private final RateBo NULL = new RateBo();

    @PostConstruct
    public void init() {
    TOKEN_RATE_CACHE = CacheBuilder.newBuilder()
    .refreshAfterWrite(60, TimeUnit.SECONDS)
    .maximumSize(1000)
    .build(new CacheLoader<>() {
    @Override
    public RateBo load(String token) {
    try {
    Object tokenObj = quoteRedisTemplate.opsForHash().get(RATE_KEY, token);
    if (Objects.isNull(tokenObj)) {
    return NULL;
    }
    log.info("tokenObj,{}",tokenObj.toString());
    return JsonConvertor.fromJsonString(tokenObj.toString(), RateBo.class);
    } catch (Exception e) {
    log.error("loadExchangeRateFromRedis error.", e);
    }
    return NULL;
    }
    });

     BALANCE_FLOW_CACHE = CacheBuilder.newBuilder()
             .refreshAfterWrite(60, TimeUnit.SECONDS)
             .maximumSize(1000)
             .build(new CacheLoader<>() {
                 @Override
                 public BigDecimal load(String key) {
                     String[] split = key.split("#");
                     Integer type = Integer.valueOf(split[0]);
                     BigDecimal money = statisticsClearOdsMapper.groupBySubject(type,split[1],split[2],split[3]);
                     return money == null ? BigDecimal.ZERO:money;
                 }
             });
    

    }

    public BigDecimal getRate(String baseToken, String quoteToken) {
    if (baseToken.equalsIgnoreCase(quoteToken)) {
    return BigDecimal.ONE;
    }
    try {
    RateBo rateBo = TOKEN_RATE_CACHE.get(baseToken);
    if (rateBo != null) {
    return rateBo.getRate(quoteToken);
    }
    } catch (Exception e) {
    log.error("getRate error.{},quoteToken.{},message.{}", baseToken, quoteToken, e.getMessage());
    }
    return BigDecimal.ZERO;
    }

}

Avatar

Model: