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

羞羞视频在线免费国产| 国产精品无码永久免费不卡| 香蕉视频免费在线播放| 久久国产尿小便嘘嘘| 中文字幕亚洲天堂| 男人午夜视频在线观看| 91三级在线| 大尺度一区二区| 26uuu久久噜噜噜噜| 日本xxx在线播放| 素人一区二区三区| 一区av在线播放| 九九九九九九精品| 伊人网站在线观看| 欧美日本一区二区视频在线观看 | 北条麻妃视频在线| 黄视频网站在线| 91麻豆swag| 国产日韩欧美中文在线播放| 久草网视频在线观看| 秋霞影视一区二区三区| 欧美日韩国产美| 大荫蒂性生交片| 免费网站永久免费观看| 性高潮免费视频| 欧美极度另类| 夜夜嗨av一区二区三区| 蜜桃91精品入口| 国产免费高清视频| 在线一区视频| 另类视频在线观看| 久久av无码精品人妻系列试探| 国产激情精品一区二区三区| 精品久久久久久久久久久| 一区二区不卡视频| 青青青草网站免费视频在线观看| 九九视频精品免费| 国产福利精品在线| 日韩av女优在线观看| 天天揉久久久久亚洲精品| 337p日本欧洲亚洲大胆色噜噜| 亚洲黄色小视频在线观看| 欧美13一16娇小xxxx| 久久蜜桃av一区精品变态类天堂| 91精品一区二区| 男人天堂视频网| 亚洲经典在线| 久久久国产精彩视频美女艺术照福利| 欧美一级片黄色| 天堂中文av在线| 青青草免费观看免费视频在线| 韩国av一区二区三区四区| 日韩av片免费在线观看| 豆国产97在线 | 亚洲| 久久久人成影片免费观看| 一区二区av在线| 中文字幕一区三区久久女搜查官| 一区二区三区在线免费看| 3751色影院一区二区三区| 99视频在线免费| 亚洲美女久久精品| 亚洲综合在线视频| 法国空姐在线观看免费| 天堂中文8资源在线8| 久久精品人人做人人爽97| 好看的日韩精品视频在线| 中文字幕制服诱惑| 日韩精品欧美成人高清一区二区| 午夜精品久久久久久久99热浪潮| 国产wwwwxxxx| 欧美电影三区| 最近2019中文免费高清视频观看www99 | 精品丝袜在线| 亚洲免费在线看| 日本一本草久p| 黄视频在线观看网站| 亚洲欧洲精品天堂一级| www.午夜色| 91香蕉在线观看| 亚洲永久精品大片| 黄色一级片黄色| av不卡高清| 天天影视网天天综合色在线播放 | 992kp快乐看片永久免费网址| 欲香欲色天天天综合和网| 欧美日韩国产综合视频在线观看中文| 国产一线二线三线女| 欧美videossex| 婷婷久久综合九色综合伊人色| 97视频久久久| 一区二区精品伦理...| 日本乱人伦一区| 91香蕉视频污版| 日韩成人一区| 日韩欧美久久久| 中文成人无字幕乱码精品区| 丝袜久久网站| 色伦专区97中文字幕| 久久的精品视频| 美女被爆操网站| 免费成人av| 久久成年人免费电影| 久草国产精品视频| 韩国一区二区三区| 久久久久久久久久码影片| 快射av在线播放一区| 富二代精品短视频| 四虎1515hh.com| 亚洲另类av| 欧美成人精品一区二区| 国产视频1区2区| 国产成人啪午夜精品网站男同| 欧美韩国日本精品一区二区三区| 最新黄网在线观看| 91精品91久久久中77777| 免费观看污网站| 日本不卡电影| 日本精品中文字幕| 亚洲AV无码国产精品午夜字幕| 久久久91精品国产一区二区精品| www.日本三级| 天堂综合在线播放| 亚洲人永久免费| 成年人免费看毛片| 国产成人av自拍| 成年人黄色在线观看| 色豆豆成人网| 亚洲免费人成在线视频观看| 久久精品国产av一区二区三区| 久久99热99| 午夜视频久久久| 欧美日韩大片| 日韩久久免费视频| 亚洲日本韩国在线| 丁香婷婷综合色啪| 97久久国产亚洲精品超碰热| 国产偷人视频免费| 欧美xx视频| 亚洲精品美女网站| 日本在线观看视频网站| 国产成人精品三级| 欧美一级爱爱视频| 久久久91麻豆精品国产一区| 日韩有码在线视频| 这里只有精品9| 中文字幕 久热精品 视频在线 | 日本污视频网站| 久久成人国产| 久久精品美女| 手机av在线| 日韩精品福利网站| 日韩欧美成人一区二区三区| 91免费观看国产| 99999精品视频| 国产不卡一二三区| 国产成人亚洲综合91精品| 你懂的在线视频| 色婷婷亚洲一区二区三区| 欧美做受高潮6| 免费高清在线一区| 中文字幕日韩精品久久| 亚洲一区导航| 欧美黑人性猛交| 色视频一区二区三区| shkd中文字幕久久在线观看| 欧美性大战xxxxx久久久| 日韩一级片在线免费观看| 日本美女视频一区二区| 99re99热| 精品综合久久88少妇激情| 51ⅴ精品国产91久久久久久| 撸视在线观看免费视频| 欧美日韩在线播放三区四区| 日本 欧美 国产| 高清在线成人网| 久久久久久久久久久99| 欧美日韩国产一区二区三区不卡| 国产在线观看精品| 亚洲小说区图片区都市| 亚洲黄在线观看| 欧美另类高清videos的特点| 中文字幕在线不卡视频| 国内自拍偷拍视频| 三级成人在线视频| 九一免费在线观看| 亚洲福利网站| 成人性生交大片免费观看嘿嘿视频| 羞羞的视频在线观看| 亚洲欧美中文日韩v在线观看| 中文字幕福利视频| 极品人妻videosss人妻| 国产丶欧美丶日本不卡视频| 国产极品在线视频| 99久久视频| 欧美疯狂性受xxxxx喷水图片| 一区二区三区四区久久| 成人看片黄a免费看视频| 国产成人精品免高潮费视频| 黄色小网站在线观看| 亚洲精品91美女久久久久久久| 中文字幕+乱码+中文乱码www| 一区二区三区美女| 成人无码av片在线观看| 成人性生交大片免费看中文网站| www.日本xxxx| 99riav1国产精品视频| 亚洲欧美日韩在线综合| 偷拍一区二区| 999国内精品视频在线| 亚洲成av在线| 韩国v欧美v日本v亚洲| 九七久久人人| 国产午夜精品视频免费不卡69堂| 空姐吹箫视频大全| 欧美理论电影在线| av黄色在线看| 亚洲影院久久精品| 日本 欧美 国产| 久久精品视频一区二区| 国产视频精品视频| 国产乱码一区二区三区| 中文字幕av不卡在线| 夜夜嗨av一区二区三区网站四季av| 亚洲免费av网| 日韩片欧美片| 欧洲高清一区二区| 国产又色又爽又高潮免费| 亚洲在线黄色| 精品无码国产一区二区三区av| 91精品综合久久久久久久久久久 | 中文字幕第38页| 久久永久免费| 无码人妻精品一区二区三区在线| 很黄很黄激情成人| www.黄色网址.com| 亚洲成av人电影| 黄色www在线观看| 国产精品99久久久久久动医院| 神马影院一区二区三区| 精品高清在线| 日本不卡在线播放| 免费看av成人| 欧美一区二区三区精美影视| 在线日韩网站| 欧美一区1区三区3区公司| 亚洲三级网址| 欧美亚洲一级二级| 精品视频日韩| 亚洲成人一区二区三区| 欧美一区二区麻豆红桃视频| 日韩欧美亚洲区| av在线不卡顿| 一级二级三级欧美| 99热这里只有精品在线| 国产一区二区三区在线观看免费| 亚洲 激情 在线| 久久激五月天综合精品| 97超碰人人爽| 国产在线精品一区二区三区不卡| 黄色片免费网址| 国产高清成人在线| 欧美夫妇交换xxx| 91麻豆视频网站| 微拍福利一区二区| 国产精品久久久久久亚洲伦| 波兰性xxxxx极品hd| 亚洲欧美另类久久久精品| 久青草免费视频| 福利微拍一区二区| 日韩欧美国产另类| 欧美精品成人一区二区三区四区| www.xxxx国产| 亚洲娇小xxxx欧美娇小| 成人影院免费观看| 久久的精品视频| 色老头在线一区二区三区| 国产精品黄色av| 亚洲日本va中文字幕| 麻豆成人av| 欧美激情成人| 青草视频在线观看视频| 久久中文在线| 国产人妻精品久久久久野外| k8久久久一区二区三区| 9.1片黄在线观看| 亚洲一区在线视频| 成年人晚上看的视频| 欧美一区二区三区四区高清 | 亚洲欧美日韩精品久久久 | 久久久久国产成人精品亚洲午夜| 少妇av片在线观看| 亚洲综合偷拍欧美一区色| 99精品视频99| 555www色欧美视频| 四虎国产精品永远| 久久精品久久久久| 电影一区二区三区| 成人3d动漫一区二区三区91| 免费av一区二区三区四区| 日韩视频在线免费播放| 亚洲一区自拍| 天天久久综合网| 久久久夜色精品亚洲| 九九精品在线观看视频| 在线欧美日韩国产| 五月天婷婷在线观看| 久久躁狠狠躁夜夜爽| 激情都市亚洲| 国产精品国产三级国产专区53| 日韩欧美一区二区三区在线视频| 国产 日韩 亚洲 欧美| 国产在线精品一区二区夜色| 一色道久久88加勒比一| 亚洲不卡av一区二区三区| 91麻豆一区二区| 亚洲视频第一页| 黑森林国产精品av| 99久久国产免费免费| 人人狠狠综合久久亚洲婷| www.com毛片| 国产精品自拍三区| 美国黄色片视频| 在线看国产一区二区| 性感美女一级片| 国内精品久久久久久| 亚洲国产aⅴ精品一区二区| 一区二区三区我不卡| 青娱乐精品在线视频| 自拍偷拍中文字幕| 精品久久久久久久久久国产| 亚洲h视频在线观看| 麻豆成人在线看| 精品国产18久久久久久二百| 亚洲精品9999| 免费高清在线视频一区·| 女女互磨互喷水高潮les呻吟| 精品欧美国产一区二区三区| 蜜臀久久99精品久久久| 欧美国产欧美亚洲国产日韩mv天天看完整 | 一区二区三区四区在线看| 国模无码视频一区二区三区| 成人av在线播放网站| 国产精品23p| 精品国产成人系列| 懂色av一区| 国产一区二区精品免费| aa级大片欧美三级| 久久午夜夜伦鲁鲁片| 欧美视频精品一区| 你懂的在线看| 国产极品精品在线观看| 国产欧美日韩在线观看视频| jizz欧美激情18| 中国色在线观看另类| 中文字字幕在线观看| 久久视频免费观看| 日日夜夜精品视频| 久草视频国产在线| av不卡在线观看| 国产农村妇女aaaaa视频| 亚洲天堂av网| 亚洲国产天堂| 日本中文字幕一级片| 成人99免费视频| 亚洲综合图片网| 中文字幕视频在线免费欧美日韩综合在线看| av有声小说一区二区三区| 亚洲美女搞黄| 国产成a人无v码亚洲福利| 亚洲国产精品午夜在线观看| 精品爽片免费看久久| 成人亚洲免费| 妺妺窝人体色www看人体| 99久久99久久久精品齐齐| 潘金莲一级淫片aaaaaa播放| 自拍偷拍免费精品| 日韩av综合| 国产精品视频一区二区三区四区五区| 26uuu国产日韩综合| 正在播放木下凛凛xv99| 欧美激情18p| 亚洲女娇小黑人粗硬| 成年人三级黄色片| 亚洲国产精品人人做人人爽| 免费在线视频一级不卡| 91精品视频在线看| 亚洲综合99| 国产一区二区播放| 国产丝袜精品视频| 国产成人久久精品一区二区三区| www插插插无码视频网站| 国产女主播一区| 日本黄色三级视频| 国产精品视频一区二区三区四| 在线播放亚洲| 日本少妇aaa| 亚洲欧美日本精品| 国产精品视频一区视频二区| 看av免费毛片手机播放 | 日本少妇性高潮|