精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美日韩在线一区| 不卡视频在线看| 美女av一区二区三区| 两女双腿交缠激烈磨豆腐| 国产福利在线免费观看| 91麻豆高清视频| 国产精品爽黄69天堂a| 麻豆一区产品精品蜜桃的特点| 国内毛片久久| 欧美性猛交xxxx黑人交| 性生活免费观看视频| 青草久久伊人| 国产麻豆一精品一av一免费 | 日韩欧美在线123| 337p粉嫩大胆噜噜噜鲁| 麻豆传媒在线观看| 久久色中文字幕| 91精品国产99久久久久久红楼| 国产一级精品视频| 欧美福利影院| 一区二区三区无码高清视频| 亚洲乱妇老熟女爽到高潮的片 | 国产性生活毛片| 91p九色成人| 午夜精品爽啪视频| 三级网在线观看| 国产精品免费播放| 99re视频精品| 超碰在线97av| 国产精品国产一区二区三区四区| 国产日韩欧美一区| 欧美激情乱人伦一区| 国产视频三区四区| 日本国产精品| 亚洲精品一区二区三区精华液 | 日韩中文字幕精品| 最近中文字幕无免费| 欧美经典影片视频网站| 欧美中文字幕不卡| 久久久性生活视频| 性欧美高清come| 中文字幕在线免费不卡| 日本不卡一区| 内衣办公室在线| 9i在线看片成人免费| 亚洲影影院av| 91 中文字幕| 青青草一区二区三区| 奇米色一区二区| 日韩国产欧美精品一区二区三区| 九九热线有精品视频99| 精品久久久久久亚洲综合网| 欧美成人手机在线视频| 91精品国产经典在线观看| 欧美网站在线观看| 777精品久无码人妻蜜桃| 午夜成年人在线免费视频| 亚洲欧美综合色| 伊人久久婷婷色综合98网| 在线播放日本| 国产精品女同一区二区三区| 日本一区免费| www在线播放| 国产精品久久久久毛片软件| 亚洲伊人婷婷| 91在线中字| 一区二区免费在线播放| 中文精品无码中文字幕无码专区 | 哺乳一区二区三区中文视频| 91精品国产麻豆国产自产在线| 五月天婷婷在线观看视频| 精品国产亚洲日本| 精品国产乱码久久久久久老虎| 中国男女全黄大片| 秋霞影视一区二区三区| 亚洲欧美一区二区三区久久| 日韩一级片在线免费观看| 日韩伦理一区| 色综合久综合久久综合久鬼88| 国产在线视频你懂的| 99精品国产福利在线观看免费 | 日本久久久久| 欧美一二三区在线| 国产二级一片内射视频播放 | 日韩av最新在线| 人妻体内射精一区二区| 国产精品一区2区3区| 国产性色av一区二区| 四虎永久免费影院| 97偷自拍亚洲综合二区| 久久久久久久久久av| 中文字幕在线观看视频网站| 久久精品三级| 亚洲最大的av网站| 日韩av视屏| 日韩毛片视频在线看| 国产在线播放观看| 国产成人免费| 日韩av在线一区| 免费看特级毛片| 伊人久久大香线蕉av超碰演员| 国产成人福利网站| www.色婷婷.com| 久久精品夜夜夜夜久久| 狠狠噜天天噜日日噜| 第四色男人最爱上成人网| 欧美一区二区三区免费大片| a级在线观看视频| 一本精品一区二区三区| 奇米四色中文综合久久| www.久久综合| 国产精品嫩草99a| 女人和拘做爰正片视频| 亚洲性视频在线| 色偷偷av一区二区三区| 亚洲另类在线观看| 国产成人丝袜美腿| 一本色道久久综合亚洲二区三区| √天堂8资源中文在线| 欧美日韩亚洲综合| 亚洲国产无码精品| 国产精品sm| 国产九九精品视频| 毛片免费在线| 精品国产91久久久久久老师| 亚洲熟女乱综合一区二区| 色综合五月天| 国产精品美女免费看| 天堂在线视频免费观看| 亚洲日本在线观看| 亚洲综合欧美在线| 国内精品久久久久久久影视简单 | 精品视频自拍| 欧美成人亚洲成人| 亚洲香蕉在线视频| 国产蜜臀av在线一区二区三区| 僵尸世界大战2 在线播放| 欧美中文高清| 欧美成人免费va影院高清| 夜夜躁狠狠躁日日躁av| 欧美激情一区二区三区不卡| 漂亮人妻被中出中文字幕| 红杏成人性视频免费看| 欧美不卡视频一区发布| 一级做a爱片性色毛片| 亚洲国产精品成人综合| 人妻精品无码一区二区三区 | 免费的一级黄色片| 久久国产精品美女| 欧美成人午夜免费视在线看片| 国产乱码精品一区二区三区精东| 国产精品久久久久桃色tv| 激情 小说 亚洲 图片: 伦| 欧美日韩国产高清电影| 国产成人鲁鲁免费视频a| 九色在线观看视频| 日韩欧美国产视频| 草草地址线路①屁屁影院成人| 亚洲免费中文| 欧美自拍资源在线| 久久精品超碰| 久久中文字幕在线| 蜜桃视频在线观看www| 性做久久久久久免费观看 | 国产精品白丝在线| 日本一二三四区视频| 欧美精品一级| 久久久婷婷一区二区三区不卡| 一区一区三区| 色青青草原桃花久久综合| 国产裸体无遮挡| 一区二区三区久久久| 久久久午夜精品福利内容| 一级成人国产| 美日韩精品免费| 国产精品伊人| 欧美国产日产韩国视频| 无码国精品一区二区免费蜜桃| 欧美日韩午夜剧场| 日本成人免费视频| 国产成人av福利| 波多野结衣50连登视频| 水蜜桃精品av一区二区| 成人黄色片视频网站| 伊人久久综合一区二区| 日韩综合中文字幕| 欧美 日韩 综合| 欧美在线你懂得| 69av视频在线| 久久久91精品国产一区二区三区| 亚洲怡红院在线| 国产精品嫩草99av在线| 亚洲一区尤物| 日韩有码av| 91精品久久久久久久久久久久久| 国产丝袜在线观看视频| 在线播放日韩精品| 狠狠综合久久av一区二区| 在线亚洲高清视频| 久久久精品国产sm调教| 欧美激情在线看| 高清中文字幕mv的电影| 免费av网站大全久久| www.av蜜桃| 久久久久久久久丰满| 蜜桃传媒视频麻豆第一区免费观看 | 欧洲福利电影| 国产一区免费观看| 国产一区二区三区黄网站| 日韩免费视频在线观看| 中文字幕有码在线视频| 一区二区亚洲欧洲国产日韩| 黑人精品一区二区| 91精品国产91久久综合桃花| 无码人妻精品一区二区三区9厂 | 日韩亚洲欧美成人| 五月天婷婷社区| 日韩一区二区高清| 国产99久久久久久免费看| 午夜久久久久久| 麻豆changesxxx国产| 中文字幕日韩一区| 日韩中文字幕有码| 91视频.com| 欧美在线一级片| 国产精品77777| 亚洲涩涩在线观看| 美女视频黄频大全不卡视频在线播放| 免费高清在线观看免费| 亚洲无线视频| 国内少妇毛片视频| 99久久99久久精品国产片桃花| 欧美亚洲爱爱另类综合| 久久动漫网址| 国产精品久久久久久久天堂第1集| 四虎影视国产精品| 国产精品欧美一区二区| 韩国精品主播一区二区在线观看| 97超碰国产精品女人人人爽 | 可以免费看污视频的网站在线| 精品成人一区二区| 亚洲成人一级片| 日韩欧美国产一区在线观看| 一级黄色大片免费观看| 欧美日韩在线观看一区二区 | 亚洲三级av在线| 黄色片在线免费观看| 精品一区二区三区四区| 手机亚洲第一页| 亚洲人a成www在线影院| 黄视频在线观看免费| 亚洲欧洲激情在线| 婷婷国产在线| 日韩福利在线播放| 欧美日韩国产亚洲沙发| 一二美女精品欧洲| 在线视频婷婷| 精品精品国产国产自在线| а√天堂在线官网| 国产综合在线看| av丝袜在线| 日本高清视频精品| www.精品国产| 91影视免费在线观看| 欧美影院在线| 国产精品中出一区二区三区| 国产欧美自拍一区| 欧美中日韩免费视频| 国产韩国精品一区二区三区| 日本中文字幕一级片| 亚洲精品专区| 久久综合伊人77777麻豆最新章节| 免费久久精品视频| 日批视频在线看| gogogo免费视频观看亚洲一| 欧美亚一区二区三区| 一区在线观看免费| 中文字幕第28页| 日韩欧美aaa| 国产精品久久久久久免费| 欧美videossexotv100| 天天躁日日躁狠狠躁喷水| 亚洲天堂免费观看| 国产激情在线| 欧美性资源免费| 综合久久av| 精品国产一区二区三| 成人影视亚洲图片在线| 青青视频免费在线| 视频一区中文字幕| 日韩大尺度视频| 亚洲国产成人私人影院tom| 麻豆成人在线视频| 精品视频免费看| 人妻精品无码一区二区| 在线看日韩欧美| caoporn视频在线| 国产在线观看一区二区三区 | 伊人久久男人天堂| 女子免费在线观看视频www| 国产成人免费91av在线| 白嫩白嫩国产精品| 亚洲精品高清国产一线久久| 99视频一区| 一卡二卡三卡四卡五卡| 国产视频不卡一区| 日韩欧美性视频| 91精品国产免费| 国产玉足榨精视频在线观看| 欧美黑人xxxⅹ高潮交| 国产精品久久久久久吹潮| 国产精品一区二区免费| 99精品在线观看| 午夜视频你懂的| 久久久综合视频| 日本少妇吞精囗交| 日韩免费看网站| 黄色av网站在线播放| 国产成人一区二区三区| 久久影视三级福利片| 久久www视频| 国产在线精品一区二区| 在线免费观看视频| 欧美视频中文字幕在线| 日韩性xxxx| 欧美富婆性猛交| 91麻豆精品一二三区在线| 色狠狠久久av五月综合| 久久经典综合| 国内精品久久99人妻无码| 亚洲成人自拍偷拍| 人妻91麻豆一区二区三区| 欧美精品成人91久久久久久久| 国产一区二区av在线| 只有这里有精品| 蜜臀久久99精品久久久画质超高清| 熟女俱乐部一区二区| 欧美午夜精品久久久久久久| 欧美 日韩 国产 成人 在线| 欧美激情在线有限公司| 亚洲日本视频在线| 屁屁影院ccyy国产第一页| 国产激情视频一区二区在线观看 | gogogo高清在线观看免费完整版| 日本精品一区二区三区在线| 神马日本精品| 成人免费观看视频在线观看| 99re热视频精品| 亚洲婷婷综合网| 亚洲人成在线观| av免费在线一区| 一区二区三区四区欧美日韩| 久久国产精品99久久人人澡| 日本免费网站视频| 在线成人高清不卡| 性国产高清在线观看| 国产精品久久久久久久免费大片 | 污视频软件在线观看| 亚州成人av在线| 西野翔中文久久精品国产| 黄色片视频在线播放| 久久久精品国产免大香伊| 啪啪小视频网站| 日韩有码在线观看| 精品午夜视频| av在线播放亚洲| 国产无遮挡一区二区三区毛片日本| 99久久精品国产亚洲| 在线精品高清中文字幕| а天堂中文最新一区二区三区| 乱熟女高潮一区二区在线| 岛国av在线一区| 国产精品视频一区在线观看| 最近2019年好看中文字幕视频 | 亚洲аv电影天堂网| 蜜桃视频动漫在线播放| 日韩精品不卡| 国产精品小仙女| 在线视频一区二区三区四区| 中文字幕在线日韩 | 五码日韩精品一区二区三区视频| 精品一区二区三区的国产在线播放| 精品99在线观看| 亚洲人午夜精品免费| 久久伊人影院| 欧美视频第一区| 亚洲免费观看高清完整版在线 | 国产精品嫩草影院av蜜臀| 亚洲精品久久久蜜桃动漫| 日韩美女视频免费看| 亚洲午夜精品一区二区国产| 午夜视频在线观看国产| 精品视频在线看| www视频在线观看| 尤物一区二区三区| 91在线你懂得| 国产视频在线免费观看| 国产成人精品av| 激情六月综合| 蜜桃视频最新网址|