国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

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

发布时间:2019/08/07标签:   缓存    点击量:

原标题:亿级流量高并发下,缓存与数据库不一致,咋办
信任只有是个略微像样点的互联网公司,或多或少都有本人的一套缓存系统。图片来自 Pexels只有用缓存,便可能会波及到缓存与数据库双存储双写,你只有是双写,就必定会无数据分歧性的成绩,遂笔者想在这和各人聊一聊:怎样处理分歧性成绩?怎样保障缓存与数据库双写分歧性,也是当初 Java 口试中口试官十分喜爱问的一个成绩!个别来讲,假如同意缓存能够略微跟数据库间或有纷歧致,也就是说假如你的体系不是严厉请求缓存+数据库必需坚持分歧性的话,最好不要做这个计划。即:读恳求和写恳求串行化,串到一个内存行列里去,从而到达避免并发恳求招致数据紊乱的成绩,场景如图所示:值得留神的是,串行化能够保障必定不会呈现纷歧致的情形,然而它也会招致体系的吞吐量大幅度下降,用比畸形情形下多几倍的呆板去支持线上的一个恳求(土豪请自发疏忽此提示)。处理思绪以下图:代码完成大抵以下:/***恳求异步处置的service完成*@authorAdministrator**/@Service("requestAsyncProcessService")publicclassRequestAsyncProcessServiceImplimplementsRequestAsyncProcessService{@Overridepublicvoidprocess(Requestrequest){try{//先做读恳求的去重RequestQueuerequestQueue=RequestQueue.getInstance();Map<Integer,Boolean>flagMap=requestQueue.getFlagMap();if(requestinstanceofProductInventoryDBUpdateRequest){//假如是一个更新数据库的恳求,那末就将谁人productId对应的标识设置为trueflagMap.put(request.getProductId(),true);}elseif(requestinstanceofProductInventoryCacheRefreshRequest){Booleanflag=flagMap.get(request.getProductId());//假如flag是nullif(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(Exceptione){e.printStackTrace();}}/***猎取路由到的内存行列*@paramproductId商品id*@return内存行列*/privateArrayBlockingQueue<Request>getRoutingQueue(IntegerproductId){RequestQueuerequestQueue=RequestQueue.getInstance();//先猎取productId的hash值Stringkey=String.valueOf(productId);inth;inthash=(key==null)?0:(h=key.hashCode())^(h>>>16);//对hash值取模,将hash值路由到指定的内存行列中,比方内存行列巨细8//用内存行列的数目对hash值取模以后,成果必定是在0~7之间//以是任何一个商品id都市被牢固路由到一样的一个内存行列中去的intindex=(requestQueue.queueSize()-1)&hash;System.out.println("===========日记===========:路由内存行列,商品id="+productId+",行列索引="+index);returnrequestQueue.getQueue(index);}}

版权信息Copyright © IT技术教程 版权所有    ICP备案编号:鲁ICP备09013610号