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

基于SpringBoot與數據庫表記錄的方式實現分布式鎖

數據庫 分布式
今天演示一下最簡單的分布式鎖方案——基于數據庫表記錄的分布式鎖.

[[386855]]

 同一進程內的不同線程操作共享資源時,我們只需要對資源加鎖,比如利用JUC下的工具,就可以保證操作的正確性。對JUC不熟悉的同學,可以看看以下的幾篇文章:

  • 淺說Synchronized
  • Synchronized的優化
  • JUC基石——Unsafe類

但是,為了高可用,我們的系統總是多副本的,分布在不同的機器上,以上同進程內的鎖機制就不再起作用。為了保證多副本系統對共享資源的訪問,我們引入了分布式鎖。

分布式鎖主要的實現方式有以下幾種:

  • 基于數據庫的,其中又細分為基于數據庫的表記錄、悲觀鎖、樂觀鎖
  • 基于緩存的,比如Redis
  • 基于Zookeeper的

今天演示一下最簡單的分布式鎖方案——基于數據庫表記錄的分布式鎖

主要的原理就是利用數據庫的唯一索引(對數據庫的索引不了解的同學,可以參考我的另外一篇文章mysql索引簡談)

例如,有以下的一張表:

  1. CREATE TABLE `test`.`Untitled`  ( 
  2.   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增序號'
  3.   `namevarchar(255) NOT NULL COMMENT '鎖名稱'
  4.   `survival_time` int(11) NOT NULL COMMENT '存活時間,單位ms'
  5.   `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '創建時間'
  6.   `thread_name` varchar(255) NOT NULL COMMENT '線程名稱'
  7.   PRIMARY KEY (`id`) USING BTREE, 
  8.   UNIQUE INDEX `uk_name`(`name`) USING BTREE 
  9. ) ENGINE = InnoDB ROW_FORMAT = Dynamic

 其中name字段加上了唯一索引,多條含有同樣name值的新增操作,數據庫只能保證僅有一個操作成功,其他操作都會被拒絕掉,并且拋出“重復鍵”的錯誤。

那么,當系統1準備獲取分布式鎖時,就嘗試往數據庫中插入一條name="key"的記錄,如果插入成功,則代表獲取鎖成功。其他系統想要獲取分布式鎖,同樣需要往數據庫插入相同name的記錄,當然數據庫會報錯,插入失敗,也就代表著這些系統獲取鎖失敗。當系統1想要釋放掉鎖時,刪除掉此記錄即可。thread_name列可以用來保證只能主動釋放自己創建的鎖。

我們希望實現的分布式鎖有以下的效果:

  1. 獲取鎖是阻塞的,獲取不到會一直阻塞
  2. 鎖會失效,超過鎖的生存時間后,會自動釋放掉。這一點可以避免某些系統因為宕機而無法主動釋放鎖的問題

大致的流程圖如下:

使用到了以下依賴:

  • SpringBoot
  • MyBatis-plus
  • Lombok

項目的工程目錄為:

其中pom文件用到的依賴:

  1. <dependencies> 
  2.     <dependency> 
  3.         <groupId>org.springframework.boot</groupId> 
  4.         <artifactId>spring-boot-starter-web</artifactId> 
  5.     </dependency> 
  6.  
  7.     <dependency> 
  8.         <groupId>org.projectlombok</groupId> 
  9.         <artifactId>lombok</artifactId> 
  10.         <version>1.18.6</version> 
  11.     </dependency> 
  12.  
  13.     <dependency> 
  14.         <groupId>mysql</groupId> 
  15.         <artifactId>mysql-connector-java</artifactId> 
  16.     </dependency> 
  17.  
  18.     <dependency> 
  19.         <groupId>com.baomidou</groupId> 
  20.         <artifactId>mybatis-plus-boot-starter</artifactId> 
  21.         <version>3.3.1</version> 
  22.     </dependency> 
  23.  
  24.     <dependency> 
  25.         <groupId>com.baomidou</groupId> 
  26.         <artifactId>mybatis-plus-extension</artifactId> 
  27.         <version>3.3.1</version> 
  28.     </dependency> 
  29.  
  30.     <dependency> 
  31.         <groupId>org.springframework.boot</groupId> 
  32.         <artifactId>spring-boot-starter-test</artifactId> 
  33.         <scope>test</scope> 
  34.     </dependency> 
  35. </dependencies> 

 配置項為:

  1. server: 
  2.   port: 9091 
  3.  
  4.  
  5. spring: 
  6.   datasource: 
  7.     driver-class-name: com.mysql.cj.jdbc.Driver 
  8.     url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai 
  9.     username: root 
  10.     password: a123 
  11.  
  12. logging: 
  13.   level
  14.     root: info 

 用于映射數據庫字段的實體類為:

  1. package com.yang.lock1.entity; 
  2.  
  3. import com.baomidou.mybatisplus.annotation.IdType; 
  4. import com.baomidou.mybatisplus.annotation.TableField; 
  5. import com.baomidou.mybatisplus.annotation.TableId; 
  6. import com.baomidou.mybatisplus.annotation.TableName; 
  7. import lombok.AllArgsConstructor; 
  8. import lombok.Data; 
  9. import lombok.NoArgsConstructor; 
  10.  
  11. import java.util.Date
  12.  
  13. /** 
  14.  * @author qcy 
  15.  * @create 2020/08/25 15:03:47 
  16.  */ 
  17. @Data 
  18. @NoArgsConstructor 
  19. @TableName(value = "t_lock"
  20. public class Lock { 
  21.  
  22.     /** 
  23.      * 自增序號 
  24.      */ 
  25.     @TableId(value = "id", type = IdType.AUTO) 
  26.     private Integer id; 
  27.  
  28.     /** 
  29.      * 鎖名稱 
  30.      */ 
  31.     private String name
  32.  
  33.     /** 
  34.      * 存活時間,單位ms 
  35.      */ 
  36.     private int survivalTime; 
  37.  
  38.     /** 
  39.      * 鎖創建的時間 
  40.      */ 
  41.     private Date createTime; 
  42.  
  43.     /** 
  44.      * 線程名稱 
  45.      */ 
  46.     private String ThreadName; 

 Dao層:

  1. package com.yang.lock1.dao; 
  2.  
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper; 
  4. import com.yang.lock1.entity.Lock; 
  5. import org.apache.ibatis.annotations.Mapper; 
  6.  
  7. /** 
  8.  * @author qcy 
  9.  * @create 2020/08/25 15:06:24 
  10.  */ 
  11. @Mapper 
  12. public interface LockDao extends BaseMapper<Lock> { 

 Service接口層:

  1. package com.yang.lock1.service; 
  2.  
  3. import com.baomidou.mybatisplus.extension.service.IService; 
  4. import com.yang.lock1.entity.Lock; 
  5.  
  6. /** 
  7.  * @author qcy 
  8.  * @create 2020/08/25 15:07:44 
  9.  */ 
  10. public interface LockService extends IService<Lock> { 
  11.  
  12.     /** 
  13.      * 阻塞獲取分布式鎖 
  14.      * 
  15.      * @param name         鎖名稱 
  16.      * @param survivalTime 存活時間 
  17.      */ 
  18.     void lock(String nameint survivalTime); 
  19.  
  20.     /** 
  21.      * 釋放鎖 
  22.      * 
  23.      * @param name 鎖名稱 
  24.      */ 
  25.     public void unLock(String name); 

 Service實現層:

  1. package com.yang.lock1.service.impl; 
  2.  
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 
  4. import com.yang.lock1.dao.LockDao; 
  5. import com.yang.lock1.entity.Lock; 
  6. import com.yang.lock1.service.LockService; 
  7. import lombok.extern.slf4j.Slf4j; 
  8. import org.springframework.dao.DuplicateKeyException; 
  9. import org.springframework.stereotype.Service; 
  10.  
  11. import java.util.Date
  12.  
  13. /** 
  14.  * @author qcy 
  15.  * @create 2020/08/25 15:08:25 
  16.  */ 
  17. @Slf4j 
  18. @Service 
  19. public class LockServiceImpl extends ServiceImpl<LockDao, Lock> implements LockService { 
  20.  
  21.     @Override 
  22.     public void lock(String nameint survivalTime) { 
  23.         String threadName = "system1-" + Thread.currentThread().getName(); 
  24.         while (true) { 
  25.             Lock lock = this.lambdaQuery().eq(Lock::getName, name).one(); 
  26.             if (lock == null) { 
  27.                 //說明無鎖 
  28.                 Lock lk = new Lock(); 
  29.                 lk.setName(name); 
  30.                 lk.setSurvivalTime(survivalTime); 
  31.                 lk.setThreadName(threadName); 
  32.                 try { 
  33.                     save(lk); 
  34.                     log.info(threadName + "獲取鎖成功"); 
  35.                     return
  36.                 } catch (DuplicateKeyException e) { 
  37.                     //繼續重試 
  38.                     log.info(threadName + "獲取鎖失敗"); 
  39.                     continue
  40.                 } 
  41.             } 
  42.  
  43.             //此時有鎖,判斷鎖是否過期 
  44.             Date now = new Date(); 
  45.             Date expireDate = new Date(lock.getCreateTime().getTime() + lock.getSurvivalTime()); 
  46.             if (expireDate.before(now)) { 
  47.                 //鎖已經過期 
  48.                 boolean result = removeById(lock.getId()); 
  49.                 if (result) { 
  50.                     log.info(threadName + "刪除了過期鎖"); 
  51.                 } 
  52.  
  53.                 //嘗試獲取鎖 
  54.                 Lock lk = new Lock(); 
  55.                 lk.setName(name); 
  56.                 lk.setSurvivalTime(survivalTime); 
  57.                 lk.setThreadName(threadName); 
  58.                 try { 
  59.                     save(lk); 
  60.                     log.info(threadName + "獲取鎖成功"); 
  61.                     return
  62.                 } catch (DuplicateKeyException e) { 
  63.                     log.info(threadName + "獲取鎖失敗"); 
  64.                 } 
  65.             } 
  66.         } 
  67.  
  68.     } 
  69.  
  70.     @Override 
  71.     public void unLock(String name) { 
  72.         //釋放鎖的時候,需要注意只能釋放自己創建的鎖 
  73.         String threadName = "system1-" + Thread.currentThread().getName(); 
  74.         Lock lock = lambdaQuery().eq(Lock::getName, name).eq(Lock::getThreadName, threadName).one(); 
  75.         if (lock != null) { 
  76.             boolean b = removeById(lock.getId()); 
  77.             if (b) { 
  78.                 log.info(threadName + "釋放了鎖"); 
  79.             } else { 
  80.                 log.info(threadName + "準備釋放鎖,但鎖過期了,被其他客戶端強制釋放掉了"); 
  81.             } 
  82.         } else { 
  83.             log.info(threadName + "準備釋放鎖,但鎖過期了,被其他客戶端強制釋放掉了"); 
  84.         } 
  85.     } 
  86.  

 測試類如下:

 

  1. package com.yang.lock1; 
  2.  
  3. import com.yang.lock1.service.LockService; 
  4. import lombok.extern.slf4j.Slf4j; 
  5. import org.junit.Test; 
  6. import org.junit.runner.RunWith; 
  7. import org.springframework.boot.test.context.SpringBootTest; 
  8. import org.springframework.test.context.junit4.SpringRunner; 
  9.  
  10. import javax.annotation.Resource; 
  11.  
  12. /** 
  13.  * @author qcy 
  14.  * @create 2020/08/25 15:10:54 
  15.  */ 
  16. @Slf4j 
  17. @RunWith(SpringRunner.class) 
  18. @SpringBootTest 
  19. public class Lock1ApplicationTest { 
  20.  
  21.     @Resource 
  22.     LockService lockService; 
  23.  
  24.     @Test 
  25.     public void testLock() { 
  26.         log.info("system1準備獲取鎖"); 
  27.         lockService.lock("key", 6 * 1000); 
  28.         try { 
  29.             //模擬業務耗時 
  30.             Thread.sleep(4 * 1000); 
  31.         } catch (Exception e) { 
  32.             e.printStackTrace(); 
  33.         } finally { 
  34.             lockService.unLock("key"); 
  35.         } 
  36.     } 
  37.  

 

將代碼復制一份出來,將system1改為system2?,F在,同時啟動兩個系統:

system1的輸出如下:


system2的輸出如下:


第23.037秒時,system1嘗試獲取鎖,23.650秒時獲取成功,持有分布式鎖。第26秒時system2嘗試獲取鎖,被阻塞。到27.701秒時,system1釋放掉了鎖,system2在27.749時才獲取到了鎖,在31秒時釋放掉了。

現在我們將system1的業務時長改為10秒,就可以模擬出system2釋放system1超時的鎖的場景了。

先啟動system1,再啟動system2

此時system1的輸出如下:


system2的輸出如下:


14秒時,system1獲取到了鎖,接著由于業務耗時突然超出預期,需要運行10秒。在此期間,system1創建的鎖超過了其存活時間。此時system2在19秒時,刪除了此過期鎖,接著獲取到了鎖。24秒時,system1回頭發現自己的鎖已經被釋放掉了,最后system2正常釋放掉了自己的鎖。

基于數據庫實現分布式鎖,還有悲觀鎖與樂觀鎖方式,我會另開篇幅。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2024-05-06 00:00:00

.NET分布式鎖技術

2017-01-16 14:13:37

分布式數據庫

2018-04-03 16:24:34

分布式方式

2017-04-13 10:51:09

Consul分布式

2022-10-27 10:44:14

分布式Zookeeper

2017-10-24 11:28:23

Zookeeper分布式鎖架構

2024-10-09 17:12:34

2024-07-29 09:57:47

2019-05-30 08:31:39

數據庫QTSDB分布式

2021-08-16 09:55:41

鴻蒙HarmonyOS應用

2023-01-13 07:39:07

2015-10-16 18:03:25

Docker分布式CoreOS

2024-11-28 15:11:28

2023-09-04 08:12:16

分布式鎖Springboot

2022-11-06 19:28:02

分布式鎖etcd云原生

2019-08-19 10:24:33

分布式事務數據庫

2021-07-13 06:57:12

SpringbootAOP緩存

2019-06-19 15:40:06

分布式鎖RedisJava

2021-02-28 07:49:28

Zookeeper分布式

2024-12-11 12:41:33

點贊
收藏

51CTO技術棧公眾號

日本黑人久久| 欧美激情videos| 国内自拍视频网| h视频网站在线观看| 久久99热狠狠色一区二区| 欧美精品在线观看| 永久免费看mv网站入口78| 成人黄页网站视频| 亚洲一区二区三区免费视频| 欧美男人的天堂| 精品国产亚洲av麻豆| 日韩视频一区二区三区在线播放免费观看| 亚洲天堂免费视频| 丰满饥渴老女人hd| 色8久久影院午夜场| 亚洲一级二级在线| 亚洲午夜在线观看| 天天操天天干天天爽| 精品一区二区三区欧美| 4k岛国日韩精品**专区| 日韩免费在线观看| 国产精品久久久久久久久久直播| 日韩三级av在线| 99精品国产一区二区三区| 亚洲第一网站免费视频| 亚洲免费成人在线视频| 原纱央莉成人av片| 亚洲一区二区在线免费观看视频| 色综合电影网| 全部免费毛片在线播放网站| 国产成人免费视频| 国产免费一区视频观看免费 | 国产欧美日韩在线观看| 国产成人精品免费视频大全最热 | 久久久全国免费视频| heyzo久久| 日韩av在线免费观看| 亚洲视频在线不卡| **国产精品| 欧美四级电影在线观看| 92看片淫黄大片一级| 99爱在线观看| 亚洲国产精品自拍| 大西瓜av在线| 午夜av在线播放| 亚洲欧美日韩久久精品| 亚洲精品一区二区三| 国产51人人成人人人人爽色哟哟 | 日韩视频一区二区在线观看| 手机av在线免费| 一级欧美视频| 欧美天堂亚洲电影院在线播放| 99热手机在线| 成人日韩在线观看| 欧美性做爰猛烈叫床潮| 国产成人手机视频| 91在线成人| 欧美午夜精品免费| 日本高清久久久| 四虎地址8848精品| 欧美一级日韩一级| www.黄色网| 成人三级av在线| 亚洲国内精品在线| 老鸭窝一区二区| 国产区精品区| 久久精品2019中文字幕| 一级片一级片一级片| 亚洲成人免费| 久久久久久免费精品| 精品成人久久久| 香蕉久久国产| 国产精品免费视频xxxx| 国产精品无码在线播放| 高清shemale亚洲人妖| 国产日韩在线一区二区三区| 日韩有码第一页| 久久综合久色欧美综合狠狠| 日本不卡久久| 九七久久人人| 亚洲一区二区欧美激情| 欧美xxxxx在线视频| 亚洲成av在线| 91精品啪在线观看国产60岁| av不卡中文字幕| 少妇一区二区三区| 久久激情五月丁香伊人| 偷偷操不一样的久久| 奇米一区二区三区| 国产精品一区免费观看| 国产精品毛片一区二区三区四区| 中文字幕在线播放不卡一区| 免费高清一区二区三区| 写真福利精品福利在线观看| 91精品国产91热久久久做人人| 91视频在线免费| 成人a'v在线播放| 欧美国产日韩视频| 懂色av蜜臀av粉嫩av喷吹| 国产盗摄一区二区三区| 欧美日韩一区二区三区在线视频| 免费在线看黄色| 欧美色另类天堂2015| 日本中文字幕影院| 精品中文字幕一区二区三区av| 最新亚洲国产精品| av中文在线播放| 韩国一区二区三区| 欧美在线一二三区| 特级毛片在线| 欧美美女一区二区三区| yy1111111| 中文无码久久精品| 国产精欧美一区二区三区| 亚洲高清视频网站| 国产精品乱码人人做人人爱| 少妇高潮喷水在线观看| 成人噜噜噜噜| 国产亚洲激情在线| 国产精品久久久久久久妇| 国产真实乱子伦精品视频| 欧美一区视久久| 草草视频在线| 日韩欧美电影一区| 日韩一卡二卡在线观看| 久久午夜影视| 久久riav二区三区| 爱搞国产精品| 精品国产免费人成在线观看| 亚洲精品久久久久久国| 91高潮大合集爽到抽搐| 欧美激情视频一区二区三区在线播放 | 在线观看日韩av电影| 成人午夜两性视频| 国产二区视频在线观看| 一本色道久久综合精品竹菊| 免费看黄色片的网站| 91超碰国产精品| 国产深夜精品福利| 95在线视频| 欧美性色黄大片| 免费看黄色的视频| 西西人体一区二区| 久久综合给合久久狠狠色| 蜜桃传媒在线观看免费进入| 欧美一区二区在线观看| 日韩在线观看免| 美女视频免费一区| 亚洲欧美日韩国产yyy| 欧美影视资讯| 中文字幕亚洲精品| 中文字幕在线日亚洲9| 国产女人aaa级久久久级| 蜜臀av午夜一区二区三区| 要久久爱电视剧全集完整观看 | 丁香六月综合激情| 黄色一级片黄色| 9l视频自拍九色9l视频成人| 久久理论片午夜琪琪电影网| 亚洲产国偷v产偷v自拍涩爱| 亚洲一区在线观看免费| 国产真实乱人偷精品| 一区二区激情| 欧美精品二区三区四区免费看视频| 午夜影视一区二区三区| 日韩精品在线观| 国产免费www| 国产精品久久久久久久久免费樱桃| 99sesese| 欧美日韩亚洲一区| 精品午夜一区二区| 免费观看亚洲| 日日骚av一区| 精品久久人妻av中文字幕| 亚洲最大成人综合| 国产精品探花一区二区在线观看| 老色鬼久久亚洲一区二区| 亚洲一区三区在线观看| 日韩中文字幕视频网| 久久男人av资源网站| 飘雪影视在线观看免费观看| 欧美三级视频在线播放| 精品国产精品国产精品| av在线播放一区二区三区| 妺妺窝人体色www在线观看| 我不卡伦不卡影院| 精品国产一区二区三区日日嗨 | 欧美自拍偷拍一区| 韩国一级黄色录像| 不卡一区中文字幕| 999精品视频在线| 欧美日韩综合| 区一区二区三区中文字幕| 白嫩亚洲一区二区三区| 91国产精品视频在线| www.黄在线观看| 日韩一二三四区| 亚洲午夜18毛片在线看| 亚洲欧美日韩国产综合| 亚洲精品在线视频免费观看| 免费在线成人网| 丝袜人妻一区二区三区| 成人亚洲一区| 激情伦成人综合小说| 丁香婷婷久久| 91sa在线看| caopen在线视频| 亚洲欧美精品一区二区| 国产成人三级在线播放 | 欧美激情va永久在线播放| 国产小视频免费在线网址| 欧美一区二区三区公司| 国产又大又黄又粗| 一区二区三区中文在线| youjizz亚洲女人| 91久色porny| 丰满少妇中文字幕| 美日韩一区二区| 男人揉女人奶房视频60分| 欧美精品1区| 亚洲一区bb| 精品国产乱码久久久久久果冻传媒| 国产精品亚洲综合| 久久久久久一区二区三区四区别墅| 91精品国产91久久久久久不卡| 亚洲男同gay网站| 中文字幕九色91在线| 深夜福利免费在线观看| 精品久久久久久久久久久院品网 | 成人免费影院| 国内久久久精品| 色操视频在线| 欧美精品一区三区| 国产丝袜在线| 久久精品国产2020观看福利| gogogo高清在线观看免费完整版| 亚洲欧美国产视频| 亚州av在线播放| 精品视频www| 婷婷丁香花五月天| 亚洲成人在线视频播放| 亚洲卡一卡二卡三| 日韩欧美视频在线| www.热久久| 欧美变态凌虐bdsm| 亚洲精品综合网| 欧美精品一区二区久久婷婷| 亚洲第一页视频| 欧美成人bangbros| 开心激情综合网| 精品成a人在线观看| 高h调教冰块play男男双性文| 精品美女在线观看| 日本高清视频在线| 日韩av一区在线观看| 无码精品人妻一区二区三区影院| 欧美精品一区二区在线播放| 韩国av在线免费观看| 亚洲精品国精品久久99热一| 日韩在线无毛| 在线观看日韩欧美| 国产精品剧情| 欧美激情中文字幕乱码免费| gogo高清午夜人体在线| 97免费中文视频在线观看| 电影一区二区三| 国产欧美日韩最新| 久久久久久久久久久久电影| 98国产高清一区| 国产精品调教| 欧美亚洲爱爱另类综合| 欧美3p视频| 男人添女荫道口女人有什么感觉| 99视频一区| 超碰在线播放91| 粉嫩av一区二区三区粉嫩| 成人手机在线免费视频| 国产亚洲欧洲一区高清在线观看| 手机av在线不卡| 亚洲已满18点击进入久久| 国产高潮久久久| 欧美日韩视频不卡| 丰满少妇被猛烈进入| 亚洲另类欧美自拍| 精品孕妇一区二区三区| 亚州成人av在线| 国产三级一区| 国产伦精品一区二区三区四区视频| 国产麻豆精品久久| japanese在线播放| 欧美专区一区二区三区| 天天综合成人网| 99精品视频一区二区| 九九热久久免费视频| 亚洲资源在线观看| 中文字幕日本视频| 欧美v亚洲v综合ⅴ国产v| 国产中文字幕在线播放| 九九热精品在线| 日韩影片中文字幕| 粉嫩av四季av绯色av第一区 | 伊人久久大香线蕉精品| 在线不卡亚洲| 中文字幕第22页| 97国产精品videossex| 欧美三级黄色大片| 日韩欧美视频一区二区三区| 国产日韩欧美视频在线观看| 精品一区二区亚洲| 色爱综合区网| 国产日韩专区在线| 狠狠色丁香婷婷综合影院| av久久久久久| 毛片一区二区三区| 一二三不卡视频| 亚洲一区在线观看视频| 91成品人影院| 国产亚洲欧美日韩一区二区| 超碰97免费在线| 成人激情视频在线播放| 欧美老女人另类| 日韩久久一级片| 成人高清在线视频| 免费一级片视频| 7777女厕盗摄久久久| 高清毛片在线看| 亲子乱一区二区三区电影| 国产成人av毛片| 日韩精品久久一区二区| 狠狠色狠狠色合久久伊人| 亚洲色成人网站www永久四虎| 午夜精品福利视频网站| 亚洲精品久久久久久无码色欲四季 | 精品视频一区 二区 三区| 欧美精品少妇| 91tv亚洲精品香蕉国产一区7ujn| 哺乳挤奶一区二区三区免费看| 国产麻豆电影在线观看| 狠狠色狠狠色合久久伊人| youjizz亚洲女人| 欧美三级在线看| 欧美午夜电影一区二区三区| 国产精品视频不卡| 日韩欧美高清| 亚洲欧美自拍另类日韩| 国产精品嫩草99a| 国产一区二区三区视频免费观看| 中文字幕日韩综合av| 欧美美女被草| 一区二区国产日产| 狠狠色丁香九九婷婷综合五月| 免费三级在线观看| 欧美一区二区成人6969| av黄在线观看| av成人午夜| 亚洲视频观看| 久久人妻少妇嫩草av无码专区| 亚洲成av人综合在线观看| 欧美一区二区黄片| 91超碰中文字幕久久精品| 妖精视频一区二区三区免费观看| 人妻无码视频一区二区三区| 国产欧美日韩精品一区| 一区二区日韩视频| 另类色图亚洲色图| 96sao在线精品免费视频| 免费视频爱爱太爽了| 91亚洲精华国产精华精华液| www.国产毛片| 久久久精品一区二区| 无人区乱码一区二区三区| 黄页网站在线观看视频| 久久综合九色综合97婷婷女人| 国产乱码77777777| 久久精品亚洲94久久精品| 51社区在线成人免费视频| 欧美精品一区免费| 日本一区二区成人在线| 精品人妻一区二区三区三区四区| 性欧美在线看片a免费观看 | 热这里只有精品| 成人看片黄a免费看在线| 中文字幕亚洲乱码熟女1区2区| 中国人与牲禽动交精品| 一区二区三区免费在线看| 亚洲熟女乱色一区二区三区| 国产精品视频yy9299一区| www.中文字幕| 国产福利视频一区| 中文字幕乱码亚洲无线精品一区| 7788色淫网站小说| 欧美午夜电影在线播放| 青青青国内视频在线观看软件| 欧美一区少妇| 国产v综合v亚洲欧| 久久影视中文字幕| 九九久久久久久久久激情| 欧美日韩一二三四| 野战少妇38p| 欧美日韩激情一区二区|