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

Java 從零實(shí)現(xiàn)屬于你的 Redis 分布式鎖

開發(fā) 前端 新聞 分布式 Redis
我們想要解決分布式系統(tǒng)中的并發(fā)問(wèn)題,就需要引入分布式鎖的概念。

[[347022]]

 

 java 從零實(shí)現(xiàn)屬于你的 redis 分布式鎖

redis分布式鎖

為什么需要分布式鎖

在 jdk 中為我們提供了加鎖的方式:

(1)synchronized 關(guān)鍵字

(2)volatile + CAS 實(shí)現(xiàn)的樂(lè)觀鎖

(3)ReadWriteLock 讀寫鎖

(4)ReenTrantLock 可重入鎖

等等,這些鎖為我們變成提供極大的便利性,保證在多線程的情況下,保證線程安全。

但是在分布式系統(tǒng)中,上面的鎖就統(tǒng)統(tǒng)沒(méi)用了。

我們想要解決分布式系統(tǒng)中的并發(fā)問(wèn)題,就需要引入分布式鎖的概念。

java 代碼實(shí)現(xiàn)

創(chuàng)作動(dòng)機(jī)

首先是對(duì)鎖實(shí)現(xiàn)原理的一個(gè)實(shí)現(xiàn),理論指導(dǎo)實(shí)踐,實(shí)踐完善理論。

晚上關(guān)于 redis 分布式鎖的文章一大堆,但是也都稂莠不齊。

redis 分布式鎖工具有時(shí)候中間件團(tuán)隊(duì)不見(jiàn)得會(huì)提供,提供了也不見(jiàn)得經(jīng)常維護(hù),不如自己實(shí)現(xiàn)一個(gè),知道原理,也方便修改。

接口定義

為了便于和 JDK 復(fù)用,我們讓接口繼承自 jdk 的 Lock 接口。

  1. package com.github.houbb.lock.api.core; 
  2.  
  3. import java.util.concurrent.TimeUnit; 
  4. import java.util.concurrent.locks.Lock; 
  5.  
  6. /** 
  7.  * 鎖定義 
  8.  * @author binbin.hou 
  9.  * @since 0.0.1 
  10.  */ 
  11. public interface ILock extends Lock { 
  12.  
  13.     /** 
  14.      * 嘗試加鎖 
  15.      * @param time 時(shí)間 
  16.      * @param unit 當(dāng)為 
  17.      * @param key key 
  18.      * @return 返回 
  19.      * @throws InterruptedException 異常 
  20.      * @since 0.0.1 
  21.      */ 
  22.     boolean tryLock(long time, TimeUnit unit, 
  23.                     String key) throws InterruptedException; 
  24.  
  25.     /** 
  26.      * 嘗試加鎖 
  27.      * @param key key 
  28.      * @return 返回 
  29.      * @since 0.0.1 
  30.      */ 
  31.     boolean tryLock(String key); 
  32.  
  33.     /** 
  34.      * 解鎖 
  35.      * @param key key 
  36.      * @since 0.0.1 
  37.      */ 
  38.     void unlock(String key); 
  39.  

方法我們只添加了三個(gè)比較常用的核心方法,作為第一個(gè)版本,簡(jiǎn)單點(diǎn)。

后續(xù)陸續(xù)添加即可。

抽象實(shí)現(xiàn)

為了便于后期添加更多的所實(shí)現(xiàn),這里首先實(shí)現(xiàn)了一個(gè)公用的抽象父類。

  1. package com.github.houbb.lock.redis.core; 
  2.  
  3. import com.github.houbb.lock.api.core.ILock; 
  4. import com.github.houbb.lock.redis.constant.LockRedisConst; 
  5. import com.github.houbb.wait.api.IWait; 
  6.  
  7. import java.util.concurrent.TimeUnit; 
  8. import java.util.concurrent.locks.Condition; 
  9.  
  10. /** 
  11.  * 抽象實(shí)現(xiàn) 
  12.  * @author binbin.hou 
  13.  * @since 0.0.1 
  14.  */ 
  15. public abstract class AbstractLockRedis implements ILock { 
  16.  
  17.     /** 
  18.      * 鎖等待 
  19.      * @since 0.0.1 
  20.      */ 
  21.     private final IWait wait; 
  22.  
  23.     protected AbstractLockRedis(IWait wait) { 
  24.         this.wait = wait; 
  25.     } 
  26.  
  27.     @Override 
  28.     public void lock() { 
  29.         throw new UnsupportedOperationException(); 
  30.     } 
  31.  
  32.     @Override 
  33.     public void lockInterruptibly() throws InterruptedException { 
  34.         throw new UnsupportedOperationException(); 
  35.     } 
  36.  
  37.     @Override 
  38.     public boolean tryLock() { 
  39.         return tryLock(LockRedisConst.DEFAULT_KEY); 
  40.     } 
  41.  
  42.     @Override 
  43.     public void unlock() { 
  44.         unlock(LockRedisConst.DEFAULT_KEY); 
  45.     } 
  46.  
  47.     @Override 
  48.     public boolean tryLock(long time, TimeUnit unit, String key) throws InterruptedException { 
  49.         long startTimeMills = System.currentTimeMillis(); 
  50.  
  51.         // 一次獲取,直接成功 
  52.         boolean result = this.tryLock(key); 
  53.         if(result) { 
  54.             return true
  55.         } 
  56.  
  57.         // 時(shí)間判斷 
  58.         if(time <= 0) { 
  59.             return false
  60.         } 
  61.         long durationMills = unit.toMillis(time); 
  62.         long endMills = startTimeMills + durationMills; 
  63.  
  64.         // 循環(huán)等待 
  65.         while (System.currentTimeMillis() < endMills) { 
  66.             result = tryLock(key); 
  67.             if(result) { 
  68.                 return true
  69.             } 
  70.  
  71.             // 等待 10ms 
  72.             wait.wait(TimeUnit.MILLISECONDS, 10); 
  73.         } 
  74.         return false
  75.     } 
  76.  
  77.     @Override 
  78.     public synchronized boolean tryLock(long time, TimeUnit unit) throws InterruptedException { 
  79.         return tryLock(time, unit, LockRedisConst.DEFAULT_KEY); 
  80.     } 
  81.  
  82.     @Override 
  83.     public Condition newCondition() { 
  84.         throw new UnsupportedOperationException(); 
  85.     } 
  86.  

最核心的實(shí)際上是 public boolean tryLock(long time, TimeUnit unit, String key) throws InterruptedException 方法。

這個(gè)方法會(huì)調(diào)用 this.tryLock(key) 獲取鎖,如果成功,直接返回;如果不成功,則循環(huán)等待。

這里設(shè)置了超時(shí)時(shí)間,如果超時(shí),則直接返回 true。

redis 鎖實(shí)現(xiàn)

我們實(shí)現(xiàn)的 redis 分布鎖,繼承自上面的抽象類。

  1. package com.github.houbb.lock.redis.core; 
  2.  
  3. import com.github.houbb.heaven.util.lang.StringUtil; 
  4. import com.github.houbb.id.api.Id; 
  5. import com.github.houbb.id.core.util.IdThreadLocalHelper; 
  6. import com.github.houbb.lock.redis.constant.LockRedisConst; 
  7. import com.github.houbb.lock.redis.exception.LockRedisException; 
  8. import com.github.houbb.lock.redis.support.operator.IOperator; 
  9. import com.github.houbb.wait.api.IWait; 
  10.  
  11. /** 
  12.  * 這里是基于 redis 實(shí)現(xiàn) 
  13.  * 
  14.  * 實(shí)際上也可以基于 zk/數(shù)據(jù)庫(kù)等實(shí)現(xiàn)。 
  15.  * 
  16.  * @author binbin.hou 
  17.  * @since 0.0.1 
  18.  */ 
  19. public class LockRedis extends AbstractLockRedis { 
  20.  
  21.     /** 
  22.      * redis 操作實(shí)現(xiàn) 
  23.      * @since 0.0.1 
  24.      */ 
  25.     private final IOperator redisOperator; 
  26.  
  27.     /** 
  28.      * 主鍵標(biāo)識(shí) 
  29.      * @since 0.0.1 
  30.      */ 
  31.     private final Id id; 
  32.  
  33.     public LockRedis(IWait wait, IOperator redisOperator, Id id) { 
  34.         super(wait); 
  35.         this.redisOperator = redisOperator; 
  36.         this.id = id; 
  37.     } 
  38.  
  39.     @Override 
  40.     public boolean tryLock(String key) { 
  41.         final String requestId = id.id(); 
  42.         IdThreadLocalHelper.put(requestId); 
  43.  
  44.         return redisOperator.lock(key, requestId, LockRedisConst.DEFAULT_EXPIRE_MILLS); 
  45.     } 
  46.  
  47.     @Override 
  48.     public void unlock(String key) { 
  49.         final String requestId = IdThreadLocalHelper.get(); 
  50.         if(StringUtil.isEmpty(requestId)) { 
  51.             String threadName = Thread.currentThread().getName(); 
  52.             throw new LockRedisException("Thread " + threadName +" not contains requestId"); 
  53.         } 
  54.  
  55.         boolean unlock = redisOperator.unlock(key, requestId); 
  56.         if(!unlock) { 
  57.             throw new LockRedisException("Unlock key " + key + " result is failed!"); 
  58.         } 
  59.     } 

這里就是 redis 鎖的核心實(shí)現(xiàn)了,如果不太理解,建議回顧一下原理篇:

redis 分布式鎖原理詳解

加鎖

加鎖部分,這里會(huì)生成一個(gè) id 標(biāo)識(shí),用于區(qū)分當(dāng)前操作者。

為了安全也設(shè)置了默認(rèn)的超時(shí)時(shí)間。

當(dāng)然這里是為了簡(jiǎn)化調(diào)用者的使用成本,開發(fā)在使用的時(shí)候只需要關(guān)心自己要加鎖的 key 即可。

當(dāng)然,甚至連加鎖的 key 都可以進(jìn)一步抽象掉,比如封裝 @DistributedLock 放在方法上,即可實(shí)現(xiàn)分布式鎖。這個(gè)后續(xù)有時(shí)間可以拓展,原理也不難。

解鎖

解鎖的時(shí)候,就會(huì)獲取當(dāng)前進(jìn)程的持有標(biāo)識(shí)。

憑借當(dāng)前線程持有的 id 標(biāo)識(shí),去解鎖。

IOperator

我們對(duì) redis 的操作進(jìn)行了抽象,為什么抽象呢?

因?yàn)?redis 服務(wù)種類實(shí)際很多,可以是 redis 單點(diǎn),集群,主從,哨兵。

連接的客戶端也可以很多,jedis,spring redisTemplate, codis, redisson 等等。

這里為了后期拓展方便,就對(duì)操作進(jìn)行了抽象。

接口

定義接口如下:

  1. package com.github.houbb.lock.redis.support.operator; 
  2.  
  3. /** 
  4.  * Redis 客戶端 
  5.  * @author binbin.hou 
  6.  * @since 0.0.1 
  7.  */ 
  8. public interface IOperator { 
  9.  
  10.     /** 
  11.      * 嘗試獲取分布式鎖 
  12.      * 
  13.      * @param lockKey    鎖 
  14.      * @param requestId  請(qǐng)求標(biāo)識(shí) 
  15.      * @param expireTimeMills 超期時(shí)間 
  16.      * @return 是否獲取成功 
  17.      * @since 0.0.1 
  18.      */ 
  19.     boolean lock(String lockKey, String requestId, int expireTimeMills); 
  20.  
  21.     /** 
  22.      * 解鎖 
  23.      * @param lockKey 鎖 key 
  24.      * @param requestId 請(qǐng)求標(biāo)識(shí) 
  25.      * @return 結(jié)果 
  26.      * @since 0.0.1 
  27.      */ 
  28.     boolean unlock(String lockKey, String requestId); 
  29.  

jedis 實(shí)現(xiàn)

我們實(shí)現(xiàn)一個(gè) jedis 單點(diǎn)版本的:

  1. package com.github.houbb.lock.redis.support.operator.impl; 
  2.  
  3. import com.github.houbb.lock.redis.constant.LockRedisConst; 
  4. import com.github.houbb.lock.redis.support.operator.IOperator; 
  5. import redis.clients.jedis.Jedis; 
  6.  
  7. import java.util.Collections; 
  8.  
  9. /** 
  10.  * Redis 客戶端 
  11.  * @author binbin.hou 
  12.  * @since 0.0.1 
  13.  */ 
  14. public class JedisOperator implements IOperator { 
  15.  
  16.     /** 
  17.      * jedis 客戶端 
  18.      * @since 0.0.1 
  19.      */ 
  20.     private final Jedis jedis; 
  21.  
  22.     public JedisOperator(Jedis jedis) { 
  23.         this.jedis = jedis; 
  24.     } 
  25.  
  26.     /** 
  27.      * 嘗試獲取分布式鎖 
  28.      * 
  29.      * expireTimeMills 保證當(dāng)前進(jìn)程掛掉,也能釋放鎖 
  30.      * 
  31.      * requestId 保證解鎖的是當(dāng)前進(jìn)程(鎖的持有者) 
  32.      * 
  33.      * @param lockKey         鎖 
  34.      * @param requestId       請(qǐng)求標(biāo)識(shí) 
  35.      * @param expireTimeMills 超期時(shí)間 
  36.      * @return 是否獲取成功 
  37.      * @since 0.0.1 
  38.      */ 
  39.     @Override 
  40.     public boolean lock(String lockKey, String requestId, int expireTimeMills) { 
  41.         String result = jedis.set(lockKey, requestId, LockRedisConst.SET_IF_NOT_EXIST, LockRedisConst.SET_WITH_EXPIRE_TIME, expireTimeMills); 
  42.         return LockRedisConst.LOCK_SUCCESS.equals(result); 
  43.     } 
  44.  
  45.     /** 
  46.      * 解鎖 
  47.      * 
  48.      * (1)使用 requestId,保證為當(dāng)前鎖的持有者 
  49.      * (2)使用 lua 腳本,保證執(zhí)行的原子性。 
  50.      * 
  51.      * @param lockKey   鎖 key 
  52.      * @param requestId 請(qǐng)求標(biāo)識(shí) 
  53.      * @return 結(jié)果 
  54.      * @since 0.0.1 
  55.      */ 
  56.     @Override 
  57.     public boolean unlock(String lockKey, String requestId) { 
  58.         String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"
  59.         Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId)); 
  60.         return LockRedisConst.RELEASE_SUCCESS.equals(result); 
  61.     } 
  62.  

這里時(shí)最核心的部分。

別看簡(jiǎn)單幾行代碼,需要注意的點(diǎn)還是很多的。

加鎖

加鎖時(shí)附帶 requestId,用來(lái)標(biāo)識(shí)自己為鎖的持有者。

SETNX 當(dāng) key 不存在時(shí)才進(jìn)行加鎖。

設(shè)置加鎖的過(guò)期時(shí)間,避免因異常等原因未釋放鎖,導(dǎo)致鎖的長(zhǎng)時(shí)間占用。

解鎖

使用 lua 腳本,保證操作的原子性。

為了證明為鎖的持有者,傳入 requestId。

測(cè)試驗(yàn)證

maven 引入

  1. <dependency> 
  2.     <groupId>com.github.houbb</groupId> 
  3.     <artifactId>lock-core</artifactId> 
  4.     <version>0.0.1</version> 
  5. </dependency> 

測(cè)試代碼

  1. Jedis jedis = new Jedis("127.0.0.1"6379); 
  2. IOperator operator = new JedisOperator(jedis); 
  3.  
  4. // 獲取鎖 
  5. ILock lock = LockRedisBs.newInstance().operator(operator).lock(); 
  6.  
  7. try { 
  8.     boolean lockResult = lock.tryLock(); 
  9.     System.out.println(lockResult); 
  10.     // 業(yè)務(wù)處理 
  11. catch (Exception e) { 
  12.     e.printStackTrace(); 
  13. finally { 
  14.     lock.unlock(); 

小結(jié)

到這里,一個(gè)簡(jiǎn)單版本的 redis 分布式鎖就實(shí)現(xiàn)完成了。

當(dāng)然還有很多可以改進(jìn)的地方:

(1)比如引入遞增的 sequence,避免分布式鎖中的 GC 導(dǎo)致的問(wèn)題

(2)對(duì)于更多 redis 服務(wù)端+客戶端的支持

(3)對(duì)于注解式 redis 分布式鎖的支持

責(zé)任編輯:張燕妮 來(lái)源: 今日頭條
相關(guān)推薦

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數(shù)據(jù)分布式鎖

2019-06-19 15:40:06

分布式鎖RedisJava

2021-11-26 06:43:19

Java分布式

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2023-03-01 08:07:51

2024-04-01 05:10:00

Redis數(shù)據(jù)庫(kù)分布式鎖

2024-10-07 10:07:31

2023-10-11 09:37:54

Redis分布式系統(tǒng)

2024-11-28 15:11:28

2022-05-18 10:38:51

Redis分布式鎖數(shù)據(jù)

2019-12-25 14:35:33

分布式架構(gòu)系統(tǒng)

2020-07-30 09:35:09

Redis分布式鎖數(shù)據(jù)庫(kù)

2020-07-15 16:50:57

Spring BootRedisJava

2023-01-13 07:39:07

2021-10-09 11:34:59

MySQL分布式鎖庫(kù)存

2022-06-16 08:01:24

redis分布式鎖

2022-03-04 09:54:04

Redis分布式鎖腳本

2021-02-28 07:49:28

Zookeeper分布式

2017-01-16 14:13:37

分布式數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

56国语精品自产拍在线观看| 四虎影视精品| 亚洲欧洲成人av每日更新| 91久久国产精品| 精品成人免费视频| 欧美呦呦网站| 亚洲成色999久久网站| 无码无遮挡又大又爽又黄的视频| 欧美极品视频| 久久综合久久99| 亚洲在线一区二区| 色老头一区二区| 欧美日韩亚洲一区在线观看| 在线观看免费高清视频97| 亚洲乱妇老熟女爽到高潮的片| av在线一区不卡| 亚洲国产精品综合小说图片区| 日韩亚洲视频| 天天干天天草天天射| 九九精品视频在线看| 日本久久久久亚洲中字幕| 久草综合在线视频| 精品国产aⅴ| 日韩精品福利在线| 18禁一区二区三区| 国产精品视频一区二区三区| 91久久人澡人人添人人爽欧美| www.av毛片| 1024在线播放| 亚洲天堂中文字幕| 亚洲精品在线免费| 好男人免费精品视频| 91在线观看一区二区| 99热在线播放| 99久久国产热无码精品免费| 麻豆高清免费国产一区| 国产成人拍精品视频午夜网站| 国产一区二区三区影院| 激情久久五月| 久久久久久成人精品| 欧美日韩成人免费观看| 亚洲精品小说| 欧美视频二区| 色综合久久综合网| 国产综合av在线| sis001亚洲原创区| 午夜精品123| 免费观看美女裸体网站| 俺来也官网欧美久久精品| 亚洲一区二区三区视频在线| www.夜夜爱| 日本在线观看大片免费视频| 亚洲免费观看高清| 免费的一级黄色片| 丁香花视频在线观看| 亚洲香蕉伊在人在线观| 欧美精品久久久久久久免费| www在线观看黄色| 精品女厕一区二区三区| 国产男女激情视频| 国精品产品一区| 91精品国产高清一区二区三区蜜臀| www.色.com| 福利片一区二区| 亚洲乱码国产乱码精品精| 欧美日韩高清丝袜| 日韩精品免费一区二区在线观看 | 加勒比av中文字幕| 国产一区二区av在线| 欧美mv日韩mv国产网站app| 男人的天堂影院| 精品一区免费| 色偷偷噜噜噜亚洲男人的天堂| 欧美日韩午夜视频| 极品尤物久久久av免费看| 91sao在线观看国产| 午夜一级黄色片| a v视频在线观看| 午夜精品电影| 性欧美xxxx交| 性高潮视频在线观看| 精品在线一区二区三区| 999视频在线观看| 亚洲人妻一区二区| 国产精品乱码一区二区三区软件 | 麻豆精品久久精品色综合| 亚洲精品免费一区二区三区| 天天干天天舔天天射| 国产精品免费久久久久| 国内精品视频一区二区三区| www.成人在线视频| 欧美成人三级在线| 蜜桃传媒一区二区亚洲| 综合激情婷婷| 国产成人鲁鲁免费视频a| 99久久夜色精品国产亚洲| 91小视频在线| 国产精品av免费观看| 欧美片第一页| 精品成人在线观看| 国产精品1区2区3区4区| 亚洲少妇自拍| 91综合免费在线| 可以在线观看的黄色| 亚洲欧美日韩精品久久久久| 久草青青在线观看| silk一区二区三区精品视频| 色婷婷综合久久久久中文字幕1| 成年人免费看毛片| 国产乱对白刺激视频不卡| 日本一区免费在线观看| 高清在线视频不卡| 欧美一区二区三区的| 卡一卡二卡三在线观看| 亚洲欧洲日本mm| 亚洲aⅴ男人的天堂在线观看| 国产污视频在线| 亚洲成人午夜影院| 先锋资源在线视频| 欧美韩国日本在线观看| 国产成人一区二区三区小说| 凸凹人妻人人澡人人添| 一区二区三区精品视频| xxxx在线免费观看| 日韩欧美一区二区三区在线视频| 日韩美女激情视频| 丝袜视频国产在线播放| 亚洲成人av资源| 国产av一区二区三区传媒| 国产精品麻豆久久| 国产精品视频26uuu| 黄色av网站在线免费观看| 欧美性xxxx| 国产激情视频网站| av成人天堂| 国产日韩亚洲精品| av在线不卡免费| 精品国产免费人成在线观看| 久久久久久久福利| 国产精品乡下勾搭老头1| 日本特级黄色大片| 亚洲人成网站在线在线观看| 久久天天躁夜夜躁狠狠躁2022| 亚洲视频在线免费播放| 国产精品久久久久久妇女6080| www.99在线| 成人网18免费网站| 国产在线高清精品| 超碰在线caoporen| 日韩精品中文字幕在线一区| 精品无码久久久久久久久| 国产成人精品免费在线| 隔壁人妻偷人bd中字| 精品国产一区二区三区成人影院 | 最新av在线免费观看| 999精品嫩草久久久久久99| 日韩欧美国产系列| 欧美精品欧美精品| 老司机成人影院| 亚洲男人天堂2023| 亚洲影院在线播放| 国产日韩欧美一区二区三区综合| 91蝌蚪视频在线观看| 成人精品视频| 亚洲free性xxxx护士白浆| 久草在线视频资源| 26uuu亚洲电影在线观看| 午夜精品123| 国产免费看av| 麻豆精品新av中文字幕| 午夜探花在线观看| 红杏一区二区三区| 国产精品jizz在线观看麻豆| 女女色综合影院| 日韩免费视频一区二区| 成人午夜视频在线播放| 国产精品拍天天在线| 国产精品久久久久野外| 国产欧美丝祙| 亚洲亚洲精品三区日韩精品在线视频 | 精品成人18| 91国产一区在线| аⅴ资源新版在线天堂| 日韩视频一区二区| 国产精品视频123| 中文字幕中文字幕中文字幕亚洲无线| 国产chinesehd精品露脸| 久久xxxx精品视频| 黄色网络在线观看| 米奇777超碰欧美日韩亚洲| 国产免费久久av| 超清av在线| 中文在线不卡视频| 你懂的网站在线| 欧美三级日韩三级国产三级| 久久精品欧美一区二区| 国产日产欧美一区二区视频| 国产人妖在线观看| 热久久久久久久| 国产伦精品一区二区三区四区视频_| 国产一区二区区别| www 成人av com| 成人全视频免费观看在线看| 97视频免费观看| fc2ppv国产精品久久| 亚洲午夜精品视频| 色综合久久久久久| 欧美一区二区三区四区久久| 国产91精品一区| 亚洲午夜免费电影| 中文字幕美女视频| 国产欧美综合在线观看第十页 | 国产女人aaa级久久久级| 成年人看片网站| 免费视频一区二区| 久久网站免费视频| 日韩亚洲精品在线| 激情五月婷婷六月| 亚洲色图国产| 宅男av一区二区三区| 国产成人精品三级高清久久91| 国产精品视频500部| 国产一区二区久久久久| 成人a在线视频| 成人国产综合| 国产精品精品国产| 电影亚洲精品噜噜在线观看| 97超碰蝌蚪网人人做人人爽| 波多野在线观看| 欧美日产国产成人免费图片| 米奇777四色精品人人爽| 一色桃子一区二区| 搞黄视频在线观看| 国产一区二区成人| 欧美美女搞黄| 亚洲片国产一区一级在线观看| 天堂在线中文资源| 亚洲精品久久久久| 色窝窝无码一区二区三区| 精品国产乱码91久久久久久网站| www.色亚洲| 日韩欧美精品在线| 亚洲国产精品欧美久久| 欧美tk丨vk视频| 成人毛片视频免费看| 精品精品国产高清a毛片牛牛| 精品人妻伦一二三区久久| 日韩欧美一区二区视频| 亚洲精品久久久久久动漫器材一区| 日韩欧美电影一二三| 高潮一区二区三区乱码| 亚洲精品v欧美精品v日韩精品| 五十路在线视频| 精品中文字幕久久久久久| 久草在线青青草| 中文字幕少妇一区二区三区| 免费观看久久久久| 欧美成人免费在线视频| av在线最新| 国产91精品网站| 欧美天堂一区| 99久热re在线精品视频| 神马午夜久久| 亚洲国产欧洲综合997久久| 日韩一区自拍| 18视频在线观看娇喘| 一区在线播放| av动漫免费看| 国产一区不卡精品| 国产熟女高潮一区二区三区| 国产欧美日韩中文久久| 久久久久久久久久97| 亚洲高清免费视频| 天天干,天天干| 91精品在线一区二区| 日韩中文字幕综合| 国产亚洲精品久久久久久牛牛| 国产传媒在线播放| 2019中文在线观看| 国产一区二区高清在线| 美女视频久久| 一级欧洲+日本+国产| 国产青青在线视频| 久久国产人妖系列| 亚洲视频在线播放免费| 国产精品麻豆久久久| 国产午夜精品一区二区理论影院 | 久久精品一二三四| 91视频国产资源| 内射一区二区三区| 欧美日韩亚洲一区二| 国产免费av电影| 亚洲人成网7777777国产| 丝袜在线视频| 国产精品永久免费视频| 欧美大片网址| www.黄色网址.com| 老司机精品视频网站| 一级黄色大片免费看| 国产精品欧美久久久久无广告| 麻豆一区二区三区精品视频| 欧美日韩国产片| 四虎精品成人影院观看地址| 欧美高清videos高潮hd| 国产91精品在线| 久久国产一区二区| 极品日韩av| 少妇愉情理伦片bd| 国产精品日韩精品欧美在线| 天天爽夜夜爽夜夜爽精品| 日韩一区二区免费高清| 91大神xh98hx在线播放| 57pao精品| 巨人精品**| 日韩黄色片在线| 国产中文字幕一区| 免费成人深夜蜜桃视频| 色婷婷av一区二区三区之一色屋| 粉嫩小泬无遮挡久久久久久| 另类美女黄大片| 日韩福利影视| 天天久久人人| 日日夜夜免费精品| 中文字幕国产综合| 懂色av影视一区二区三区| 后入内射欧美99二区视频| 欧美理论电影在线播放| 国产精品亚洲四区在线观看| 夜夜爽www精品| 奇米影视一区二区三区小说| 国产美女永久免费无遮挡| 色视频欧美一区二区三区| 三级无遮挡在线观看| 欧美一级淫片videoshd| 欧美亚洲大陆| 国产午夜福利视频在线观看| 91在线观看下载| 亚洲欧美自拍视频| 亚洲欧美国产va在线影院| 激情都市亚洲| 日本一区免费看| 日本美女一区二区| 青青青视频在线免费观看| 欧美日韩国产色站一区二区三区| 免费在线视频欧美| 91嫩草在线视频| 中文字幕免费精品| 第一页在线视频| 五月天久久比比资源色| 神马久久久久| 国产精品久久久久久久av大片| 欧美综合一区| 亚洲欧美手机在线| 一区二区三区资源| 殴美一级特黄aaaaaa| 欧洲s码亚洲m码精品一区| 国产亚洲一卡2卡3卡4卡新区 | 一级久久久久久久| 久久九九精品99国产精品| 奇米一区二区| 黄色大片在线免费看| 久久免费美女视频| 在线观看中文字幕av| 欧美精品在线免费| 免费福利视频一区| 在线看的黄色网址| 一区2区3区在线看| 香蕉久久国产av一区二区| 国产精品国产三级国产专播精品人 | 一区二区三区欧美日韩| 四虎免费在线观看| 国产精品久久77777| 亚洲综合激情在线| 亚洲 欧美 日韩在线| 欧美图区在线视频| 日本大胆在线观看| 日韩高清三级| 国产成人精品影视| 加勒比在线一区| 欧美精品在线免费播放| 女优一区二区三区| 91人妻一区二区三区| 一本久久综合亚洲鲁鲁五月天 | 国内精品嫩模av私拍在线观看| 中文字幕影片免费在线观看| 欧美日韩精品欧美日韩精品| segui88久久综合| 亚洲国产精品www| 成人精品电影在线观看| 中文字幕免费观看视频| 国内精品久久久| 91麻豆精品国产91久久久平台| 天天躁日日躁狠狠躁av| 欧美日韩视频第一区| 国产伦子伦对白在线播放观看| 在线天堂一区av电影| 久久亚洲综合色| 亚洲精品97久久中文字幕无码| 国产精品久久久久9999| 亚洲精品孕妇|