
复制/** * 请求异步处理的亿级service实现 * @author Administrator * */ @Service("requestAsyncProcessService") publicclass RequestAsyncProcessServiceImpl implements RequestAsyncProcessService { @Override publicvoid process(Request request) { try { // 先做读请求的去重 RequestQueue requestQueue = RequestQueue.getInstance(); Map<Integer, Boolean> flagMap = requestQueue.getFlagMap(); if(request instanceof ProductInventoryDBUpdateRequest) { // 如果是一个更新数据库的请求,那么就将那个productId对应的流量标识设置为true flagMap.put(request.getProductId(), true); } elseif(request instanceof ProductInventoryCacheRefreshRequest) { Boolean flag = flagMap.get(request.getProductId()); // 如果flag是null if(flag == null) { flagMap.put(request.getProductId(), false); } // 如果是缓存刷新的请求,那么就判断,高并如果标识不为空,发下而且是缓存true,就说明之前有一个这个商品的免费信息发布网数据数据库更新请求 if(flag != null && flag) { flagMap.put(request.getProductId(), false); } // 如果是缓存刷新的请求,而且发现标识不为空,致咋但是亿级标识是false // 说明前面已经有一个数据库更新请求+一个缓存刷新请求了,大家想一想 if(flag != null && !flag) { // 对于这种读请求,流量直接就过滤掉,高并不要放到后面的发下内存队列里面去了 return; } } // 做请求的路由,根据每个请求的缓存商品id,网站模板路由到对应的数据内存队列中去 ArrayBlockingQueue<Request> queue = getRoutingQueue(request.getProductId()); // 将请求放入对应的队列中,完成路由操作 queue.put(request); } catch (Exception e) { e.printStackTrace(); } } /** * 获取路由到的致咋内存队列 * @param productId 商品id * @return 内存队列 */ private ArrayBlockingQueue<Request> getRoutingQueue(Integer productId) { RequestQueue requestQueue = RequestQueue.getInstance(); // 先获取productId的hash值 String key = String.valueOf(productId); int h; int hash = (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); // 对hash值取模,将hash值路由到指定的亿级内存队列中,比如内存队列大小8 // 用内存队列的数量对hash值取模之后,结果一定是在0~7之间 // 所以任何一个商品id都会被固定路由到同样的一个内存队列中去的 int index = (requestQueue.queueSize() - 1) & hash; System.out.println("===========日志===========: 路由内存队列,IT技术网商品id=" + productId + ", 队列索引=" + index); return requestQueue.getQueue(index); } } 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.








