亿级流量高并发下,缓存与数据库不一致,咋办?

  发布时间:2025-11-04 04:01:21   作者:玩站小弟   我要评论
复制/** *请求异步处理的service实现 *@authorAdministrator * */ 。
亿级流量高并发下,缓存与数据库不一致,咋办?
复制/**    * 请求异步处理的亿级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("===========日志===========: 路由内存队列,云服务器提供商商品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.
  • Tag:

相关文章

最新评论