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

什么鬼,面試官竟然讓我用Redis實現(xiàn)一個消息隊列?。。?/h1>

存儲 存儲軟件 Redis
眾所周知,redis是一個高性能的分布式key-value存儲系統(tǒng),在NoSQL數(shù)據(jù)庫市場上,redis自己就占據(jù)了將近半壁江山,足以見到其強大之處。同時,由于redis的單線程特性,我們可以將其用作為一個消息隊列。

[[284302]]

眾所周知,redis是一個高性能的分布式key-value存儲系統(tǒng),在NoSQL數(shù)據(jù)庫市場上,redis自己就占據(jù)了將近半壁江山,足以見到其強大之處。同時,由于redis的單線程特性,我們可以將其用作為一個消息隊列。本篇文章就來講講如何將redis整合到spring boot中,并用作消息隊列的……

一、什么是消息隊列

“消息隊列”是在消息的傳輸過程中保存消息的容器。——《百度百科》

消息我們可以理解為在計算機中或在整個計算機網(wǎng)絡(luò)中傳遞的數(shù)據(jù)。

隊列是我們在學習數(shù)據(jù)結(jié)構(gòu)的時候?qū)W習的基本數(shù)據(jù)結(jié)構(gòu)之一,它具有先進先出的特性。

所以,消息隊列就是一個保存消息的容器,它具有先進先出的特性。

為什么會出現(xiàn)消息隊列?

  1. 異步:常見的B/S架構(gòu)下,客戶端向服務(wù)器發(fā)送請求,但是服務(wù)器處理這個消息需要花費的時間很長的時間,如果客戶端一直等待服務(wù)器處理完消息,會造成客戶端的系統(tǒng)資源浪費;而使用消息隊列后,服務(wù)器直接將消息推送到消息隊列中,由專門的處理消息程序處理消息,這樣客戶端就不必花費大量時間等待服務(wù)器的響應(yīng)了;
  2. 解耦:傳統(tǒng)的軟件開發(fā)模式,模塊之間的調(diào)用是直接調(diào)用,這樣的系統(tǒng)很不利于系統(tǒng)的擴展,同時,模塊之間的相互調(diào)用,數(shù)據(jù)之間的共享問題也很大,每個模塊都要時時刻刻考慮其他模塊會不會掛了;使用消息隊列以后,模塊之間不直接調(diào)用,而是通過數(shù)據(jù),且當某個模塊掛了以后,數(shù)據(jù)仍舊會保存在消息隊列中。最典型的就是生產(chǎn)者-消費者模式,本案例使用的就是該模式;
  3. 削峰填谷:某一時刻,系統(tǒng)的并發(fā)請求暴增,遠遠超過了系統(tǒng)的最大處理能力后,如果不做任何處理,系統(tǒng)會崩潰;使用消息隊列以后,服務(wù)器把請求推送到消息隊列中,由專門的處理消息程序以合理的速度消費消息,降低服務(wù)器的壓力。

下面一張圖我們來簡單了解一下消息隊列

 

由上圖可以看到,消息隊列充當了一個中間人的角色,我們可以通過操作這個消息隊列來保證我們的系統(tǒng)穩(wěn)定。

二、環(huán)境準備

Java環(huán)境:jdk1.8

spring boot版本:2.2.1.RELEASE

redis-server版本:3.2.100

三、相關(guān)依賴

這里只展示與redis相關(guān)的依賴,

  1. <dependency> 
  2.  
  3.     <groupId>org.springframework.boot</groupId> 
  4.  
  5.     <artifactId>spring-boot-starter-data-redis</artifactId> 
  6.  
  7. </dependency> 
  8.  
  9. <dependency> 
  10.  
  11.     <groupId>org.springframework.integration</groupId> 
  12.  
  13.     <artifactId>spring-integration-redis</artifactId> 
  14.  
  15. </dependency> 

這里解釋一下這兩個依賴:

  • 第一個依賴是對redis NoSQL的支持
  • 第二個依賴是spring integration與redis的結(jié)合,這里添加這個代碼主要是為了實現(xiàn)分布式鎖

四、配置文件

這里只展示與redis相關(guān)的配置

  1. # redis所在的的地址 
  2.  
  3. spring.redis.host=localhost 
  4.  
  5. # redis數(shù)據(jù)庫索引,從0開始,可以從redis的可視化客戶端查看 
  6.  
  7. spring.redis.database=1 
  8.  
  9. # redis的端口,默認為6379 
  10.  
  11. spring.redis.port=6379 
  12.  
  13. # redis的密碼 
  14.  
  15. spring.redis.password
  16.  
  17. # 連接redis的超時時間(ms),默認是2000 
  18.  
  19. spring.redis.timeout=5000 
  20.  
  21. # 連接池最大連接數(shù) 
  22.  
  23. spring.redis.jedis.pool.max-active=16 
  24.  
  25. # 連接池最小空閑連接 
  26.  
  27. spring.redis.jedis.pool.min-idle=0 
  28.  
  29. # 連接池最大空閑連接 
  30.  
  31. spring.redis.jedis.pool.max-idle=16 
  32.  
  33. # 連接池最大阻塞等待時間(負數(shù)表示沒有限制) 
  34.  
  35. spring.redis.jedis.pool.max-wait=-1 
  36.  
  37. # 連接redis的客戶端名 
  38.  
  39. spring.redis.client-name=mall 

五、代碼配置

redis用作消息隊列,其在spring boot中的主要表現(xiàn)為一RedisTemplate.convertAndSend()方法和一個MessageListener接口。所以我們要在IOC容器中注入一個RedisTemplate和一個實現(xiàn)了MessageListener接口的類。話不多說,先看代碼

配置RedisTemplate

配置RedisTemplate的主要目的是配置序列化方式以解決亂碼問題,同時合理配置序列化方式還能降低一點性能開銷。

  1. /** 
  2.  
  3.  * 配置RedisTemplate,解決亂碼問題 
  4.  
  5.  */ 
  6.  
  7. @Bean 
  8.  
  9. public RedisTemplate&lt;String, Object&gt; redisTemplate(RedisConnectionFactory factory) { 
  10.  
  11.     LOGGER.debug("redis序列化配置開始"); 
  12.  
  13.     RedisTemplate&lt;String, Object&gt; template = new RedisTemplate&lt;&gt;(); 
  14.  
  15.     template.setConnectionFactory(factory); 
  16.  
  17.     // string序列化方式 
  18.  
  19.     RedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); 
  20.  
  21.     // 設(shè)置默認序列化方式 
  22.  
  23.     template.setDefaultSerializer(serializer); 
  24.  
  25.     template.setKeySerializer(new StringRedisSerializer()); 
  26.  
  27.     template.setHashValueSerializer(serializer); 
  28.  
  29.     LOGGER.debug("redis序列化配置結(jié)束"); 
  30.  
  31.     return template; 
  32.  

代碼第12行,我們配置默認的序列化方式為GenericJackson2JsonRedisSerializer代碼第13行,我們配置鍵的序列化方式為StringRedisSerializer代碼第14行,我們配置哈希表的值的序列化方式為GenericJackson2JsonRedisSerializer

RedisTemplate幾種序列化方式的簡要介紹

 

六、redis隊列監(jiān)聽器(消費者)

上面說了,與redis隊列監(jiān)聽器相關(guān)的類為一個名為MessageListener的接口,下面是該接口的源碼

public interface MessageListener { void onMessage(Message message, @Nullable byte[] pattern);}

可以看到,該接口僅有一個onMessage(Message message, @Nullable byte[] pattern)方法,該方法便是監(jiān)聽到隊列中消息后的回調(diào)方法。下面解釋一下這兩個參數(shù):

  • message:redis消息類,該類中僅有兩個方法
    • byte[] getBody()以二進制形式獲取消息體
    • byte[] getChannel()以二進制形式獲取消息通道
  • pattern:二進制形式的消息通道,和message.getChannel()返回值相同

介紹完接口,我們來實現(xiàn)一個簡單的redis隊列監(jiān)聽器

  1. @Component 
  2.  
  3. public class RedisListener implement MessageListener{ 
  4.  
  5.     private static final Logger LOGGER = LoggerFactory.getLogger(RedisListener.class); 
  6.  
  7.  
  8.  
  9.     @Override 
  10.  
  11.     public void onMessage(Message message,byte[] pattern){ 
  12.  
  13.         LOGGER.debug("從消息通道={}監(jiān)聽到消息",new String(pattern)); 
  14.  
  15.         LOGGER.debug("從消息通道={}監(jiān)聽到消息",new String(message.getChannel())); 
  16.  
  17.         LOGGER.debug("元消息={}",new String(message.getBody())); 
  18.  
  19.         // 新建一個用于反序列化的對象,注意這里的對象要和前面配置的一樣 
  20.  
  21.         // 因為我前面設(shè)置的默認序列化方式為GenericJackson2JsonRedisSerializer 
  22.  
  23.         // 所以這里的實現(xiàn)方式為GenericJackson2JsonRedisSerializer 
  24.  
  25.         RedisSerializer serializer=new GenericJackson2JsonRedisSerializer(); 
  26.  
  27.         LOGGER.debug("反序列化后的消息={}",serializer.deserialize(message.getBody())); 
  28.  
  29.     } 
  30.  

代碼很簡單,就是輸出參數(shù)中包含的關(guān)鍵信息。需要注意的是,RedisSerializer的實現(xiàn)要與上面配置的序列化方式一致。

隊列監(jiān)聽器實現(xiàn)完以后,我們還需要將這個監(jiān)聽器添加到redis隊列監(jiān)聽器容器中,代碼如下:

  1. @Bean 
  2.  
  3. public public RedisMessageListenerContainer container(RedisConnectionFactory factory) { 
  4.  
  5.     RedisMessageListenerContainer container = new RedisMessageListenerContainer(); 
  6.  
  7.     container.setConnectionFactory(factory); 
  8.  
  9.     container.addMessageListener(redisListener, new PatternTopic("demo-channel")); 
  10.  
  11.     return container; 
  12.  

這幾行代碼大概意思就是新建一個Redis消息監(jiān)聽器容器,然后將監(jiān)聽器和管道名想綁定,最后返回這個容器。

這里要注意的是,這個管道名和下面將要說的推送消息時的管道名要一致,不然監(jiān)聽器監(jiān)聽不到消息。

七、redis隊列推送服務(wù)(生產(chǎn)者)

上面我們配置了RedisTemplate將要在這里使用到。

代碼如下:

  1. @Service 
  2.  
  3. public class Publisher{ 
  4.  
  5.     @Autowrite 
  6.  
  7.     private RedisTemplate redis; 
  8.  
  9.  
  10.  
  11.     public void publish(Object msg){ 
  12.  
  13.         redis.convertAndSend("demo-channel",msg); 
  14.  
  15.     } 
  16.  

關(guān)鍵代碼為第7行,redis.convertAndSend()這個方法的作用為,向某個通道(參數(shù)1)推送一條消息(第二個參數(shù))。

這里還是要注意上面所說的,生產(chǎn)者和消費者的通道名要相同。

至此,消息隊列的生產(chǎn)者和消費者已經(jīng)全部編寫完成。

八、遇到的問題及解決辦法

1、spring boot使用log4j2日志框架問題

在我添加了spring-boot-starter-log4j2依賴并在spring-boot-starter-web中排除了spring-boot-starter-logging后,運行項目,還是會提示下面的錯誤:

  1. SLF4J: Class path contains multiple SLF4J bindings. 
  2.  
  3. SLF4J: Found binding in [jar:file:.....m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
  4.  
  5. SLF4J: Found binding in [jar:file:.....m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.12.1/log4j-slf4j-impl-2.12.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
  6.  
  7. SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. 
  8.  
  9. SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder] 

這個錯誤就是maven中有多個日志框架導(dǎo)致的。后來通過依賴分析,發(fā)現(xiàn)在spring-boot-starter-data-redis中,也依賴了spring-boot-starter-logging,解決辦法也很簡單,下面貼出詳細代碼

  1. <dependency> 
  2.  
  3.     <groupId>org.springframework.boot</groupId> 
  4.  
  5.     <artifactId>spring-boot-starter-data-redis</artifactId> 
  6.  
  7.     <exclusions> 
  8.  
  9.         <exclusion> 
  10.  
  11.             <groupId>org.springframework.boot</groupId> 
  12.  
  13.             <artifactId>spring-boot-starter-logging</artifactId> 
  14.  
  15.         </exclusion> 
  16.  
  17.     </exclusions> 
  18.  
  19. </dependency> 
  20.  
  21. <dependency> 
  22.  
  23.     <groupId>org.springframework.boot</groupId> 
  24.  
  25.     <artifactId>spring-boot-starter-web</artifactId> 
  26.  
  27.     <exclusions> 
  28.  
  29.         <exclusion> 
  30.  
  31.             <groupId>org.springframework.boot</groupId> 
  32.  
  33.             <artifactId>spring-boot-starter-logging</artifactId> 
  34.  
  35.         </exclusion> 
  36.  
  37.     </exclusions> 
  38.  
  39. </dependency> 
  40.  
  41. <dependency> 
  42.  
  43.     <groupId>org.springframework.boot</groupId> 
  44.  
  45.     <artifactId>spring-boot-starter-log4j2</artifactId> 
  46.  
  47. </dependency> 
  48.  
  49. <dependency> 
  50.  
  51.     <groupId>org.springframework.integration</groupId> 
  52.  
  53.     <artifactId>spring-integration-redis</artifactId> 
  54.  
  55. </dependency> 

2、redis隊列監(jiān)聽器線程安全問題

redis隊列監(jiān)聽器的監(jiān)聽機制是:使用一個線程監(jiān)聽隊列,隊列有未消費的消息則取出消息并生成一個新的線程來消費消息。如果你還記得,我開頭說的是由于redis單線程特性,因此我們用它來做消息隊列,但是如果監(jiān)聽器每次接受一個消息就生成新的線程來消費信息的話,這樣就完全沒有使用到redis的單線程特性,同時還會產(chǎn)生線程安全問題。

單一消費者(一個通道只有一個消費者)的解決辦法

最簡單的辦法莫過于為onMessage()方法加鎖,這樣簡單粗暴卻很有用,不過這種方式無法控制隊列監(jiān)聽的速率,且無限制的創(chuàng)造線程最終會導(dǎo)致系統(tǒng)資源被占光。那如何解決這種情況呢?線程池。在將監(jiān)聽器添加到容器的配置的時候,RedisMessageListenerContainer類中有一個方法setTaskExecutor(Executor taskExecutor)可以為監(jiān)聽容器配置線程池。配置線程池以后,所有的線程都會由該線程池產(chǎn)生,由此,我們可以通過調(diào)節(jié)線程池來控制隊列監(jiān)聽的速率。

多個消費者(一個通道有多個消費者)的解決辦法

單一消費者的問題相比于多個消費者來說還是較為簡單,因為Java內(nèi)置的鎖都是只能控制自己程序的運行,不能干擾其他的程序的運行;然而現(xiàn)在很多時候我們都是在分布式環(huán)境下進行開發(fā),這時處理多個消費者的情況就很有意義了。

那么這種問題如何解決呢?分布式鎖。

下面來簡要科普一下什么是分布式鎖:

分布式鎖是指在分布式環(huán)境下,同一時間只有一個客戶端能夠從某個共享環(huán)境中(例如redis)獲取到鎖,只有獲取到鎖的客戶端才能執(zhí)行程序。

然后分布式鎖一般要滿足:排他性(即同一時間只有一個客戶端能夠獲取到鎖)、避免死鎖(即超時后自動釋放)、高可用(即獲取或釋放鎖的機制必須高可用且性能佳)

上面講依賴的時候,我們導(dǎo)入了一個spring-integration-redis依賴,這個依賴里面包含了很多實用的工具類,而我們接下來要講的分布式鎖就是這個依賴下面的一個工具包RedisLockRegistry。

首先講一下如何使用,導(dǎo)入了依賴以后,首先配置一個Bean

  1. @Bean 
  2.  
  3. public RedisLockRegistry redisLockRegistry(RedisConnectionFactory factory) { 
  4.  
  5.     return new RedisLockRegistry(factory, "demo-lock",60); 
  6.  

RedisLockRegistry的構(gòu)造函數(shù),第一個參數(shù)是redis連接池,第二個參數(shù)是鎖的前綴,即取出的鎖,鍵名為“demo-lock:KEY_NAME”,第三個參數(shù)為鎖的過期時間(秒),默認為60秒,當持有鎖超過該時間后自動過期。

使用鎖的方法,下面是對監(jiān)聽器的修改

  1. @Component 
  2.  
  3. public class RedisListener implement MessageListener{ 
  4.  
  5.     @Autowrite 
  6.  
  7.     private RedisLockRegistry redisLockRegistry; 
  8.  
  9.     private static final Logger LOGGER = LoggerFactory.getLogger(RedisListener.class); 
  10.  
  11.     @Override 
  12.  
  13.     public void onMessage(Message message,byte[] pattern){ 
  14.  
  15.         Lock lock=redisLockRegistry.obtain("lock"); 
  16.  
  17.         try{ 
  18.  
  19.             lock.lock(); //上鎖 
  20.  
  21.             LOGGER.debug("從消息通道={}監(jiān)聽到消息",new String(pattern)); 
  22.  
  23.             LOGGER.debug("從消息通道={}監(jiān)聽到消息",new String(message.getChannel())); 
  24.  
  25.             LOGGER.debug("元消息={}",new String(message.getBody())); 
  26.  
  27.             // 新建一個用于反序列化的對象,注意這里的對象要和前面配置的一樣 
  28.  
  29.             // 因為我前面設(shè)置的默認序列化方式為GenericJackson2JsonRedisSerializer 
  30.  
  31.             // 所以這里的實現(xiàn)方式為GenericJackson2JsonRedisSerializer 
  32.  
  33.             RedisSerializer serializer=new GenericJackson2JsonRedisSerializer(); 
  34.  
  35.             LOGGER.debug("反序列化后的消息={}",serializer.deserialize(message.getBody())); 
  36.  
  37.         } catch (Exception e) { 
  38.  
  39.             e.printStackTrace(); 
  40.  
  41.         } finally { 
  42.  
  43.             lock.unlock(); //解鎖 
  44.  
  45.         } 
  46.  
  47.     } 
  48.  

上面代碼的代碼比起前面的監(jiān)聽器代碼,只是多了一個注入的RedisLockRegistry,一個通過redisLockRegistry.obtain()方法獲取鎖,一個加鎖一個解鎖,然后這就完成了分布式鎖的使用。注意這個獲取鎖的方法redisLockRegistry.obtain(),其返回的是一個名為RedisLock的鎖,這是一個私有內(nèi)部類,它實現(xiàn)了Lock接口,因此我們不能從代碼外部創(chuàng)建一個他的實例,只能通過obtian()方法來獲取這個鎖。

以上就是本文的全部內(nèi)容。本文來自作者投稿,原作者:小胖兒,轉(zhuǎn)載請注明出處及作者。

【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號Hollis(ID:hollischuang)】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2025-10-20 04:00:00

2025-11-11 09:25:19

2020-09-02 07:52:03

AOP測試環(huán)境

2021-09-28 13:42:55

Chrome Devwebsocket網(wǎng)絡(luò)協(xié)議

2024-08-05 01:26:54

2025-11-20 06:10:00

2022-10-09 08:38:17

消息隊列面試官模式

2022-04-08 08:26:03

JavaHTTP請求

2019-04-15 14:40:46

消息隊列Java編程

2024-01-26 13:16:00

RabbitMQ延遲隊列docker

2017-03-16 15:27:10

面試官測試技術(shù)

2021-11-02 09:05:25

Redis

2024-09-03 09:20:45

2020-07-02 07:52:11

RedisHash映射

2024-05-29 14:34:07

2020-08-17 07:40:19

消息隊列

2022-07-13 17:47:54

布局Flex代碼

2025-06-27 10:41:04

Redis數(shù)據(jù)庫集群

2024-05-28 10:14:31

JavaScrip模板引擎

2022-07-06 13:48:24

RedisSentinel機制
點贊
收藏

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

亚洲日本成人女熟在线观看| 欧美日韩国产一区中文午夜| 91久久国产综合久久蜜月精品| 久久综合久中文字幕青草| 欧美精品一区二区三区久久| 午夜精品免费观看| 色婷婷色综合| 精品福利一二区| 乱子伦视频在线看| 国产区在线观看| 99免费精品视频| 国产精品日韩电影| 精品肉丝脚一区二区三区| 亚洲妇女av| 日韩一级大片在线观看| 免费无码国产v片在线观看| 日本中文字幕在线2020| av一区二区三区在线| 国产精品自拍偷拍视频| 国产一级av毛片| 日韩欧美大片| 日韩毛片中文字幕| 日韩av福利在线观看| 久久uomeier| 亚洲尤物视频在线| 亚洲图片都市激情| 三级国产在线观看| 国产成人免费在线观看| 国产精品视频自在线| 日韩av黄色片| 中文视频一区| 亚洲天堂av电影| 好男人香蕉影院| 看亚洲a级一级毛片| 日本精品视频一区二区| 欧美性潮喷xxxxx免费视频看| а天堂8中文最新版在线官网| 高清久久久久久| 成人一区二区电影| 在线观看av大片| 噜噜噜躁狠狠躁狠狠精品视频 | 黄色小视频免费网站| 久草免费在线视频| 亚洲国产乱码最新视频| 中文字幕成人一区| 香蕉视频在线看| 国产日产欧美精品一区二区三区| 国产一区二区三区奇米久涩| 成人福利小视频| 国产在线不卡一卡二卡三卡四卡| 国产精品久久久久久久久久久久久久 | 国产网红主播福利一区二区| 精品日产一区2区三区黄免费| 亚洲大尺度视频| 国产成人免费视频网站| 96sao精品视频在线观看| 国产精品嫩草影院桃色| 久久精品国产免费| 亚洲va码欧洲m码| 精品久久久中文字幕人妻| 国产又黄又大久久| 成人网在线视频| 97在线视频人妻无码| 久久福利视频一区二区| 91精品国产综合久久久久久蜜臀| 国产女优在线播放| 精品制服美女久久| 91亚洲精品久久久久久久久久久久| 国产原创中文av| 国产真实乱子伦精品视频| 92国产精品视频| 亚洲精品国产精| 99r国产精品| 日本一区二区三区四区高清视频| 77导航福利在线| 亚洲人成7777| 国产中文字幕乱人伦在线观看| 大黄网站在线观看| 日韩欧美国产视频| 性猛交ⅹ×××乱大交| japansex久久高清精品| 日韩免费电影一区| 人妻精品久久久久中文字幕| 精品久久久中文字幕| 久久久国产一区二区| 麻豆一区二区三区精品视频| 亚洲欧美不卡| 国产欧美日韩精品在线观看| 国产精品永久久久久久久久久| 福利视频网站一区二区三区| 欧美性大战久久久久| 黄色av电影在线播放| 亚洲一区二区三区四区在线免费观看 | 激情欧美日韩一区| 国产成人精品免费视频| 97人妻精品一区二区三区软件 | 一起草在线视频| 国内精品伊人久久久| 久久夜色精品国产亚洲aⅴ| 国产一级理论片| 视频一区二区欧美| 亚洲a一级视频| 日本一区高清| 亚洲男帅同性gay1069| 日韩欧美国产免费| 中文字幕日韩亚洲| 日韩精品一二三四区| 欧美日韩国产中文| 国产69精品久久久久久久| 欧美va在线| 亚洲成人黄色在线| 啪啪一区二区三区| 亚洲专区一区| 国产精品久久国产三级国电话系列| 欧美69xxxxx| 一区二区理论电影在线观看| 能在线观看的av网站| 伊人久久亚洲| 日韩一区二区精品视频| 日韩成人在线免费视频| 另类调教123区| 欧美一区二区在线视频观看| 图片区小说区亚洲| 在线精品视频免费观看| 中文字幕三级电影| 中文字幕免费一区二区三区| 国产成人精品免高潮费视频| 天堂网av2014| 亚洲午夜电影网| 激情成人在线观看| 成人在线免费小视频| 性日韩欧美在线视频| 国产免费一区二区三区免费视频| 欧美经典一区二区| 亚洲国产精品久久久久爰色欲| 51社区在线成人免费视频| 色偷偷噜噜噜亚洲男人的天堂| 亚洲午夜18毛片在线看| 北岛玲一区二区三区四区| 国产精品igao激情视频| 亚洲在线资源| 久久九九国产精品怡红院| 国内av在线播放| 国产日产亚洲精品系列| 国产精品亚洲a| 日韩精品丝袜美腿| 91高清在线免费观看| 手机看片福利在线| 亚洲v中文字幕| 亚洲色偷偷色噜噜狠狠99网| 国产综合精品一区| 国产精品美女诱惑| av白虎一区| 欧美精品一区在线观看| 国产精品第56页| 99久久久精品免费观看国产蜜| 欧妇女乱妇女乱视频| 91精品尤物| 国内外成人免费激情在线视频网站| 国产综合在线播放| 午夜一区二区三区视频| 亚洲av无码一区二区二三区| 美女黄网久久| 亚洲综合av一区| 国产999精品在线观看| 欧美成人sm免费视频| 亚洲国产www| 精品欧美国产一区二区三区| 久久午夜夜伦鲁鲁片| 乱码第一页成人| 日韩少妇中文字幕| 亚洲精品tv| 欧美国产日韩免费| 日韩在线免费播放| 欧美无砖专区一中文字| 日韩精品一区二区三区在线视频| 极品少妇xxxx偷拍精品少妇| 久久人妻无码一区二区| 久久婷婷国产| 国产精品扒开腿做爽爽爽男男| 在线视频91p| 精品国产一区二区三区av性色| 国产精品久久久久久久妇| 久久久噜噜噜久噜久久综合| 亚洲精品自拍网| 国产精品vip| 欧美日韩无遮挡| 国产aa精品| 热久久视久久精品18亚洲精品| 超碰国产在线| 精品国产一区二区三区不卡| 波多野结衣毛片| 亚洲免费观看高清| 波多野结衣福利| 韩国理伦片一区二区三区在线播放| 免费看日本黄色| 精品不卡一区| 国产精品日韩欧美一区二区| 蜜桃成人精品| 色综合色综合久久综合频道88| 日本aaa在线观看| 欧美白人最猛性xxxxx69交| 台湾佬中文在线| 一区二区三区免费网站| 熟女俱乐部一区二区| 国产一区二区三区免费播放| 人妻精品无码一区二区三区 | 亚洲区中文字幕| 国产美女主播在线观看| 日韩欧美999| 免费在线一级片| 国产精品久久久久久久久动漫 | 欧美精品久久久久久久久| 超碰免费97在线观看| 亚洲国产欧美一区二区三区久久| 亚洲天堂国产精品| 一本大道久久a久久综合| 欧美丰满艳妇bbwbbw| 国产欧美日韩精品一区| 欧美做受高潮中文字幕| 国产最新精品免费| www.涩涩涩| 噜噜爱69成人精品| 国产精品又粗又长| 欧美成人高清| 青少年xxxxx性开放hg| 精品国内自产拍在线观看视频| 黑人巨大精品欧美一区二区小视频 | 国产精品亚洲视频在线观看| sese综合| 57pao国产精品一区| 欧美日韩经典丝袜| 欧美乱大交xxxxx另类电影| 日本在线天堂| 国产午夜一区二区| 欧美日韩在线中文字幕| 亚洲精品乱码久久久久久金桔影视 | 手机av在线播放| 欧美www在线| 国产精品剧情一区二区在线观看 | 亚洲国产天堂av| 久久久午夜电影| www.中文字幕av| 久久久亚洲高清| 91精品人妻一区二区三区| 久久综合五月天婷婷伊人| 一区二区视频观看| heyzo一本久久综合| 丰满岳乱妇一区二区| 成人一级黄色片| 四虎精品一区二区| 99视频精品免费视频| 色综合久久五月| 99精品桃花视频在线观看| 成人性生活免费看| 96av麻豆蜜桃一区二区| 国产精品无码一区二区三区免费 | 欧美精品七区| 欧美日韩激情| 亚洲制服中文| 欧美视频四区| 久久亚洲中文字幕无码| 免费在线亚洲欧美| 亚洲视频在线观看一区二区三区| 水蜜桃久久夜色精品一区的特点| 爱情岛论坛亚洲首页入口章节| 毛片不卡一区二区| 特种兵之深入敌后| 99视频超级精品| 69精品无码成人久久久久久| 国产精品每日更新在线播放网址| 污污的视频在线免费观看| 一区二区三区在线视频免费观看| 日韩aaaaaa| 欧美丝袜自拍制服另类| 精品人妻午夜一区二区三区四区| 亚洲黄色在线看| av电影在线播放高清免费观看| 久久精品国产成人精品| 免费在线播放电影| 日韩av快播网址| 亚洲美女色播| 国产女主播一区二区三区| 欧美女优在线视频| 亚洲免费视频播放| 亚洲一区免费| 又色又爽又黄视频| 91在线一区二区| 国产喷水在线观看| 天天色图综合网| 一级特黄aaa大片| 日韩国产欧美精品一区二区三区| 超碰免费在线观看| 性亚洲最疯狂xxxx高清| 日本欧美韩国| 国产精品一区二区你懂得| 国产精品一区高清| 久久综合久久久久| 日韩电影在线一区| 扒开伸进免费视频| 国产精品乱码一区二区三区软件| 日韩视频免费观看高清| 欧美精品亚洲一区二区在线播放| 少妇人妻偷人精品一区二区| 色噜噜狠狠狠综合曰曰曰 | 欧美国产美女| 欧美 日本 亚洲| 国产精品一区一区| 亚洲精品一区二区三区影院忠贞| 亚洲国产日韩综合久久精品| 亚洲视频一区二区三区四区| 日韩激情第一页| 欧美videosex性极品hd| 国产日韩在线亚洲字幕中文| 啪啪国产精品| 国产www免费| 国产精品资源网| 国产在视频线精品视频| 欧美视频在线视频| 蜜桃视频污在线观看| 久久精品免费电影| 九七电影院97理论片久久tvb| 麻豆传媒一区二区| 好看的日韩av电影| 国产欧美精品一二三| 国产精品美女久久久久aⅴ| 亚洲国产成人无码av在线| 欧美精品一区二区三区一线天视频| 黄色网在线免费观看| 国产精品自产拍在线观看中文| 伊人久久大香线蕉| 成人一对一视频| www.欧美色图| 久久精品欧美一区二区| 日韩一区二区三区免费观看| 欧美成人hd| 国产九九精品视频| 欧美午夜精彩| 美女黄色片视频| 国产精品色在线| 国产一区二区三区中文字幕| 中文字幕亚洲欧美日韩2019| 欧美日韩电影免费看| 欧美亚洲另类在线一区二区三区| 亚洲一区不卡| 亚洲专区区免费| 欧美性猛交丰臀xxxxx网站| 香蕉视频国产在线| 欧美中文字幕视频| 亚洲精华一区二区三区| 97成人在线观看视频| 久久综合色综合88| 99久久久无码国产精品免费蜜柚| 亚洲欧美激情在线视频| 日日夜夜天天综合| 日韩欧美视频一区二区三区四区| 视频一区国产视频| 极品尤物一区二区| 91精品国产欧美一区二区成人| 在线观看av免费| 国产精品视频福利| 国产欧美日本| av中文字幕免费观看| 欧美视频在线观看一区二区| 在线激情免费视频| 91中文字幕在线| 日韩天堂av| x88av在线| 91精品国产一区二区三区香蕉| 污污的网站在线看| 久久亚洲高清| 青青草一区二区三区| 久久福利免费视频| 欧美不卡123| 在线免费看h| 亚洲一区二区三区精品视频| 国产一区二区三区久久悠悠色av| 久久久久久久久久99| 日韩成人在线视频观看| 电影一区二区| 91精品一区二区三区四区| 99久久国产综合精品麻豆| 国产精品免费无遮挡无码永久视频| 色悠悠国产精品| 99re6热只有精品免费观看| 国产精品秘入口18禁麻豆免会员| 欧美极品少妇xxxxⅹ高跟鞋| 性欧美8khd高清极品| 热久久免费视频精品| 亚洲情侣在线| 人妻丰满熟妇aⅴ无码| 欧美日韩国产色站一区二区三区| 在线网址91| 秋霞毛片久久久久久久久| 韩国女主播成人在线| 天堂а√在线中文在线新版| 久久久成人av| 欧美人与牛zoz0性行为| 人妻精品久久久久中文字幕69| 日本乱人伦一区|