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

緩存擊穿!竟然不知道怎么寫代碼???

存儲 存儲軟件
在Redis中有三大問題:緩存雪崩、緩存擊穿、緩存穿透,今天我們來聊聊緩存擊穿。關于緩存擊穿相關理論文章,相信大家已經看過不少,但是具體代碼中是怎么實現的,怎么解決的等問題,可能就一臉懵逼了。

[[407549]]

在Redis中有三大問題:緩存雪崩、緩存擊穿、緩存穿透,今天我們來聊聊緩存擊穿。

關于緩存擊穿相關理論文章,相信大家已經看過不少,但是具體代碼中是怎么實現的,怎么解決的等問題,可能就一臉懵逼了。

今天,老田就帶大家來看看,緩存擊穿解決和代碼實現。

場景

請看下面這段代碼:

  1. /**  
  2.  * @author 田維常 
  3.  * @公眾號 java后端技術全棧 
  4.  * @date 2021/6/27 15:59 
  5.  */ 
  6. @Service 
  7. public class UserInfoServiceImpl implements UserInfoService { 
  8.  
  9.     @Resource 
  10.     private UserMapper userMapper; 
  11.     @Resource 
  12.     private RedisTemplate<Long, String> redisTemplate; 
  13.  
  14.     @Override 
  15.     public UserInfo findById(Long id) { 
  16.         //查詢緩存 
  17.         String userInfoStr = redisTemplate.opsForValue().get(id); 
  18.         //如果緩存中不存在,查詢數據庫 
  19.         //1 
  20.         if (isEmpty(userInfoStr)) { 
  21.             UserInfo userInfo = userMapper.findById(id); 
  22.             //數據庫中不存在 
  23.             if(userInfo == null){ 
  24.                   return null
  25.             } 
  26.             userInfoStr = JSON.toJSONString(userInfo); 
  27.             //2 
  28.             //放入緩存 
  29.             redisTemplate.opsForValue().set(id, userInfoStr); 
  30.         } 
  31.         return JSON.parseObject(userInfoStr, UserInfo.class); 
  32.     } 
  33.  
  34.     private boolean isEmpty(String string) { 
  35.         return !StringUtils.hasText(string); 
  36.     } 

整個流程:

如果,在//1到//2之間耗時1.5秒,那就代表著在這1.5秒時間內所有的查詢都會走查詢數據庫。這也就是我們所說的緩存中的“緩存擊穿”。

其實,你們項目如果并發量不是很高,也不用怕,并且我見過很多項目也就差不多是這么寫的,也沒那么多事,畢竟只是第一次的時候可能會發生緩存擊穿。

但,我們也不要抱著一個僥幸的心態去寫代碼,既然是多線程導致的,估計很多人會想到鎖,下面我們使用鎖來解決。

改進版

既然使用到鎖,那么我們第一時間應該關心的是鎖的粒度。

如果我們放在方法findById上,那就是所有查詢都會有鎖的競爭,這里我相信大家都知道我們為什么不放在方法上。

  1. /**  
  2.  * @author 田維常 
  3.  * @公眾號 java后端技術全棧 
  4.  * @date 2021/6/27 15:59 
  5.  */ 
  6. @Service 
  7. public class UserInfoServiceImpl implements UserInfoService { 
  8.  
  9.     @Resource 
  10.     private UserMapper userMapper; 
  11.     @Resource 
  12.     private RedisTemplate<Long, String> redisTemplate; 
  13.  
  14.     @Override 
  15.     public UserInfo findById(Long id) { 
  16.         //查詢緩存 
  17.         String userInfoStr = redisTemplate.opsForValue().get(id); 
  18.         if (isEmpty(userInfoStr)) { 
  19.             //只有不存的情況存在鎖 
  20.             synchronized (UserInfoServiceImpl.class){ 
  21.                 UserInfo userInfo = userMapper.findById(id); 
  22.                 //數據庫中不存在 
  23.                 if(userInfo == null){ 
  24.                      return null
  25.                 } 
  26.                 userInfoStr = JSON.toJSONString(userInfo); 
  27.                 //放入緩存 
  28.                 redisTemplate.opsForValue().set(id, userInfoStr); 
  29.             } 
  30.         } 
  31.         return JSON.parseObject(userInfoStr, UserInfo.class); 
  32.     } 
  33.  
  34.     private boolean isEmpty(String string) { 
  35.         return !StringUtils.hasText(string); 
  36.     } 

看似解決問題了,其實,問題還是沒得到解決,還是會緩存擊穿,因為排隊獲取到鎖后,還是會執行同步塊代碼,也就是還會查詢數據庫,完全沒有解決緩存擊穿。

雙重檢查鎖

由此,我們引入雙重檢查鎖,我們在上的版本中進行稍微改變,在同步模塊中再次校驗緩存中是否存在。

  1. /**  
  2.  * @author 田維常 
  3.  * @公眾號 java后端技術全棧 
  4.  * @date 2021/6/27 15:59 
  5.  */ 
  6. @Service 
  7. public class UserInfoServiceImpl implements UserInfoService { 
  8.  
  9.     @Resource 
  10.     private UserMapper userMapper; 
  11.     @Resource 
  12.     private RedisTemplate<Long, String> redisTemplate; 
  13.  
  14.     @Override 
  15.     public UserInfo findById(Long id) { 
  16.         //查緩存 
  17.         String userInfoStr = redisTemplate.opsForValue().get(id); 
  18.         //第一次校驗緩存是否存在 
  19.         if (isEmpty(userInfoStr)) { 
  20.             //上鎖 
  21.             synchronized (UserInfoServiceImpl.class){  
  22.                 //再次查詢緩存,目的是判斷是否前面的線程已經set過了 
  23.                 userInfoStr = redisTemplate.opsForValue().get(id); 
  24.                 //第二次校驗緩存是否存在 
  25.                 if (isEmpty(userInfoStr)) { 
  26.                     UserInfo userInfo = userMapper.findById(id); 
  27.                     //數據庫中不存在 
  28.                     if(userInfo == null){ 
  29.                         return null
  30.                     } 
  31.                     userInfoStr = JSON.toJSONString(userInfo); 
  32.                     //放入緩存 
  33.                     redisTemplate.opsForValue().set(id, userInfoStr); 
  34.                 } 
  35.             } 
  36.         } 
  37.         return JSON.parseObject(userInfoStr, UserInfo.class); 
  38.     } 
  39.  
  40.     private boolean isEmpty(String string) { 
  41.         return !StringUtils.hasText(string); 
  42.     } 

這樣,看起來我們就解決了緩存擊穿問題,大家覺得解決了嗎?

惡意攻擊

回顧上面的案例,在正常的情況下是沒問題,但是一旦有人惡意攻擊呢?

比如說:入參id=10000000,在數據庫里并沒有這個id,怎么辦呢?

第一步、緩存中不存在

第二步、查詢數據庫

第三步、由于數據庫中不存在,直接返回了,并沒有操作緩存

第四步、再次執行第一步.....死循環了吧

方案1:設置空對象

就是當緩存中和數據庫中都不存在的情況下,以id為key,空對象為value。

  1. set(id,空對象); 

回到上面的四步,就變成了。

比如說:入參id=10000000,在數據庫里并沒有這個id,怎么辦呢?

第一步、緩存中不存在

第二步、查詢數據庫

第三步、由于數據庫中不存在,以id為key,空對象為value放入緩存中

第四步、執行第一步,此時,緩存就存在了,只是這時候只是一個空對象。

代碼實現部分:

  1. /**  
  2.  * @author 田維常 
  3.  * @公眾號 java后端技術全棧 
  4.  * @date 2021/6/27 15:59 
  5.  */ 
  6. @Service 
  7. public class UserInfoServiceImpl implements UserInfoService { 
  8.  
  9.     @Resource 
  10.     private UserMapper userMapper; 
  11.     @Resource 
  12.     private RedisTemplate<Long, String> redisTemplate;  
  13.  
  14.     @Override 
  15.     public UserInfo findById(Long id) { 
  16.         String userInfoStr = redisTemplate.opsForValue().get(id); 
  17.         //判斷緩存是否存在,是否為空對象 
  18.         if (isEmpty(userInfoStr)) { 
  19.             synchronized (UserInfoServiceImpl.class){ 
  20.                 userInfoStr = redisTemplate.opsForValue().get(id); 
  21.                 if (isEmpty(userInfoStr)) { 
  22.                     UserInfo userInfo = userMapper.findById(id); 
  23.                     if(userInfo == null){ 
  24.                         //構建一個空對象 
  25.                         userInfo= new UserInfo(); 
  26.                     } 
  27.                     userInfoStr = JSON.toJSONString(userInfo); 
  28.                     redisTemplate.opsForValue().set(id, userInfoStr); 
  29.                 } 
  30.             } 
  31.         } 
  32.         UserInfo userInfo = JSON.parseObject(userInfoStr, UserInfo.class); 
  33.         //空對象處理 
  34.         if(userInfo.getId() == null){ 
  35.             return null
  36.         } 
  37.         return JSON.parseObject(userInfoStr, UserInfo.class); 
  38.     } 
  39.  
  40.     private boolean isEmpty(String string) { 
  41.         return !StringUtils.hasText(string); 
  42.     } 

方案2 布隆過濾器

布隆過濾器(Bloom Filter):是一種空間效率極高的概率型算法和數據結構,用于判斷一個元素是否在集合中(類似Hashset)。它的核心一個很長的二進制向量和一系列hash函數,數組長度以及hash函數的個數都是動態確定的。

Hash函數:SHA1,SHA256,MD5..

布隆過濾器的用處就是,能夠迅速判斷一個元素是否在一個集合中。因此他有如下三個使用場景:

  • 網頁爬蟲對URL的去重,避免爬取相同的URL地址
  • 反垃圾郵件,從數十億個垃圾郵件列表中判斷某郵箱是否垃圾郵箱(垃圾短信)
  • 緩存擊穿,將已存在的緩存放到布隆過濾器中,當黑客訪問不存在的緩存時迅速返回避免緩存及DB掛掉。

其內部維護一個全為0的bit數組,需要說明的是,布隆過濾器有一個誤判率的概念,誤判率越低,則數組越長,所占空間越大。誤判率越高則數組越小,所占的空間越小。布隆過濾器的相關理論和算法這里就不聊了,感興趣的可以自行研究。

優勢和劣勢

優勢

  • 全量存儲但是不存儲元素本身,在某些對保密要求非常嚴格的場合有優勢;
  • 空間高效率
  • 插入/查詢時間都是常數O(k),遠遠超過一般的算法

劣勢

  • 存在誤算率(False Positive),默認0.03,隨著存入的元素數量增加,誤算率隨之增加;
  • 一般情況下不能從布隆過濾器中刪除元素;
  • 數組長度以及hash函數個數確定過程復雜;

代碼實現:

  1. /**  
  2.  * @author 田維常 
  3.  * @公眾號 java后端技術全棧 
  4.  * @date 2021/6/27 15:59 
  5.  */ 
  6. @Service 
  7. public class UserInfoServiceImpl implements UserInfoService { 
  8.  
  9.     @Resource 
  10.     private UserMapper userMapper; 
  11.     @Resource 
  12.     private RedisTemplate<Long, String> redisTemplate; 
  13.     private static Long size = 1000000000L; 
  14.  
  15.     private static BloomFilter<Long> bloomFilter = BloomFilter.create(Funnels.longFunnel(), size); 
  16.  
  17.     @Override 
  18.     public UserInfo findById(Long id) { 
  19.         String userInfoStr = redisTemplate.opsForValue().get(id); 
  20.         if (isEmpty(userInfoStr)) { 
  21.             //校驗是否在布隆過濾器中 
  22.             if(bloomFilter.mightContain(id)){ 
  23.                 return null
  24.             } 
  25.             synchronized (UserInfoServiceImpl.class){ 
  26.                 userInfoStr = redisTemplate.opsForValue().get(id); 
  27.                 if (isEmpty(userInfoStr) ) { 
  28.                     if(bloomFilter.mightContain(id)){ 
  29.                         return null
  30.                     } 
  31.                     UserInfo userInfo = userMapper.findById(id); 
  32.                     if(userInfo == null){ 
  33.                         //放入布隆過濾器中 
  34.                         bloomFilter.put(id); 
  35.                         return null
  36.                     } 
  37.                     userInfoStr = JSON.toJSONString(userInfo); 
  38.                     redisTemplate.opsForValue().set(id, userInfoStr); 
  39.                 } 
  40.             } 
  41.         } 
  42.         return JSON.parseObject(userInfoStr, UserInfo.class); 
  43.     }  
  44.     private boolean isEmpty(String string) { 
  45.         return !StringUtils.hasText(string); 
  46.     } 

方案3 互斥鎖

使用Redis實現分布式的時候,有用到setnx,這里大家可以想象,我們是否可以使用這個分布式鎖來解決緩存擊穿的問題?

這個方案留給大家去實現,只要掌握了Redis的分布式鎖,那這個實現起來就非常簡單了。

總結

搞定緩存擊穿、使用雙重檢查鎖的方式來解決,看到雙重檢查鎖,大家肯定第一印象就會想到單例模式,這里也算是給大家復習一把雙重檢查鎖的使用。

由于惡意攻擊導致的緩存擊穿,解決方案我們也實現了兩種,至少在工作和面試中,肯定是能應對了。

另外,使用鎖的時候注意鎖的力度,這里建議換成分布式鎖(Redis或者Zookeeper實現),因為我們既然引入緩存,大部分情況下都會是部署多個節點的,同時,引入分布式鎖了,我們就可以使用方法入參id用起來,這樣是不是更爽!

希望大家能領悟到的是文中的一些思路,并不是死記硬背技術。

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2020-12-21 09:00:04

MySQL緩存SQL

2020-12-21 09:44:53

MySQL查詢緩存數據庫

2019-10-28 08:44:29

Code Review代碼團隊

2020-07-21 18:37:14

代碼條件變量

2017-01-19 15:11:37

AndroidRetrofitRxCache

2021-02-03 08:24:32

JavaScript技巧經驗

2021-06-03 08:05:46

VSCode 代碼高亮原理前端

2022-07-04 07:09:55

架構

2021-07-12 10:37:42

Spring面試事務

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2022-03-03 07:00:43

Mybatiswhere標簽

2019-07-12 15:28:41

緩存數據庫瀏覽器

2018-09-02 15:43:56

Python代碼編程語言

2020-08-26 13:30:18

代碼設計模式前端

2022-04-24 16:00:15

LinuxLinux命令ls命令

2025-08-18 02:55:00

Spring數據庫容器

2011-09-15 17:10:41

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機制操作系統
點贊
收藏

51CTO技術棧公眾號

色呦呦在线资源| 国产精品久久久久久免费免熟| 欧洲亚洲成人| 欧美性猛交xxxx乱大交| 亚洲国产精品综合| 亚洲第一天堂影院| 久久一区视频| 欧美老女人性生活| 亚洲永久精品ww.7491进入| 国产亚洲欧美日韩精品一区二区三区| 亚洲另类春色国产| 欧美一区二区综合| 超碰福利在线观看| 日韩福利视频导航| 粉嫩av一区二区三区| 欧美激情综合在线| 波多野结衣久草一区| 无码日韩精品一区二区| 欧美日韩精品| 色偷偷偷亚洲综合网另类| 日本在线不卡一区二区| 四虎地址8848精品| 欧美日韩中文在线观看| 9色视频在线观看| 国产中文字幕在线播放| 成人动漫一区二区在线| 国产在线高清精品| 日本黄色中文字幕| 国产亚洲激情| 久久久免费精品视频| 亚洲综合视频网站| 国产麻豆一区二区三区精品视频| 精品国产精品网麻豆系列| av中文字幕网址| 婷婷综合六月| 狠狠操狠狠色综合网| 国产91沈先生在线播放| 黄色精品在线观看| 国产精品久久久久久亚洲毛片| 免费日韩av电影| 免费看国产片在线观看| 国产成人小视频| 成人有码视频在线播放| 伊人22222| 青青草国产成人av片免费| 欧美在线观看一区二区三区| 国产小视频在线观看免费| 亚洲国产精品成人| 久久国产精品99国产精| 91香蕉一区二区三区在线观看| 精品国产一区二区三区久久久樱花 | 先锋资源在线视频| 成人在线视频免费| 欧美性色综合网| 成人在线免费播放视频| 综合另类专区| 色综合久久久网| 日本一区二区黄色| 色吧亚洲日本| 色偷偷久久一区二区三区| 黄色片一级视频| 亚洲播播91| 欧美午夜电影网| 九九热精品在线播放| 涩涩涩久久久成人精品| 正在播放亚洲一区| wwwxxx色| 女人抽搐喷水高潮国产精品| 国产丝袜精品视频| 久久视频精品在线观看| 四季av一区二区三区免费观看| 日韩资源在线观看| 91精品国产高清一区二区三蜜臀| 欧美激情日韩| 97碰在线观看| 波多野结衣一区二区三区四区| 日韩激情视频在线观看| 国产精品无码专区在线观看| 国产精品久久久久久69| 国产精品系列在线观看| 国偷自产av一区二区三区小尤奈| 香蕉av在线播放| 高清久久一区| 国产喷白浆一区二区三区| 无码免费一区二区三区免费播放 | 精品国产一区二区三区噜噜噜 | 毛片在线网址| 色综合天天综合网国产成人综合天 | 国产精品综合久久久久久| 亚洲人在线观看视频| 国产日韩欧美亚洲| 小泽玛利亚av在线| 九色porny自拍视频在线观看| 欧美亚洲一区三区| 秋霞午夜鲁丝一区二区| 亚洲精品动态| 久久视频国产精品免费视频在线| 久青草免费视频| 日本亚洲三级在线| 成人免费在线一区二区三区| 久久久资源网| 亚洲一区二区三区自拍| 日韩av片在线看| 精品国产麻豆| 亚洲日本中文字幕免费在线不卡| 亚洲天堂黄色片| 国产视频久久| www日韩av| 成人免费在线视频网| 亚洲一区二区三区四区五区黄| 国产三级三级三级看三级| 网站一区二区| 北条麻妃久久精品| 9i精品福利一区二区三区| 国产精品123| 一区二区三区观看| 范冰冰一级做a爰片久久毛片| 日韩欧美激情四射| sm捆绑调教视频| 日韩电影免费一区| 国产最新精品免费| 97**国产露脸精品国产| 国产三级伦理片| 中文一区在线播放| 久久久久久久久久久视频| 国产区一区二| 久久精品视频免费播放| 最近日韩免费视频| 91毛片在线观看| 日韩精品 欧美| 97一区二区国产好的精华液| 欧美成年人视频网站| 中国老头性行为xxxx| 久久综合九色欧美综合狠狠| 999一区二区三区| 亚洲高清在线一区| 久久手机免费视频| 91麻豆成人精品国产| 国产日韩欧美综合在线| 激情五月开心婷婷| 日韩激情网站| 97热精品视频官网| 午夜av免费在线观看| 亚洲成人av在线电影| 亚洲成a人无码| 国户精品久久久久久久久久久不卡| 91免费高清视频| 九义人在线观看完整免费版电视剧| 欧美日韩专区在线| 成人性视频免费看| 久久国产精品99精品国产| 一本色道久久综合亚洲二区三区| 国外成人福利视频| 日韩性xxxx爱| www.爱爱.com| 亚洲午夜一区二区三区| 国产又粗又猛又色| а√天堂8资源在线官网| 视频一区二区不卡| 欧美日韩在线一二三| 二吊插入一穴一区二区| 在线观看视频亚洲| 91精品国产乱码久久| 亚洲欧美激情小说另类| 91人人澡人人爽| 国产主播精品| 欧美亚洲爱爱另类综合| 精品欧美日韩精品| 久久亚洲精品视频| 好吊色在线观看| 精品国产乱码久久久久久婷婷 | 国产蜜臀97一区二区三区 | 国产福利电影一区二区三区| 老司机午夜网站| 国内精品麻豆美女在线播放视频 | 黄色特一级视频| 欧美成人午夜77777| 日本精品久久久久久久| 98在线视频| 日韩一二在线观看| 国产又大又黑又粗免费视频| 国产三级一区二区三区| 91精品视频国产| av不卡在线看| 亚洲人成网站在线观看播放| 欧美特黄不卡| 日本伊人精品一区二区三区介绍| 午夜免费福利在线观看| 精品少妇一区二区三区在线视频| 在线观看免费av片| **欧美大码日韩| 亚洲精品乱码久久久久久久| 美女任你摸久久| 青青青青草视频| 四虎成人精品永久免费av九九| 国产福利一区二区三区在线观看| 日韩精品影院| 欧美精品久久久久久久免费观看 | 日本一区二区动态图| 国产精品嫩草影视| 亚洲永久字幕| 欧美国产视频一区| 久久精品国产68国产精品亚洲| 99久久无色码| 成人在线高清| 1769国内精品视频在线播放| 精品国产白色丝袜高跟鞋| 精品在线小视频| av在线免费在线观看| 在线看一区二区| 日本学生初尝黑人巨免费视频| 国产精品久久久久影院亚瑟| 无码人妻精品一区二区三应用大全| 久久国产日韩欧美精品| 精品中文字幕av| 国产精品v一区二区三区| 午夜精品电影在线观看| 久久悠悠精品综合网| 亚洲a在线播放| 成人影院在线免费观看| 国产精品9999| 日韩电影毛片| 韩国精品久久久999| 国产欧美黑人| 日韩在线视频免费观看| 免费在线视频你懂得| 亚洲大胆人体av| 精品人妻一区二区三区麻豆91| 欧美日韩国产精选| 中文字幕精品在线观看| 欧美天堂在线观看| 日韩欧美大片在线观看| 亚洲午夜电影在线观看| 九九在线观看视频| 亚洲免费高清视频在线| 无码人妻精品中文字幕| 国产女人aaa级久久久级| 在线不卡av电影| 久久婷婷一区二区三区| 国产精品久久AV无码| 成人免费黄色大片| 亚洲图片欧美另类| 丁香网亚洲国际| 国产国语老龄妇女a片| 国产成人8x视频一区二区 | 综合激情久久| 2019国产精品视频| 欧美区一区二区| 99国产视频| 风间由美性色一区二区三区四区 | 国产精品美女视频| 亚欧洲乱码视频| 久久夜色精品国产噜噜av| 成人手机在线免费视频| 99re66热这里只有精品3直播 | 色诱视频在线观看| 日韩福利视频导航| 视频在线观看免费高清| 久久国产精品色| 国产欧美精品一二三| 国产毛片一区二区| 特级特黄刘亦菲aaa级| 国产精品1区2区3区在线观看| 国产精品日日摸夜夜爽| 成人av网站大全| 一卡二卡三卡四卡| 久久久久久久久久久久久久久99| 美国黄色a级片| 国产情人综合久久777777| 亚洲天堂精品一区| 国产日韩欧美在线一区| 91精品国产闺蜜国产在线闺蜜| 亚洲精品国产一区二区三区四区在线| 久久久久亚洲av成人片| 亚洲成人7777| 免费在线不卡av| 欧美一区二区三区成人| 秋霞av鲁丝片一区二区| 亚洲美女免费精品视频在线观看| 成人免费视频| 欧美国产日韩在线| 欧美精品日日操| 91九色在线视频| 久久影院资源站| 亚洲黄色一区二区三区| 欧美日本一区| 精品国产成人av在线免| 经典三级在线一区| 中国av免费看| 亚洲色图欧洲色图婷婷| 日韩三级小视频| 欧美撒尿777hd撒尿| 刘亦菲毛片一区二区三区| 亚洲天堂av在线免费| 污污在线观看| 欧洲成人在线观看| 久久精品九色| 欧美专区一二三| 欧美日韩一区自拍 | 国产精品自拍网站| 性少妇bbw张开| 夜夜揉揉日日人人青青一国产精品| 国产又大又黄又粗| 日韩免费高清av| 在线观看美女网站大全免费| 高清欧美性猛交xxxx| 日本一区二区中文字幕| 久久久国产精品一区二区三区| 久久视频在线| 日韩视频在线免费看| 国产成人综合网站| 日韩av毛片在线观看| 欧美性猛交xxxx久久久| 成人福利小视频| 日韩精品成人一区二区三区| 久久久久福利视频| 蜜桃视频在线观看一区| 老熟妇精品一区二区三区| 亚洲天堂av老司机| 久久这里只有精品9| 日韩精品高清视频| 久草在线视频福利| 成人h视频在线观看播放| 亚洲区小说区| 青青青免费在线| www.欧美.com| 久久综合加勒比| 精品日韩欧美在线| 国产秀色在线www免费观看| 国产精品成久久久久三级| 久久黄色影视| 草b视频在线观看| 国产成人av福利| 国产大片免费看| 在线不卡一区二区| 黄网站视频在线观看| 国产精品久久久久免费a∨| 国产成人短视频在线观看| 美女av免费在线观看| 久久综合av免费| 手机看片久久久| 日韩第一页在线| 电影在线观看一区| 精品蜜桃传媒| 国产农村妇女精品一二区| www.88av| 福利视频第一区| 日色在线视频| 国产精品白嫩美女在线观看| 国产一区二区精品福利地址| 91最新在线观看| 中文字幕一区二区不卡| 91黄色在线视频| 九九视频这里只有精品| 日韩三级网址| 欧美精品卡一卡二| 91视频免费观看| 无码人妻精品一区二区三区不卡| 亚洲免费电影一区| 色猫猫成人app| 国产对白在线播放| 国产精品18久久久久| 国产无码精品久久久| 日韩黄在线观看| 中文字幕系列一区| 男女爱爱视频网站| 成人高清视频免费观看| 成人欧美一区二区| 图片区亚洲欧美小说区| 伊人五月天婷婷| 午夜精品久久久久久不卡8050| 四虎精品成人免费网站| 国产精品久久久久av免费| 久久久9色精品国产一区二区三区| 国产乱女淫av麻豆国产| 亚洲一级片在线观看| 青青草免费在线| 国产日韩欧美在线观看| 欧美99在线视频观看| 第四色在线视频| 欧美日韩免费观看一区二区三区 | 欧美丰满少妇xxxxx做受| 精品国产乱子伦一区二区| 欧美黄色免费影院| 国产精品美女www爽爽爽| 亚洲av无码片一区二区三区| 欧美在线一区二区视频| 97色伦图片97综合影院| 亚洲av成人片无码| 欧美亚洲高清一区二区三区不卡| 在线观看操人| 日韩在线导航| 成人综合在线网站| 中文字幕天堂在线| 欧美激情综合色| 忘忧草精品久久久久久久高清| 亚洲男人天堂色| 亚洲国产精品久久久久婷婷884| 国产精品久久一区二区三区不卡| 超碰97人人在线|