From c24f3a86fbeb65bfa52a898a40138feefa2ec485 Mon Sep 17 00:00:00 2001 From: Achilles Date: Tue, 9 Jan 2024 16:51:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 155 +++++++++++------- 1 file changed, 94 insertions(+), 61 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 2f04b8d..238d26d 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -6,8 +6,11 @@ import cn.stock.market.domain.basic.repository.MoneyStockRepository; import cn.stock.market.dto.StockHistoryRequest; import cn.stock.market.dto.StockHistoryResponse; import cn.stock.market.infrastructure.db.po.QMoneyStockPO; +import cn.stock.market.utils.RequestCacheUtils; import cn.stock.market.utils.ServerResponse; import com.alibaba.fastjson.JSONObject; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -36,6 +39,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -499,21 +503,30 @@ public class MoneyApiController { @ResponseBody public List getTopGainer(@RequestParam String stockType) { List moneyStockSuggestDTOS = null; - if(StringUtils.equals(stockType,"nse")){ - moneyStockSuggestDTOS = nseGainer(); - }else if(StringUtils.equals(stockType,"bse")){ - moneyStockSuggestDTOS = bseGainer(); - } - moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); - if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); - } + // 尝试从缓存中获取结果 + moneyStockSuggestDTOS = gainerStockSuggestCache.getIfPresent(stockType); + + if (moneyStockSuggestDTOS == null) { + // 缓存未命中,执行业务查询 + if (StringUtils.equals(stockType, "nse")) { + moneyStockSuggestDTOS = nseGainer(); + } else if (StringUtils.equals(stockType, "bse")) { + moneyStockSuggestDTOS = bseGainer(); } + + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); + } + } + gainerStockSuggestCache.put(stockType, moneyStockSuggestDTOS); + } + // 将结果放入缓存 } return moneyStockSuggestDTOS; } @@ -531,35 +544,36 @@ public class MoneyApiController { @ResponseBody public List getTopLoser(@RequestParam String stockType) { List moneyStockSuggestDTOS = null; - if(StringUtils.equals(stockType,"nse")){ - moneyStockSuggestDTOS = nseTopLoser(); - }else if(StringUtils.equals(stockType,"bse")){ - moneyStockSuggestDTOS = bseTopLoser(); - } - moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); - List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); - if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); - } - List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(noScIdList)){ - List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); - List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); - if(CollectionUtils.isNotEmpty(all1)){ - moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + moneyStockSuggestDTOS = loserStockSuggestCache.getIfPresent(stockType); + if(null==moneyStockSuggestDTOS){ + if(StringUtils.equals(stockType,"nse")){ + moneyStockSuggestDTOS = nseTopLoser(); + }else if(StringUtils.equals(stockType,"bse")){ + moneyStockSuggestDTOS = bseTopLoser(); + } + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); + } + List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(noScIdList)){ + List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); + List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); + if(CollectionUtils.isNotEmpty(all1)){ + moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + } } } + loserStockSuggestCache.put(stockType, moneyStockSuggestDTOS); } } - - - return moneyStockSuggestDTOS; } @@ -578,30 +592,34 @@ public class MoneyApiController { @ResponseBody public List getTopActive(@RequestParam String stockType) { List moneyStockSuggestDTOS = null; - if(StringUtils.equals(stockType,"nse")){ - moneyStockSuggestDTOS = nseActives(); - }else if(StringUtils.equals(stockType,"bse")){ - moneyStockSuggestDTOS = bseActives(); - } - moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); - List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); - if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); - } - List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(noScIdList)){ - List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); - List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); - if(CollectionUtils.isNotEmpty(all1)){ - moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + moneyStockSuggestDTOS = activesStockSuggestCache.getIfPresent(stockType); + if(moneyStockSuggestDTOS ==null){ + if(StringUtils.equals(stockType,"nse")){ + moneyStockSuggestDTOS = nseActives(); + }else if(StringUtils.equals(stockType,"bse")){ + moneyStockSuggestDTOS = bseActives(); + } + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); + } + List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(noScIdList)){ + List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); + List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); + if(CollectionUtils.isNotEmpty(all1)){ + moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + } } } + activesStockSuggestCache.put(stockType, moneyStockSuggestDTOS); } } @@ -724,4 +742,19 @@ public class MoneyApiController { bseTopLoser(); } + private Cache> gainerStockSuggestCache = CacheBuilder.newBuilder() + .maximumSize(100) // 设置缓存的最大大小 + .expireAfterWrite(1, TimeUnit.HOURS) // 设置缓存条目的过期时间 + .build(); + + private Cache> loserStockSuggestCache = CacheBuilder.newBuilder() + .maximumSize(100) // 设置缓存的最大大小 + .expireAfterWrite(1, TimeUnit.HOURS) // 设置缓存条目的过期时间 + .build(); + + private Cache> activesStockSuggestCache = CacheBuilder.newBuilder() + .maximumSize(100) // 设置缓存的最大大小 + .expireAfterWrite(1, TimeUnit.MINUTES) // 设置缓存条目的过期时间 + .build(); + }