精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一次訂單號重復引起的事故,把我坑慘了!

開發 后端
系統出現了兩個一模一樣的訂單號,訂單的內容卻不是不一樣的,而且系統在按照訂單號查詢的時候一直拋錯,也沒法正常回調,而且事情發生的不止一次,所以這次系統升級一定要解決掉。

 [[347594]]

我們線上出了一次事故,這個事故的表象是這樣的:

系統出現了兩個一模一樣的訂單號,訂單的內容卻不是不一樣的,而且系統在按照訂單號查詢的時候一直拋錯,也沒法正?;卣{,而且事情發生的不止一次,所以這次系統升級一定要解決掉。

經手的同事之前也改過幾次,不過效果始終不好,總會出現訂單號重復的問題,所以趁著這次問題我好好的理了一下我同事寫的代碼。

這里簡要展示下當時的代碼: 

  1. /**  
  2.  * OD單號生成  
  3.  * 訂單號生成規則:OD + yyMMddHHmmssSSS + 5位數(商戶ID3位+隨機數2位) 22位  
  4.  */  
  5. public static String getYYMMDDHHNumber(String merchId){  
  6.       StringBuffer orderNo = new StringBuffer(new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()));  
  7.       if(StringUtils.isNotBlank(merchId)){  
  8.           if(merchId.length()>3){  
  9.               orderNo.append(merchId.substring(0,3));  
  10.           }else {  
  11.               orderNo.append(merchId);  
  12.           }  
  13.       }  
  14.       int orderLength = orderNo.toString().length();  
  15.       String randomNum = getRandomByLength(20-orderLength);  
  16.       orderNo.append(randomNum);  
  17.       return orderNo.toString();  
  18.  
  19.   /** 生成指定位數的隨機數 **/  
  20.   public static String getRandomByLength(int size){  
  21.       if(size>8 || size<1){  
  22.           return "";  
  23.       }  
  24.       Random ne = new Random();  
  25.       StringBuffer endNumStr = new StringBuffer("1");  
  26.       StringBuffer staNumStr = new StringBuffer("9");  
  27.       for(int i=1;i<size;i++){  
  28.           endNumStr.append("0");  
  29.           staNumStr.append("0");  
  30.       }  
  31.       int randomNum = ne.nextInt(Integer.valueOf(staNumStr.toString()))+Integer.valueOf(endNumStr.toString());  
  32.       return String.valueOf(randomNum);  
  33.   }       

可以看到,這段代碼寫的其實不怎么好,代碼部分暫且不議,代碼中使訂單號不重復的主要因素點是隨機數和毫秒,可是這里的隨機數只有兩位,在高并發環境下極容易出現重復問題。

同時毫秒這一選擇也不是很好,在多核CPU多線程下,一定時間內(極小的)這個毫秒可以說是固定不變的(測試驗證過),所以這里我先以100個并發測試下這個訂單號生成。

測試代碼如下: 

  1. public static void main(String[] args) {  
  2.     final String merchId = "12334" 
  3.     List<String> orderNos = Collections.synchronizedList(new ArrayList<String>());  
  4.     IntStream.range(0,100).parallel().forEach(i-> 
  5.         orderNos.add(getYYMMDDHHNumber(merchId));  
  6.     });  
  7.     List<String> filterOrderNos = orderNos.stream().distinct().collect(Collectors.toList());  
  8.     System.out.println("生成訂單數:"+orderNos.size());  
  9.     System.out.println("過濾重復后訂單數:"+filterOrderNos.size());  
  10.     System.out.println("重復訂單數:"+(orderNos.size()-filterOrderNos.size()));  

果然,測試的結果如下: 

  1. 生成訂單數:100  
  2. 過濾重復后訂單數:87  
  3. 重復訂單數:13 

當時我就震驚🤯了,一百個并發里面竟然有13個重復的?。?!

我趕緊讓同事先不要發版,這活兒我接了!

對這一燙手的山竽拿到手里沒有一個清晰的解決方案可是不行的,我大概花了6+分鐘和同事商量了下業務場景,決定做如下更改:

  •  去掉商戶ID的傳入(按同事的說法,傳入商戶ID也是為了防止重復訂單的,事實證明并沒有叼用)
  •  毫秒僅保留三位(縮減長度同時保證應用切換不存在重復的可能)
  •  使用線程安全的計數器做數字遞增(三位數最低保證并發800不重復,代碼中我給了4位)
  •  更換日期轉換為java8的日期類以格式化(線程安全及代碼簡潔性考量,可以點擊這里進行閱讀詳情)

經過以上思考后我的最終代碼是: 

  1. /** 訂單號生成(NEW) **/  
  2. private static final AtomicInteger SEQ = new AtomicInteger(1000);  
  3. private static final DateTimeFormatter DF_FMT_PREFIX = DateTimeFormatter.ofPattern("yyMMddHHmmssSS");  
  4. private static ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai");  
  5. public static String generateOrderNo(){  
  6.     LocalDateTime dataTime = LocalDateTime.now(ZONE_ID);  
  7.     if(SEQ.intValue()>9990){  
  8.         SEQ.getAndSet(1000);  
  9.     }  
  10.     return  dataTime.format(DF_FMT_PREFIX)+SEQ.getAndIncrement();  

當然代碼寫完成了可不能這么隨隨便便結束了,現在得走一個測試main函數看看: 

  1. public static void main(String[] args) {  
  2.     List<String> orderNos = Collections.synchronizedList(new ArrayList<String>());  
  3.     IntStream.range(0,8000).parallel().forEach(i-> 
  4.         orderNos.add(generateOrderNo());  
  5.     });  
  6.     List<String> filterOrderNos = orderNos.stream().distinct().collect(Collectors.toList());  
  7.     System.out.println("生成訂單數:"+orderNos.size());  
  8.     System.out.println("過濾重復后訂單數:"+filterOrderNos.size());  
  9.     System.out.println("重復訂單數:"+(orderNos.size()-filterOrderNos.size()));  
  10.  
  11. /**  
  12.   測試結果:   
  13.   生成訂單數:8000  
  14.   過濾重復后訂單數:8000  
  15.   重復訂單數:0  
  16. **/ 

真好,一次就成功了,可以直接上線了。。。

然而,我回過頭來看以上代碼,雖然最大程度解決了并發單號重復的問題,不過對于我們的系統架構還是有一個潛在的隱患:如果當前應用有多個實例(集群)難道就沒有重復的可能了?

鑒于此問題就必然需要一個有效的解決方案,所以這時我就思考:多個實例應用訂單號如何區分開呢?

以下為我思考的大致方向:

  •  使用UUID(在第一次生成訂單號時初始化一個)
  •  使用redis記錄一個增長ID
  •  使用數據庫表維護一個增長ID
  •  應用所在的網絡IP
  •  應用所在的端口號
  •  使用第三方算法(雪花算法等等)
  •  使用進程ID(某種程度下是一個可行的方案)

在此我想了下,我們的應用是跑在docker里面,而且每個docker容器內的應用端口都一樣,不過網路IP不會存在重復的問題,至于進程也有存在重復的可能,對于UUID的方式之前吃過虧,遠之吧,redis或DB也算是一種比較好的方式,不過獨立性較差。。。

同時還有一個因素也很重要,就是所有涉及到訂單號生成的應用都是在同一臺宿主機(linux實體服務器)上, 所以就目前的系統架構我選用了IP的方式。

以下是我的代碼: 

  1. import org.apache.commons.lang3.RandomUtils;  
  2. import java.net.InetAddress;  
  3. import java.time.LocalDateTime;  
  4. import java.time.ZoneId;  
  5. import java.time.format.DateTimeFormatter;  
  6. import java.util.ArrayList;  
  7. import java.util.Collections;  
  8. import java.util.List; 
  9. import java.util.concurrent.atomic.AtomicInteger;  
  10. import java.util.stream.Collectors;  
  11. import java.util.stream.IntStream;  
  12. public class OrderGen2Test {  
  13.     /** 訂單號生成 **/  
  14.     private static ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai");  
  15.     private static final AtomicInteger SEQ = new AtomicInteger(1000);  
  16.     private static final DateTimeFormatter DF_FMT_PREFIX = DateTimeFormatter.ofPattern("yyMMddHHmmssSS");  
  17.     public static String generateOrderNo(){  
  18.         LocalDateTime dataTime = LocalDateTime.now(ZONE_ID);  
  19.         if(SEQ.intValue()>9990){  
  20.             SEQ.getAndSet(1000); 
  21.          }  
  22.         return  dataTime.format(DF_FMT_PREFIX)+ getLocalIpSuffix()+SEQ.getAndIncrement();  
  23.     }  
  24.     private volatile static String IP_SUFFIX = null 
  25.     private static String getLocalIpSuffix (){  
  26.         if(null != IP_SUFFIX){  
  27.             return IP_SUFFIX;  
  28.         }  
  29.         try { 
  30.              synchronized (OrderGen2Test.class){  
  31.                 if(null != IP_SUFFIX){  
  32.                     return IP_SUFFIX;  
  33.                 }  
  34.                 InetAddress addr = InetAddress.getLocalHost();  
  35.                 //  172.17.0.4  172.17.0.199 ,  
  36.                 String hostAddress = addr.getHostAddress();  
  37.                 if (null != hostAddress && hostAddress.length() > 4) {  
  38.                     String ipSuffix = hostAddress.trim().split("\\.")[3];  
  39.                     if (ipSuffix.length() == 2) {  
  40.                         IP_SUFFIX = ipSuffix 
  41.                         return IP_SUFFIX;  
  42.                     }  
  43.                     ipSuffix = "0" + ipSuffix;  
  44.                     IP_SUFFIX = ipSuffix.substring(ipSuffix.length() - 2);  
  45.                     return IP_SUFFIX;  
  46.                 }  
  47.                 IP_SUFFIX = RandomUtils.nextInt(10, 20) + "";  
  48.                 return IP_SUFFIX;  
  49.             }  
  50.         }catch (Exception e){  
  51.             System.out.println("獲取IP失敗:"+e.getMessage());  
  52.             IP_SUFFIX =  RandomUtils.nextInt(10,20)+"";  
  53.             return IP_SUFFIX;  
  54.         }  
  55.     }  
  56.     public static void main(String[] args) {  
  57.         List<String> orderNos = Collections.synchronizedList(new ArrayList<String>());  
  58.         IntStream.range(0,8000).parallel().forEach(i-> 
  59.             orderNos.add(generateOrderNo());  
  60.         });  
  61.         List<String> filterOrderNos = orderNos.stream().distinct().collect(Collectors.toList());  
  62.         System.out.println("訂單樣例:"+ orderNos.get(22));  
  63.         System.out.println("生成訂單數:"+orderNos.size());  
  64.         System.out.println("過濾重復后訂單數:"+filterOrderNos.size());  
  65.         System.out.println("重復訂單數:"+(orderNos.size()-filterOrderNos.size()));  
  66.     }  
  67.  
  68. /**  
  69.   訂單樣例:20082115575546011022  
  70.   生成訂單數:8000  
  71.   過濾重復后訂單數:8000  
  72.   重復訂單數:0  
  73. **/ 

最后,代碼說明及幾點建議

  •  generateOrderNo()方法內不需要加鎖,因為AtomicInteger內使用的是CAS自旋轉鎖(保證可見性的同時也保證原子性,具體的請自行了解)
  •  getLocalIpSuffix()方法內不需要對不為null的邏輯加同步鎖(雙向校驗鎖,整體是一種安全的單例模式)
  •  本人實現的方式并不是解決問題的唯一方式,具體解決問題需要視當前系統架構具體而論
  •  任何測試都是必要的,我同事在前幾次嘗試解決這個問題后都沒有自測,不測試有損開發專業性!

好了,本文到這里了,如果你想看往期同事牛逼系列干貨,可以關注公眾號Java技術棧進行閱讀。 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2021-12-28 06:55:09

事故訂單號績效

2024-03-14 10:30:05

緩存場景DEMO

2021-07-01 06:58:12

高并發訂單號SCM

2024-10-14 12:05:56

2024-06-04 08:19:34

2019-08-23 08:09:18

訂單號生成數據庫ID

2022-07-11 13:58:14

數據庫業務流程系統

2023-01-16 14:49:00

MongoDB數據庫

2021-12-27 07:25:13

項目軟件開發

2025-01-02 09:06:43

2022-09-07 09:09:13

高并發架構

2021-03-19 09:04:15

訂單事故系統

2025-03-11 08:48:35

JVMOOM事故

2025-11-13 07:46:10

2024-09-04 08:55:56

2022-06-30 19:00:00

高可用KeepalivedLinux

2020-08-24 07:34:39

網絡超時請求

2021-03-05 22:41:55

CDH集群CDH集群

2019-08-15 11:11:38

Java數據庫設計

2020-03-20 08:00:32

代碼程序員追求
點贊
收藏

51CTO技術棧公眾號

九色视频成人自拍| 99国产精品免费视频| 日韩大胆视频| 日韩国产欧美三级| 一道本无吗dⅴd在线播放一区| 日韩毛片在线免费看| 岛国最新视频免费在线观看| 蜜桃精品视频在线| 欧美国产第一页| 天天久久综合网| 欧美人与性动交α欧美精品济南到| 国产91高潮流白浆在线麻豆| 91精品国产高清久久久久久| x88av在线| 欧美亚洲二区| 亚洲国产精品久久人人爱蜜臀| 久久精品成人一区二区三区蜜臀| 波多野结衣大片| 亚洲一级片av| 精品久久久久久亚洲综合网站 | 免费在线观看91| 无码久久精品国产亚洲av影片| 亚洲精品一区二区妖精| 精品对白一区国产伦| 免费黄色福利视频| 黄页视频在线播放| 97久久超碰精品国产| 国产精品自在线| 奇米影视第四色777| 国产精品美女久久久久久不卡| 欧美精品久久99| 亚洲国产精品成人天堂| 8888四色奇米在线观看| av一区二区三区黑人| 国产精品久久一区主播| 亚洲国产综合久久| 女同视频在线观看| 波多野结衣一区二区三区免费视频| 亚洲一区二区三区国产| 色一情一乱一伦一区二区三欧美| 成人黄色免费视频| 亚洲美女一区| 欧美超级免费视 在线| 在线免费观看黄色小视频| 国产美女精品视频免费播放软件| 色婷婷精品大在线视频| 大伊香蕉精品视频在线| а√天堂8资源在线官网| 久久精品欧美日韩精品| 精品蜜桃传媒| 亚洲成a人片77777精品| 激情欧美一区二区| 国产精品高清在线观看| 亚洲天堂视频网站| 中文亚洲欧美| 久久久久久综合网天天| 国精品无码一区二区三区| 亚洲日本黄色片| 一区二区三区伦理| 国产精品久久久一本精品 | 成人在线免费| 日韩欧美国产激情| 日本福利视频在线| 国产网红在线观看| 亚洲自拍偷拍欧美| 日韩精品一区二区在线视频| 亚洲区欧洲区| 亚洲欧美日韩国产手机在线| 日韩片电影在线免费观看| 肉丝一区二区| 久久嫩草精品久久久久| 久久久久欧美| 亚洲黄色一级大片| 成人免费观看视频| 国产99在线免费| 久久午夜无码鲁丝片午夜精品| 丁香花视频在线观看| 福利一区二区三区视频在线观看 | 亚洲精品理论电影| 捆绑凌虐一区二区三区| 在线看成人短视频| 自拍视频国产精品| 国产va在线播放| 99riav1国产精品视频| 日本国产精品视频| 一级片在线观看视频| 国产精品一区二区三区99| 国产精品区免费视频| 国产有码在线| 亚洲免费资源在线播放| 日韩中字在线观看| 91久久久久久白丝白浆欲热蜜臀| 欧美一区二区三区在线电影| 国产精品久久久免费观看| 国产免费久久| 欧美人与性动交| av毛片在线免费观看| 韩国一区二区三区| 美女被啪啪一区二区| 欧洲不卡视频| 岛国av一区二区| 午夜av中文字幕| 久久av中文| 蜜桃一区二区三区四区| 亚洲成人中文字幕| 欧美一区二区三区粗大| 国自产拍偷拍福利精品免费一| 国产成人亚洲综合91精品| aa视频在线免费观看| 久久精品视频在线看| 欧美狂野激情性xxxx在线观| 日韩欧美精品电影| 亚洲精品一区二区三区在线观看| 国精产品一区一区| 国产精品亚洲欧美| 91久久精品www人人做人人爽| 国产日韩精品在线看| 亚洲国产成人av网| 中日韩av在线播放| 国产一区毛片| 欧美激情欧美激情| 一级黄在线观看| 久久久www成人免费毛片麻豆| 真实国产乱子伦对白视频| 全球中文成人在线| 亚洲天堂男人天堂女人天堂| 91九色国产在线| 天天干天天操天天爱| 国产激情一区二区三区四区 | 亚洲国内自拍| 91久久久久久久| 成人高清在线| 91国偷自产一区二区使用方法| 台湾佬美性中文| 欧美在线网站| 91亚洲精品一区二区| av大片在线观看| 欧美在线一二三| 亚洲综合网在线观看| 99这里有精品| 国产一区不卡在线观看| www在线视频| 欧美一区二区三区在| 亚洲 欧美 变态 另类 综合| 麻豆国产精品官网| 正在播放91九色| 婷婷久久免费视频| 男女av一区三区二区色多| 九九精品在线视频| a天堂在线视频| 亚洲精品日韩综合观看成人91| 污污网站免费观看| 99精品美女| 亚洲一区二区三| av激情在线| 日韩欧美国产高清| 欧美性猛交xxxxx少妇| 国产精品一品二品| www.激情网| 日韩精品一级| 国内精品久久影院| 日韩国产福利| 欧美午夜一区二区三区| 九九精品视频免费| 国产精品亚洲午夜一区二区三区| 久久免费一级片| 亚洲精品福利| 97超碰国产精品女人人人爽| 婷婷色在线视频| 色综合久久中文综合久久牛| av电影在线不卡| 国产麻豆一区| 中文字幕在线不卡一区| 91欧美一区二区三区| 国内久久精品| 开心色怡人综合网站| 四虎4545www国产精品| 少妇高潮久久77777| 国产女人18毛片18精品| 亚洲国产精品一区二区www| 中文字幕人妻一区二区| 麻豆视频观看网址久久| 日本免费黄色小视频| 婷婷精品在线观看| 国产伦精品一区二区三区精品视频| 在线看一级片| 精品视频在线观看日韩| 中文字幕在线观看精品| 一区二区三区四区高清精品免费观看| 六十路息与子猛烈交尾| 日本中文一区二区三区| 精品免费久久久久久久| 中文字幕亚洲影视| 91九色精品视频| 国产三级电影在线播放| 中文字幕亚洲欧美一区二区三区| www.精品久久| 成人免费观看在线观看| 欧美一区二区精美| 国产污视频网站| 一区二区三区日本| 乐播av一区二区三区| 国产成人亚洲综合a∨婷婷图片| 逼特逼视频在线| 亚洲草久电影| 秋霞毛片久久久久久久久| 日本一区二区乱| 国产精品久久久久久影视| 黄色小说在线播放| 日韩在线观看免费全| 亚洲AV成人无码一二三区在线| 7777精品伊人久久久大香线蕉| 午夜影院免费在线观看| 亚洲高清三级视频| 国产wwwwxxxx| 欧美韩日一区二区三区四区| 秘密基地免费观看完整版中文| 久久99精品久久久| 精品久久久久av| 一区二区福利| 99国产精品白浆在线观看免费| 日韩在线看片| 日韩精品一线二线三线| 天堂社区在线视频| 欧美人与牛zoz0性行为| 国产伦精品一区二区三区免| 精品一区二区三区视频在线播放| 国产精品久久久久久久久免费看 | 久久精品影视| 天堂√在线观看一区二区| 欧美一区二区三区久久| 国产久一道中文一区| 一区二区三区四区精品视频| 成人黄色短视频在线观看| 国模视频一区| 国产91精品在线播放| 女人让男人操自己视频在线观看| 欧美丰满老妇厨房牲生活| 毛片激情在线观看| 亚洲欧美日韩图片| 午夜福利视频一区二区| 亚洲国产精品99| jizz中国少妇| 日韩免费成人网| 亚洲第一第二区| 日韩欧美综合在线| 香蕉久久夜色| 国精产品一区二区三区有限公司 | 亚洲精品一区久久久久久| 午夜激情在线视频| 亚洲精品久久久久久久久久久久| 色婷婷av一区二区三| 日韩成人在线视频| 亚洲AV成人无码一二三区在线| 精品亚洲国产视频| 黄色毛片在线看| 日韩在线视频播放| 免费在线看黄色| 欧美成人精品三级在线观看| 日本在线视频中文有码| 久久久之久亚州精品露出| 日本在线高清| 国产成人一区二| 久久日本片精品aaaaa国产| 91免费精品国偷自产在线| 精品久久亚洲| 国产一区二区三区高清视频| 久久资源综合| 日本一区网站| 亚洲乱码电影| 久久亚洲中文字幕无码| 久久一区视频| 欧美二级三级| 怡红院成永久免费人全部视频| 91久久精品一区二区| 国产精品高潮呻吟AV无码| 日韩一级成人av| 天堂91在线| 最近更新的2019中文字幕| 在线视频观看国产| 8x海外华人永久免费日韩内陆视频| 中文字幕在线视频网站| 国产精品自产拍在线观看中文| 日韩中文在线| 蜜桃狠狠色伊人亚洲综合网站| 青青草国产成人a∨下载安卓| 色乱码一区二区三区熟女| 亚洲第一精品影视| 国产免费999| 国产真实乱对白精彩久久| 超碰97在线资源站| 中文字幕在线观看一区| 国产成人一区二区三区影院在线| 欧美午夜视频网站| 囯产精品一品二区三区| 日韩西西人体444www| 欧美成人免费| 欧美黑人一级爽快片淫片高清| 日日夜夜天天综合| 成人欧美一区二区| 欧美理论在线播放| 成人免费在线网| 超碰免费97在线观看| 精品久久久久久久久久久久久久 | 激情六月婷婷久久| 91精品人妻一区二区| 亚洲精品乱码久久久久久日本蜜臀| 免费视频久久久| 精品精品国产高清a毛片牛牛| av资源网在线观看| 97久久精品人搡人人玩| 国产aa精品| 亚洲高清乱码| 久久精品毛片| 女同性恋一区二区三区| 亚洲特黄一级片| 黄色一区二区视频| 亚洲精品电影在线观看| www.欧美日本韩国| 国产色婷婷国产综合在线理论片a| 任你弄精品视频免费观看| 超碰10000| 久久精品国产成人一区二区三区| 国产亚洲无码精品| 亚洲黄色小视频| 国产精品伦理一区| 国产一区二区三区在线| 中文字幕乱码中文乱码51精品| 粉嫩av免费一区二区三区| 99久久夜色精品国产亚洲96| 中文字幕免费精品一区| 日韩 国产 欧美| 亚洲第一免费播放区| 欧美高清另类hdvideosexjaⅴ| 亚洲999一在线观看www| 香蕉视频国产精品| 日韩av在线中文| 中文字幕第一区综合| 久久久久久无码午夜精品直播| 日韩精品在线免费播放| 亚洲女同志freevdieo| 久久精品欧美| 亚洲人妖在线| a天堂视频在线观看| 亚洲国产成人高清精品| 日本人妻丰满熟妇久久久久久| 午夜剧场成人观在线视频免费观看| 亚洲一级大片| 日本阿v视频在线观看| av在线不卡观看免费观看| 日韩精品视频播放| 精品视频中文字幕| 欧洲精品一区二区三区| 日韩亚洲欧美精品| 麻豆精品一区二区| 免费观看特级毛片| 91精品国产综合久久香蕉的特点| 日本在线人成| 99re资源| 亚洲网站啪啪| 中文字幕丰满孑伦无码专区| 色悠悠久久综合| 香蕉视频网站在线观看| 亚洲国产成人精品久久久国产成人一区 | 欧美大波大乳巨大乳| 91精品福利视频| 色老头视频在线观看| 亚洲xxxx18| 99在线|亚洲一区二区| 一级片视频免费看| 欧美三级日韩三级| 性欧美video高清bbw| 激情视频一区二区| 日本人妖一区二区| 日韩高清dvd碟片| 亚洲精品成人av| av亚洲一区| 久久这里只有精品8| 久久久国产综合精品女国产盗摄| 亚洲综合精品国产一区二区三区| 欧美成人免费小视频| 欧洲亚洲成人| 亚洲一区日韩精品| 一二三区精品福利视频| 男人天堂网在线观看| 91精品在线播放| 国产农村妇女毛片精品久久莱园子| 色噜噜噜噜噜噜| 日韩欧美综合在线| 性感美女一区二区在线观看| 欧美日韩中文字幕在线播放| 91香蕉视频污| 99久久99久久久精品棕色圆| 2019亚洲男人天堂| 亚洲国产精品91| 精品无人区无码乱码毛片国产| 欧美一级欧美三级在线观看| 中文字幕高清在线播放| 国产欧美123| 欧美激情在线观看视频免费|