当前位置: 首页 > 后端技术 > Java

差点被炒鱿鱼:订单号重复的事故

时间:2023-04-02 01:04:41 Java

鍘诲勾骞村簳锛屾垜浠湪缃戜笂鍑轰簡浜嬫晠銆傝繖娆′簨鏁呯殑琛ㄧ幇鏄繖鏍风殑锛氱郴缁熶腑鍑虹幇浜嗕袱涓浉鍚岀殑璁㈠崟鍙凤紝浣嗚鍗曞唴瀹逛笉鍚屻€備竴鏍风殑锛岃€屼笖绯荤粺鍦ㄦ寜鐓ц鍗曞彿鏌ヨ鐨勬椂鍊欎竴鐩存姤閿欙紝娌″姙娉曟甯稿洖璋冿紝鑰屼笖涓嶆涓€娆″嚭鐜拌繖绉嶆儏鍐碉紝鎵€浠ヨ繖娆$郴缁熷崌绾у繀椤昏瑙e喅銆備箣鍓嶅鐞嗙殑鍚屼簨涔熶慨鏀硅繃鍑犳锛屼絾鏄晥鏋滆繕鏄笉濂斤細鎬讳細鏈夐噸澶嶅崟鍙风殑闂锛屼簬鏄秮鐫€杩欎釜闂锛屽ソ濂界湅鐪嬪悓浜嬪啓鐨勪唬鐮?杩欓噷绠€鍗曞睍绀轰竴涓嬪綋鏃剁殑浠g爜锛?***OD璁㈠崟鍙风敓鎴?璁㈠崟鍙风敓鎴愯鍒欙細OD+yyMMddHHmmssSSS+5浣嶏紙3浣嶅晢鎴峰彿+2浣嶉殢鏈烘暟锛?2浣?/publicstaticStringgetYYMMDDHHNumber(StringmerchId){StringBufferorderNo=newStringBuffer(newSimpleDateFormat("yyMMddHHmmssSSS").format(newDate()));if(StringUtils.isNotBlank(merchId)){if(merchId.length()>3){orderNo.append(merchId.substring(0,3));}else{orderNo.append(merchId);}}intorderLength=orderNo.toString().length();StringrandomNum=getRandomByLength(20-orderLength);orderNo.append(randomNum);杩斿洖orderNo.toString();}/**鐢熸垚鎸囧畾浣嶆暟鐨勯殢鏈烘暟**/publicstaticStringgetRandomByLength(intsize){if(size>8||size<1){return"";}闅忔満鏁皀e=newRandom();StringBufferendNumStr=newStringBuffer("1");瀛楃涓茬紦鍐插尯erstaNumStr=newStringBuffer("9");for(inti=1;iorderNos=Collections.synchronizedList(newArrayList());IntStream.range(0,100).parallel().forEach(i->{orderNos.add(getYYMMDDHHNumber(merchId));});ListfilterOrderNos=orderNos.stream().distinct().collect(Collectors.toList());System.out.println("鐢熸垚璁㈠崟鏁帮細"+orderNos.size());System.out.println("杩囨护閲嶅鍚庣殑璁㈠崟鏁帮細"+filterOrderNos.size());System.out.println("閲嶅璁㈠崟鏁帮細"+(orderNos.size()-filterOrderNos.size()));鏋滅劧锛屾祴璇曠粨鏋滃涓嬶細鐢熸垚璁㈠崟鏁帮細100杩囨护閲嶅鍚庣殑璁㈠崟鏁帮細87閲嶅璁㈠崟鏁帮細13鎴戝綋鏃舵儕鍛嗕簡馃く锛屼竴涓竴鐧惧苟鍙戠珶鐒舵湁13涓噸澶嶏紒锛侊紒锛屾垜璧剁揣璁╁悓浜嬩笉瑕佸彂甯冪増鏈紝鎴戞帴涓嬩簡杩欎唤宸ヤ綔锛佽繖鐐庣儹鐨勫北缇斤紝鎯宠寰楀埌涓€涓槑纭殑瑙e喅鏂规鏄笉鍙兘鐨勩€傚ぇ姒傝姳浜?+鍒嗛挓鍜屽悓浜嬭璁轰笟鍔″満鏅紝鍐冲畾鍋氬涓嬩慨鏀癸細鍘绘帀浼犲叆鐨勫晢鎴稩D锛堟嵁鍚屼簨璇存槸涓轰簡闃叉閲嶅涓嬪崟锛屼篃浼犲叆鍟嗘埛ID锛屼絾鏄浆out琛ㄧず娌℃湁浣跨敤锛夊彧淇濈暀涓変綅姣锛堝噺灏戦暱搴︼紝淇濊瘉搴旂敤鍒囨崲涓嶅瓨鍦ㄩ噸澶嶇殑鍙兘锛変娇鐢ㄧ嚎绋嬪畨鍏ㄧ殑璁℃暟鍣ㄩ€掑鏁板瓧锛堜笁浣嶆渶浣庝繚璇佸苟鍙戞暟涓?00娌℃湁閲嶅锛屾垜鍦ㄤ唬鐮佷腑缁欎簡4浣嶏級灏嗘棩鏈熻浆鎹负java8鏃ユ湡绫绘牸寮忥紙绾跨▼瀹夊叏鍜屼唬鐮佺畝鍗曟€ц€冭檻锛夈€傜粡杩囦互涓婃€濊€冿紝鎴戞渶缁堢殑浠g爜鏄細/**ordernumberGenerate(NEW)**/privatestaticfinalAtomicIntegerSEQ=newAtomicInteger(1000);privatestaticfinalDateTimeFormatterDF_FMT_PREFIX=DateTimeFormatter.ofPattern("yyMMddHHmmssSS");privatestaticZoneIdZONE_ID=ZoneId.of("浜氭床/涓婃捣");publicstaticTimeStringgenerate(Time)LoDOrderdata=LocalDateTime.now(ZONE_ID);濡傛灉(SEQ.intValue()>9990){SEQ.getAndSet(1000);}returndataTime.format(DF_FMT_PREFIX)+SEQ.getAndIncrement();}浠g爜褰撶劧涓嶈兘杩欎箞鍐欎簡闅忎究灏卞畬浜嗭紝鐜板湪瑕佹祴璇曚竴涓媘ain鍑芥暟浜嗭細publicstaticvoidmain(String[]args){ListorderNos=Collections.synchronizedList(newArrayList());IntStream.range(0,8000).parallel().forEach(i->{orderNos.add(generateOrderNo());});ListfilterOrderNos=orderNos.stream().distinct().collect(Collectors.toList());System.out.println("鐢熸垚璁㈠崟鏁帮細"+orderNos.size());System.out.println("杩囨护閲嶅鍚庣殑璁㈠崟鏁帮細"+filterOrderNos.size());System.out.println("閲嶅璁㈠崟鏁帮細"+(orderNos.size()-filterOrderNos.size()));}/**娴嬭瘯缁撴灉锛氱敓鎴愯鍗曟暟锛?000杩囨护閲嶅鍚庤鍗曟暟锛?000閲嶅璁㈠崟鏁帮細0**/澶浜嗭紝鎴愬姛浜嗕竴娆★紝鍙互鐩存帴涓婄嚎浜嗐€?浣嗘槸鍥炶繃澶存潵鐪嬩笂闈㈢殑浠g爜锛岃櫧鐒舵渶澶х▼搴︾殑瑙e喅浜嗗苟鍙戝崟鍙烽噸澶嶇殑闂锛屼絾鏄垜浠殑绯荤粺鏋舵瀯杩樻槸瀛樺湪涓€涓綔鍦ㄧ殑闅愭偅锛氬鏋滃綋鍓嶅簲鐢ㄦ湁澶氫釜瀹炰緥锛堥泦缇わ級锛屾槸娌℃湁閲嶅锛熷彲鑳界殑锛熷叧娉ㄥ井淇¤闃呭彿鍖犱汉鎵嬭锛屽洖澶嶆灦鏋勮幏鍙栫郴鍒楁灦鏋勭煡璇嗐€傞拡瀵硅繖涓棶棰橈紝鍔垮繀闇€瑕佷竴涓涔嬫湁鏁堢殑瑙e喅鏂规锛屾墍浠ユ鏃舵垜鎯冲埌锛氬浣曞尯鍒嗗瀹炰緥搴旂敤璁㈠崟鍙凤紵浠ヤ笅鏄垜澶ц嚧鐨勬€濊矾鏂瑰悜锛氫娇鐢║UID锛堢涓€娆$敓鎴愯鍗曞彿鏃跺垵濮嬪寲涓€涓級浣跨敤redis璁板綍涓€涓闀跨殑ID浣跨敤鏁版嵁搴撹〃缁存姢涓€涓闀跨殑ID搴旂敤鎵€鍦ㄧ殑缃戠粶IP搴旂敤绋嬪簭鐨勭鍙e彿浣跨敤绗笁鏂圭畻娉曪紙Snowflake绠楁硶绛夛級浣跨敤杩涚▼ID锛堟煇绉嶇▼搴︿笂鏄竴绉嶅彲琛岀殑瑙e喅鏂规锛夋垜杩欓噷鎯冲埌浜嗭紝鎴戜滑鐨勫簲鐢ㄧ▼搴忚繍琛屽湪docker涓紝姣忎釜docker涓殑搴旂敤绋嬪簭绔彛瀹瑰櫒鏄竴鏍风殑锛屼絾鏄綉缁滀笉瀛樺湪閲嶅IP鐨勯棶棰樸€傝嚦浜庨噸澶嶈繘绋嬬殑鍙兘鎬э紝UUID鐨勬柟娉曚箣鍓嶄篃鍚冭繃鑻﹀ご銆傛€讳箣redis鎴栬€卍b涔熸槸姣旇緝濂界殑鏂瑰紡锛屼絾鏄嫭绔嬫€у樊銆?.鍚屾椂锛岃繕鏈変竴涓洜绱犱篃寰堥噸瑕侊紝灏辨槸鎵€鏈変笌璁㈠崟鍙风敓鎴愮浉鍏崇殑搴旂敤閮藉湪鍚屼竴鍙颁富鏈轰笂锛坙inux鐗╃悊鏈嶅姟鍣級锛屾墍浠ユ垜鐩墠鐨勭郴缁熸灦鏋勯€夋嫨浜咺P鏂瑰紡.涓嬮潰鏄垜鐨勪唬鐮侊細importorg.apache.commons.lang3.RandomUtils;importjava.net.InetAddress;importjava.time.LocalDateTime;importjava.time.ZoneId;importjava.time.format.DateTimeFormatter;importjava.util.ArrayList锛涘鍏ava.util.Collections锛涘鍏ava.util.List锛涘鍏ava.util.concurrent.atomic.AtomicInteger锛涘鍏ava.util.stream.Collectors锛涘鍏ava.util.stream.IntStream锛涘叕鍏辩被OrderGen2Test{/**璁㈠崟鍙风敓鎴?*/privatestaticZoneIdZONE_ID=ZoneId.of("Asia/Shanghai");privatestaticfinalAtomicIntegerSEQ=newAtomicInteger(1000);privatestaticfinalDateTimeFormatterDF_FMT_PREFIX=DateTimeFormatter.ofPattern("yyMMddHHmmssSS");publicstaticStringgenerateOrderNo(){LocalDateTimedataTime=LocalDateTime.now(ZONE_ID);濡傛灉(SEQ.intValue()>9990){SEQ.getAndSet(1000);}returndataTime.format(DF_FMT_PREFIX)+getLocalIpSuffix()+SEQ.getAndIncrement();}privatevolatilestaticStringIP_SUFFIX=null;privatestaticStringgetLocalIpSuffix(){if(null!=IP_SUFFIX){returnIP_SUFFIX;}try{synchronized(OrderGen2Test.class){if(null!=IP_SUFFIX){returnIP_SUFFIX;}InetAddress鍦板潃=InetAddress.getLocalHost();//172.17.0.4172.17.0.199,StringhostAddress=addr.getHostAddress();if(null!=hostAddress&&hostAddress.length()>4){StringipSuffix=hostAddress.trim().split("\\.")[3];濡傛灉(ipSuffix.length()==2){IP_SUFFIX=ipSuffix;杩斿洖IP_SUFFIX锛泒ipSuffix="0"+ipSuffix;IP_SUFFIX=ipSuffix.substring(ipSuffix.length()--2);杩斿洖IP_SUFFIX锛泒IP_SUFFIX=RandomUtils.nextInt(10,20)+"";杩斿洖IP_SUFFIX锛泒}catch(Exceptione){System.out.println("鑾峰彇IP澶辫触锛?+e.getMessage());IP_SUFFIX=RandomUtils.nextInt(10,20)+"";杩斿洖IP_SUFFIX锛泒}publicstaticvoidmain(String[]args){ListorderNos=Collections.synchronizedList(newArrayList());IntStream.range(0,8000).parallel().forEach(i->{orderNos.add(generateOrderNo());});ListfilterOrderNos=orderNos.stream().distinct().collect(Collectors.toList());System.out.println("鏍峰搧璁㈠崟锛?+orderNos.get(22));System.out.println("鐢熸垚璁㈠崟鏁帮細"+orderNos.size());System.out.println("杩囨护璁㈠崟鍙峰悗鐨勯噸澶嶉」锛?+filterOrderNos.size());System.out.println("閲嶅璁㈠崟鍙凤細"+(orderNos.size()-filterOrderNos.size()));}}/**Ordersample:20082115575546011022鐢熸垚鐨勮鍗曟暟:8000杩囨护閲嶅鍚庣殑璁㈠崟鏁?8000閲嶅鐨勮鍗曟暟:0**/鏈€鍚庣殑浠g爜璇存槑鍜屼竴浜涘缓璁甮enerateOrderNo()鏂规硶涓笉闇€瑕佸姞閿侊紝鍥犱负AtomicInteger浣跨敤浜咰AS鑷棆閿侊紙涓轰繚璇佸彲瑙佹€у拰鍘熷瓙鎬э紝鍏蜂綋璇疯嚜琛屼簡瑙o級銆俫etLocalIpSuffix()鏂规硶涓嶉渶瑕佷负绌恒€傚姞鍚屾閿侊紙鍙屽悜楠岃瘉閿侊紝鏁翠綋涓婃槸涓€绉嶅畨鍏ㄧ殑鍗曚緥妯″紡锛夊苟涓嶆槸瑙e喅闂鐨勫敮涓€鏂规硶銆傞棶棰樼殑鍏蜂綋瑙e喅鏂规鍙栧喅浜庡綋鍓嶇殑绯荤粺鏋舵瀯銆備换浣曟祴璇曢兘鏄繀瑕佺殑銆傛垜鍚屼簨鍓嶅嚑娆″皾璇曡В鍐宠繖涓棶棰樺悗閮芥病鏈夎嚜娴嬶紝涓嶆祴璇曚細鎹熷寮€鍙戠殑涓撲笟鎬э紒浣滆€咃細funnyZpCcnblogs.com/funnyzpc/p/13541713.html