±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ51CTO£¬±¾ÎÄÖØµã½éÉܾ©¶«µ½¼Ò¿â´æÏµÍ³¾ÀúÁ½Äê¶àµÄÏßÉÏ¿¼ÑéÓë¼¼Êõµü´ú£¬·þÎñ×ÅÍò¼¶É̼ÒÊ®Íò¼¶µêÆÌÐèÇóµÄ±ä¸üÓë¼¼ÊõÑݽø£¬ÊÇÈçºÎ×öµ½ÏµÍ³µÄÎȶ¨ÐÔÓë¸ß¿ÉÓã¿ |
|
Ŀǰ£¬¾©¶«µ½¼Ò¿â´æÏµÍ³¾ÀúÁ½Äê¶àµÄÏßÉÏ¿¼ÑéÓë¼¼Êõµü´ú£¬ÏÖ·þÎñ×ÅÍò¼¶É̼ÒÊ®Íò¼¶µêÆÌµÄ¹æÄ££¬ÐèÇóµÄ±ä¸üÓë¼¼ÊõÑݽø£¬ÎÒÃÇÊÇÈçºÎ×öµ½ÏµÍ³µÄÎȶ¨ÐÔÓë¸ß¿ÉÓÃÄØ£¬ÏÂͼ»á¸øÄã½ÒÏþ´ð°¸(ͨ¹ýÇ¿´óµÄ»ù´¡·þÎñƽ̨ÈÃÓ¦Óá¢JVM¡¢Docker¡¢ÎïÀí»úËùÓн¡¿µÖ¸±êһĿÁËÈ»£¬7*24СʱÖÇÄÜ¼à¿Ø¸æ¾¯Èÿª·¢ÎÞÐëÒ»Ö±¶¢×Å¼à¿Ø£¬ÁíÍâÊý¾ÝÓëÒµÎñÏศÏà³É£¬ÓÃÊý¾ÝÑéÖ¤ÒµÎñÐèÇ󣬵ü´úÒµÎñÐèÇó£¬ÈÃÒµÎñÐèÇó¶¼¾¡¿ÉÄܵÄÊÕÒæ×î´ó»¯£¬¿â´æÏµÍ³µÄ¿ª·¢Í¬Ñ§Ö»ÐèÒª¹Ø×¢ÒµÎñÐèÇ󣬴󰿱¾ÉÏÏßǰÏàÓ¦µÄ²âÊÔͬѧ»á¸ú½ø°ïÄãѹ²â£¬·ÀÖ¹ÉÏÏߺóDZÔÚµÄÐÔÄÜÆ¿¾±)¡£

¸½1£º¿â´æÏµÍ³¼¼Êõ¼Ü¹¹Í¼

¸½2£º¿â´æÏµÍ³Êý¾ÝÁ÷תͼ
¿â´æÏµÍ³µÄ¼Ü¹¹ºÜÓÐÒâ˼£¬´ÓÉÏͼÀ´¿´¹¦ÄÜÉÏÆäʵ²¢²»¸´ÔÓ£¬µ«ÊÇËûÃæÁٵļ¼Êõ¸´ÔÓ¶ÈÈ´ÊÇÏ൱¸ßµÄ£¬±ÈÈçÃëɱƷÔڸ߲¢·¢µÄÇé¿öÏÂÈçºÎ·ÀÖ¹³¬Âô£¬ÁíÍâ¿â´æÏµÍ³»¹²»ÊÇÒ»¸ö´¿¼¼ÊõµÄϵͳ£¬ÐèÒª½áºÏÓû§µÄÐÐÎªÌØµãÀ´¿¼ÂÇ£¬±ÈÈçÏÂÎÄÖÐÌᵽʲôʱ¼ä½øÐÐ¿â´æµÄ¿Û¼õ×îºÏÊÊ£¬ÎÒÃÇÏÈÅ׳ö¼¸¸öÎÊÌâºÍ´ó¼ÒÒ»Æð̽ÌÖÏ£¬ÈçÓÐÓÐÍײ»´¦£¬»¶Ó´ó¼ÒÅÄש¡£
¿â´æÊ²Ã´Ê±ºò½øÐÐÔ¤Õ¼(»òÕ߿ۼõ)ÄØ
É̼ÒÏúÊÛµÄÉÌÆ·ÊýÁ¿ÊÇÓÐÏ޵ģ¬Óû§Ïµ¥ºóÉÌÆ·»á±»¿Û¼õ£¬ÎÒÃÇ¿ÉÒÔÔõôʵÏÖÄØ?
¾Ù¸öÀý×Ó£º
Ò»¼þÉÌÆ·ÓÐ1000¸ö¿â´æ£¬ÏÖÔÚÓÐ1000¸öÓû§£¬Ã¿¸öÓû§¼Æ»®Í¬Ê±¹ºÂò1000¸ö¡£
1.(ʵÏÖ·½°¸1)Èç¹ûÓû§¼ÓÈ빺Îﳵʱ½øÐÐ¿â´æÔ¤Õ¼£¬ÄÇô½«Ö»ÄÜÓÐ1¸öÓû§½«1000¸öÉÌÆ·¼ÓÈ빺Îï³µ¡£
2.(ʵÏÖ·½°¸2)Èç¹ûÓû§Ìá½»¶©µ¥Ê±½øÐÐ¿â´æÔ¤Õ¼£¬ÄÇô½«Ò²Ö»ÄÜÓÐ1¸öÓû§½«1000¸öÉÌÆ·Ìáµ¥³É¹¦£¬ÆäËüµÄÈ˾ùÌáʾ¡°¿â´æ²»×㣬Ìᵥʧ°Ü¡±¡£
3.(ʵÏÖ·½°¸3)Èç¹ûÓû§Ìá½»¶©µ¥&Ö§¸¶³É¹¦Ê±½øÐÐ¿â´æÔ¤Õ¼£¬ÄÇôÕâ1000¸öÈ˶¼ÄÜÉú³É¶©µ¥£¬µ«ÊÇÖ»ÓÐ1¸öÈË¿ÉÒÔÖ§¸¶³É¹¦£¬ÆäËüµÄ¶©µ¥¾ù»á±»×Ô¶¯È¡Ïû¡£
¾©¶«µ½¼ÒĿǰ²ÉÓõÄÊÇ·½°¸2£¬ÀíÓÉ£º
1.Óû§¿ÉÄÜÖ»ÊÇÔÝʱ¼ÓÈ빺Îï³µ£¬²¢²»±íʾÓû§×îÖÕ»áÌáµ¥²¢Ö§¸¶¡£
2.ËùÒÔÔÚ¹ºÎï³µ½øÐÐ¿â´æÐ£Ñé²¢Ô¤Õ¼£¬»áÔì³ÉÆäËüÕæÕýÏëÂòµÄÓû§²»ÄܼÓÈ빺Îï³µµÄÇé¿ö£¬µ«ÊÇ֮ǰ¼Ó³µµÄÓû§Ò»Ö±²»¸¶¿î£¬×îÖÕËðʧµÄÊǹ«Ë¾¡£
3.·½°¸3»áÔì³ÉÉú³É1000¸ö¶©µ¥£¬ÎÞÂÛÊÇÔÚÖ§¸¶Ç°Ð£Ñé¿â´æ»¹ÊÇÔÚÖ§¸¶³É¹¦ºóÔÙ¼ìÑé¿â´æ£¬¶¼»áÔì³ÉÓû§×¼±¸ºÃÖ§¸¶Ìõ¼þºóÈ´»á³öÏÖ99.9%µÄϵͳȡÏû¶©µ¥µÄ¸ÅÂÊ£¬Ò²¾ÍÊÇ˵»á¸ø99.9%µÄÓû§ÌåÑéµ½²»Ë¬µÄ¸Ð¾õ¡£
4.Êý¾Ý±íÃ÷Óû§Ìá½»¶©µ¥²»Ö§¸¶µÄÕ¼±ÈÊǷdz£Ð¡µÄ(Ïà¶ÔÓÚ¼ÓÈ빺Îï³µ²»¹ºÂòµÄÐÐΪ)£¬Ä¿Ç°¾©¶«µ½¼Ò¸øÓû§Ô¤ÁôµÄ×֧¸¶Ê±¼äÊÇ30·ÖÖÓ£¬³¬¹ý30·ÖÖÓ¶©µ¥×Ô¶¯È¡Ïû£¬Ô¤Õ¼µÄ¿â´æ×Ô¶¯ÊÍ·Å
×ÛÉÏËùÊö£¬·½°¸2Ò²¿ÉÄÜÓÉÓÚÓû§Ïµ¥Ô¤Õ¼¿â´æµ«×îÖÕδ֧¸¶£¬Ôì³É¿â´æ30·ÖÖÓºó²ÅÄܱ»ÆäËüÓû§Ê¹ÓõÄÇé¿ö£¬µ«ÊÇÏà½ÏÓÚ·½°¸1£¬·½°¸3ÎÞÒÉÊÇÕÛÖеÄ×îºÃ·½°¸¡£
ÖØ¸´Ìá½»¶©µ¥µÄÎÊÌâ?
ÖØ¸´Ìá½»¶©µ¥Ôì³ÉµÄ¿â´æÖظ´¿Û¼õµÄºó¹ûÊDZȽÏÑÏÖØµÄ¡£±ÈÈçÉ̼ÒÉèÖÃÓÐ1000¼þÉÌÆ·£¬¶øÊµ¼ÊÇé¿ö¿ÉÄÜÂôÁË900¼þ¾ÍÌáʾÓû§ÎÞ»õÁË£¬¸øÉ̼ÒÔì³ÉÎÞÐεÄËðʧ
¿ÉÄܳöÏÖÖØ¸´Ìá½»¶©µ¥µÄÇé¿ö£º
1.Óû§ÉÆÒâÐÐΪ)appÉÏÓû§µ¥»÷¡°Ìá½»¶©µ¥¡±°´Å¥ºóÓÉÓÚºó¶Ë½Ó¿ÚûÓзµ»Ø£¬Óû§ÒÔΪûÓвÙ×÷³É¹¦»áÔٴε¥»÷¡°Ìá½»¶©µ¥¡±°´Å¥
2.Óû§¶ñÒâÐÐΪ)ºÚ¿ÍÖ±½ÓË¢Ìáµ¥½Ó¿Ú£¬ÈƹýApp¶Ë·ÀÖØÌá½»¹¦ÄÜ
3.Ìáµ¥ÏµÍ³ÖØÊÔ)±ÈÈçÌᵥϵͳΪÁËÌá¸ßϵͳµÄ¿ÉÓÃÐÔ£¬ÔÚµÚÒ»´Îµ÷ÓÃ¿â´æÏµÍ³¿Û¼õ½Ó¿Ú³¬Ê±ºó»áÖØÊÔÔÙ´ÎÌá½»¿Û¼õÇëÇó
ºÃÁË£¬¼ÈÈ»ÎÊÌâ¸ùÔ´ÞÛÇå³þÁË£¬ÎÒÃÇÒ»Ò»¶ÔÖ¢ÏÂÒ©
1.Óû§ÉÆÒâÐÐΪ)app²àÔÚÓû§µÚÒ»´Îµ¥»÷¡°Ìá½»¶©µ¥¡±°´Å¥ºó¶Ô°´Å¥½øÐÐÖûң¬½ûÖ¹ÔÙ´ÎÌá½»¶©µ¥
2.Óû§¶ñÒâÐÐΪ)²ÉÓÃÁîÅÆ»úÖÆ£¬Óû§Ã¿´Î½øÈë½áËãÒ³£¬Ìᵥϵͳ»á°ä·¢Ò»¸öÁîÅÆID(È«¾ÖΨһ)£¬µ±Óû§µã»÷¡°Ìá½»¶©µ¥¡±°´Å¥Ê±·¢ÆðµÄÍøÂçÇëÇóÖÐ»á´øÉÏÕâ¸öÁîÅÆID,Õâ¸öʱºòÌᵥϵͳ»áÓÅÏȽøÐÐÁîÅÆIDÑéÖ¤£¬ÁîÅÆID´æÔÚ&ÁîÅÆID·ÃÎÊ´ÎÊý=1µÄ»°²Å»á·ÅÐд¦ÀíºóÐøÂß¼£¬·ñÔòÖ±½Ó·µ»Ø
3.Ìáµ¥ÏµÍ³ÖØÊÔ)ÕâÖÖÇé¿öÔòÐèÒªºó¶Ëϵͳ(±ÈÈç¿â´æÏµÍ³)À´±£Ö¤½Ó¿ÚµÄÃݵÈÐÔ£¬Ã¿´Îµ÷ÓÃ¿â´æÏµÍ³Ê±¾ù´øÉ϶©µ¥ºÅ£¬¿â´æÏµÍ³»á»ùÓÚ¶©µ¥ºÅÔö¼ÓÒ»¸ö·Ö²¼Ê½ÊÂÎñËø£¬Î±´úÂëÈçÏ£º
int
ret=redis.incr(orderId);
redis.expire(orderId,5,TimeUnit.MINUTES);
if(ret==1){
//Ìí¼Ó³É¹¦£¬ËµÃ÷֮ǰûÓд¦Àí¹ýÕâ¸ö¶©µ¥ºÅ
»òÕß5·ÖÖÓ֮ǰ´¦Àí¹ýÁË
boolean alreadySuccess=alreadySuccessDoOrder
(orderProductRequest);
if(!alreadySuccess){
doOrder(orderProductRequest);
}else{
return "²Ù×÷ʧ°Ü£¬ÔÒò£ºÖظ´Ìá½»";
}
}else{
return "²Ù×÷ʧ°Ü£¬ÔÒò£ºÖظ´Ìá½»";
}
|
¿â´æÊý¾ÝµÄ»Ø¹ö»úÖÆÈçºÎ×ö
ÐèÒª¿â´æ»Ø¹öµÄ³¡¾°Ò²ÊDZȽ϶àµÄ£¬±ÈÈ磺
1.Óû§Î´Ö§¸¶)Óû§Ïµ¥ºóºó»ÚÁË
2.Óû§Ö§¸¶ºóÈ¡Ïû)Óû§Ïµ¥&Ö§¸¶ºóºó»ÚÁË
3.·ç¿ØÈ¡Ïû)·ç¿ØÊ¶±ðµ½Òì³£ÐÐΪ£¬Ç¿ÖÆÈ¡Ïû¶©µ¥
4.(ñîºÏϵͳ¹ÊÕÏ)±ÈÈçÌá½»¶©µ¥Ê±ÌᵥϵͳT1ͬʱ»áµ÷Óûý·Ö¿Û¼õϵͳX1¡¢¿â´æ¿Û¼õϵͳX2¡¢ÓÅ»ÝȯϵͳX3£¬¼ÙÈçX1,X2³É¹¦ºó£¬µ÷ÓÃX3ʧ°Ü£¬ÐèÒª»Ø¹öÓû§»ý·ÖÓëÉÌ¼Ò¿â´æ¡£
ÆäÖг¡¾°1£¬2£¬3±È½ÏÀàËÆ£¬¶¼»áÔì³É¶©µ¥È¡Ïû£¬¶©µ¥ÖÐÐÄÈ¡Ïûºó»á·¢ËÍmq³öÀ´£¬¸÷¸öϵͳ±£Ö¤×Ô¼ºÄܹ»ÕýÈ·Ïû·Ñ¶©µ¥È¡ÏûMQ¼´¿É¡£¶ø³¡¾°4¶©µ¥ÆäʵÉÐδÉú³É£¬Ïà¶ÔÀ´ËµÒª¸´ÔÓЩ£¬ÈçÉÏÃæÌáµ½µÄ£¬ÌᵥϵͳT1ÐèÒªÖ÷¶¯·¢Æð¿â´æÏµÍ³X2¡¢ÓÅ»ÝȯϵͳX3µÄ»Ø¹öÇëÇó(Èë²Î±ØÐë´øÉ϶©µ¥ºÅ)£¬X2¡¢X3»Ø¹ö½Ó¿ÚÐèÒªÖ§³ÖÃݵÈÐÔ¡£
ÆäʵÕë¶Ô³¡¾°4£¬»¹´æÔÚÒ»ÖÖ¼«¶ËÇé¿ö£¬Èç¹ûÌᵥϵͳT1×¼±¸»Ø¹öʱ×ÔÉíҲ崻úÁË£¬ÄÇô¿â´æÏµÍ³X2¡¢ÓÅ»ÝȯϵͳX3¾Í±ØÐëÒÀ¿¿×Ô¼ºÎªÍê³É»Ø¹ö²Ù×÷ÁË£¬Ò²¾ÍÊÇ˵¾ß±¸×ÔÎÒÊý¾Ý½¡¿µ¼ì²éµÄÄÜÁ¦£¬¾ßÌåÀ´ËµÔõôʵÏÖÄØ?
¿ÉÒÔÀûÓõ±Ç°¶©µ¥ºÅËùÊôµÄ¶©µ¥ÉÐδÉú³ÉµÄÌØµã£¬¿ÉÒÔͨ¹ýworker»úÖÆ£¬Ã¿´ÎÀÌÈ¡40·ÖÖÓ(ÕâÀïµÄ40Ò»¶¨Òª´óÓÚÈÝÈÌÓû§µÄÖ§¸¶Ê±¼ä)ǰµÄ¶©µ¥£¬µ÷Óö©µ¥ÖÐÐIJéѯ¶©µ¥µÄ״̬£¬È·±£²»ÊÇÒÑÈ¡ÏûµÄ£¬·ñÔò½øÐÐ×ÔÎÒÊý¾ÝµÄ»Ø¹ö¡£
¶àÈËͬʱ¹ºÂò1¼þÉÌÆ·£¬ÈçºÎ°²È«µØ¿â´æ¿Û¼õ
ÏÖʵÖÐͬһ¼þÉÌÆ·¿ÉÄÜ»á³öÏÖ¶àÈËͬʱ¹ºÂòµÄÇé¿ö£¬ÎÒÃÇ¿ÉÒÔÈçºÎ×öµ½²¢·¢°²È«ÄØ?
α´úÂëÆ¬¶Î1£º
synchronized(this){
long stockNum = getProductStockNum(productId);
if(stockNum>requestBuyNum) {
String sql=" update stock_main "+
" set stockNumstockNum=stockNum-"+requestBuyNum
+
" where productId="+productId;
int ret=updateSQL(sql);
if(ret==1){
return "¿Û¼õ³É¹¦";
}else {
return "¿Û¼õʧ°Ü";
}
}
} |
α´úÂëÆ¬¶Î1µÄÉè¼ÆË¼ÏëÊÇËùÓÐ ÇëÇó¹ýÀ´Ö®ºóÊ×ÏȼÓËø£¬Ç¿ÖÆÆä´®Ðл¯´¦Àí£¬¿É¼ûÆäЧÂÊÒ»¶¨²»¸ß£¬
α´úÂëÆ¬¶Î2£º
String
sql=" update stock_main "+
" set stockNumstockNum=stockNum-"+requestBuyNum
+
" where productId="+productId+
" and stockNum>="+requestBuyNum;
int ret=updateSQL(sql);
if(ret==1){
return "¿Û¼õ³É¹¦";
}else {
return "¿Û¼õʧ°Ü";
} |
Õâ¶Î´úÂëÖ»ÊÇÔÚwhereÌõ¼þÀïÔö¼ÓÁËand stockNum>="+requestBuyNum¼´¿É·ÀÖ¹³¬ÂôµÄÐÐΪ£¬´ïµ½ÁËÓëÉÏÊöα´úÂë1µÄ¹¦ÄÜ
Èç¹ûÉÌÆ·ÊÇ´ÙÏúÆ·(±ÈÈç²ÎÓëÁËÃëɱµÄÉÌÆ·)²¢·¢¿Û¼õµÄ»úÂÊ»á¸ü¸ß£¬ÄÇôÊý¾Ý¿âµÄѹÁ¦»á¸ü¸ß£¬Õâ¸öʱºò»¹¿ÉÒÔÔõô×öÄØ
º£Á¿µÄÓû§ÃëɱÇëÇó,±¾ÖÊÉÏÊÇÒ»¸öÅÅÐò,Ïȵ½ÏȵÃ.µ«ÊÇÈç´ËÖ®¶àµÄÇëÇó£¬×¢¶¨ÁËÓÐЩÈËÊÇÇÀ²»µ½µÄ£¬¿ÉÒÔÔÚ½øÈëÉÏÊöα´úÂëDao²ã֮ǰÔö¼ÓÒ»¸ö¼ÆÊýÆ÷½øÐпØÖÆ£¬±ÈÈçÓÐ50%µÄÁ÷Á¿½«Ö±½Ó¸æË߯äÇÀ¹ºÊ§°Ü£¬Î±´úÂëÈçÏ£º
public
class SeckillServiceImpl{
private long count=0;
public BuyResult buy(User user,int productId,int
productNum){
count++;
if(count%2=1){
Thread.sleep(1000);
return new BuyResult("ÇÀ¹ºÊ§°Ü");
}else{
return doBuy(user,productId,productNum);
}
}
} |
ÁíÍâͬһ¸öÓû§£¬²»ÔÊÐí¶à´ÎÇÀ¹ºÍ¬Ò»¼þÉÌÆ·£¬ÎÒÃÇÓÖ¸ÃÈçºÎ×öÄØ
public
String doBuy(user,productId,productNum){
//Óû§³ýÁ˵ÚÒ»´Î½øÈëֵΪ1£¬ÆäËüʱºò¾ù´óÓÚ1
int tmp=redis.incr(user.getUid()+productId);
if(tmp==1){
//1Сʱºókey×Ô¶¯Ïú»Ù
redis.expire(user.getUid()+productId,3600);
return doBuy1(user,productId,productNum);
}else{
return new BuyResult("ÇÀ¹ºÊ§°Ü");
}
} |
Èç¹ûͬһ¸öÓû§ÓµÓв»Í¬µÄÕʺţ¬À´ÇÀ¹ºÍ¬Ò»¼þÉÌÆ·£¬ÉÏÃæµÄ²ßÂÔ¾ÍʧЧÁË¡£
һЩ¹«Ë¾ÔÚ·¢Õ¹ÔçÆÚ¼¸ºõÊÇûÓÐÏÞÖÆµÄ£¬ºÜÈÝÒ׾ͿÉÒÔ×¢²áºÜ¶à¸öÕ˺š£Ò²¼´ÊÇÍøÂçËùνµÄ¡°½©Ê¬Õ˺𱣬ÊýÁ¿ÅÓ´ó£¬Èç¹ûÎÒÃÇʹÓü¸Íò¸ö¡°½©Ê¬ºÅ¡±È¥»ì½øÈ¥ÇÀ¹º£¬ÕâÑù¾Í¿ÉÒÔ´ó´óÌáÉýÎÒÃÇÖн±µÄ¸ÅÂÊ£¬ÄÇÎÒÃÇÈçºÎÓ¦¶ÔÄØ£¿
public
String doBuy1(user,productId,productNum){
String minuteKey=DateTimeUtil.getDateTimeStr("yyyyMMddHHmm");
String minuteIpCount=redis.incr(minuteKey+user.getClientIp());
// thresholdΪÔÊÐíÿ·ÖÖÓÔÊÐíµ¥¸öipµÄ×î´ó·ÃÎÊ´ÎÊý
if(minuteIpCount>threshold){
//ʶ±ðµ½Õⲿ·ÖDZÔÚ·çÏÕÓû§Ê±£¬»áÈÃÕⲿ·ÖÓû§Ç¿ÖÆÌø×ªµ½ÑéÖ¤ÂëÒ³Ãæ½øÐÐУÑé
//УÑéͨ¹ýºó²ÅÄܼÌÐøÇÀ¹ºÉÌÆ·
return getAndSendVerificationCode(user);
}else{
return doBuy2(user,productId,productNum);
}
} |
ÁíÍ⽫¿â´æÏµÍ³µÄºËÐıí½á¹¹Éè¼ÆÌṩ³öÀ´¹©´ó¼Ò²Î¿¼
¿â´æÖ÷±í£¬ÃüÃû¹æÔò£ºstock_center_00~99
¿â´æÁ÷Ë®±í£¬ÃüÃû¹æÔò£ºstock_center_flow_00~99
¿â´æÅúÁ¿²Ù×÷ÈÕÖ¾±í£¬ÃüÃû¹æÔò£ºbatch_upload_log

|