场景描述:在大并发量下每秒有一万个请求向后端查询数据,这样我们就需要向后端请求一万次,甚至查询一万次数据库。我们要做的请求合并就是每隔一段时间(10ms)将这段时间内的请求合并到一起进行批量查询,减少查询数据库的次数。
思考:
1、如何存放一段时间内的请求?这里我们可以用队列。
2、如何每隔一段时间执行任务?用定时任务线程池。
3、每个请求都是单独的线程,如何保证各个请求能得到自己的查询结果?这里我们使用callable返回查询结果,在没有查到结果前阻塞线程。
下面来看看具体实现的demo
package cn.codingxiaxw.combine;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.stream.Collectors;
@Service
public class QueryService {
//用来存放请求的队列,我们将请求封装成了一个Request对象
private LinkedBlockingQueue<Request> queue = new LinkedBlockingQueue<>() ;
//这个是我们的单个的查询方法,假设每隔请求都根据唯一的code进行查询
public Map<String,Object> query<