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

緩存穿透的解決方式?—布隆過濾器

開發(fā) 開發(fā)工具
對于過濾器緩存的使用,大部分情景都是讀多寫少的,而重復(fù)插入并沒有什么意義,布谷鳥過濾器的刪除雖然不完美但總好過沒有(因?yàn)椴悸∵^濾器想要?jiǎng)h除元素便需要重建,上億甚至幾十億的數(shù)據(jù)重建緩存也蠻花時(shí)間),同時(shí)還有更優(yōu)的查詢和存儲效率,應(yīng)該說在絕大多數(shù)情況下其都是一個(gè)性價(jià)比更高的選擇。?

簡要回答

緩存穿透(cache penetration)是用戶訪問的數(shù)據(jù)既不在緩存當(dāng)中,也不在數(shù)據(jù)庫中。出于容錯(cuò)的考慮,如果從底層數(shù)據(jù)庫查詢不到數(shù)據(jù),則不寫入緩存。這就導(dǎo)致每次請求都會到底層數(shù)據(jù)庫進(jìn)行查詢,緩存也失去了意義。當(dāng)高并發(fā)或有人利用不存在的Key頻繁攻擊時(shí),數(shù)據(jù)庫的壓力驟增,甚至崩潰,這就是緩存穿透問題。

緩存穿透與緩存擊穿同樣非常相似,區(qū)別點(diǎn)在于緩存穿透的實(shí)際請求數(shù)據(jù)在數(shù)據(jù)庫中也沒有,而緩存擊穿是僅僅在緩存中沒命中,但是在數(shù)據(jù)庫中其實(shí)是存在對應(yīng)數(shù)據(jù)的。

圖片圖片

發(fā)生場景:

  • 原來數(shù)據(jù)是存在的,但由于某些原因(誤刪除、主動清理等)在緩存和數(shù)據(jù)庫層面被刪除了,但前端或前置的應(yīng)用程序依舊保有這些數(shù)據(jù);
  • 黑客惡意攻擊,外部爬蟲,故意大量訪問某些讀取不存在數(shù)據(jù)的業(yè)務(wù);

緩存穿透解決方案:

  1. 緩存空值(null)或默認(rèn)值
  • 分析業(yè)務(wù)請求,如果是正常業(yè)務(wù)請求時(shí)發(fā)生緩存穿透現(xiàn)象,可針對相應(yīng)的業(yè)務(wù)數(shù)據(jù),在數(shù)據(jù)庫查詢不存在時(shí),將其緩存為空值(null)或默認(rèn)值,但是需要注意的是,針對空值的緩存失效時(shí)間不宜過長,一般設(shè)置為5分鐘之內(nèi)。當(dāng)數(shù)據(jù)庫被寫入或更新該key的新數(shù)據(jù)時(shí),緩存必須同時(shí)被刷新,避免數(shù)據(jù)不一致。

圖片圖片

  1. 業(yè)務(wù)邏輯前置校驗(yàn)
  • 在業(yè)務(wù)請求的入口處進(jìn)行數(shù)據(jù)合法性校驗(yàn),檢查請求參數(shù)是否合理、是否包含非法值、是否惡意請求等,提前有效阻斷非法請求。比如,根據(jù)年齡查詢時(shí),請求的年齡為-10歲,這顯然是不合法的請求參數(shù),直接在參數(shù)校驗(yàn)時(shí)進(jìn)行判斷返回。

  1. 使用布隆過濾器快速判斷數(shù)據(jù)不存在(推薦)

  • 在寫入數(shù)據(jù)時(shí),使用布隆過濾器進(jìn)行標(biāo)記(相當(dāng)于設(shè)置白名單),業(yè)務(wù)請求發(fā)現(xiàn)緩存中無對應(yīng)數(shù)據(jù)時(shí),可先通過查詢布隆過濾器判斷數(shù)據(jù)是否在白名單內(nèi)(布隆過濾器可以判斷數(shù)據(jù)一定不存在),如果不在白名單內(nèi),則直接返回空或失敗。

  1. 用戶黑名單限制:當(dāng)發(fā)生異常情況時(shí),實(shí)時(shí)監(jiān)控訪問的對象和數(shù)據(jù),分析用戶行為,針對故意請求、爬蟲或攻擊者,進(jìn)行特定用戶的限制;

  2. 添加反爬策略:比如添加請求簽名校驗(yàn)機(jī)制、比如添加IP訪問限制策略等等

接下來本文會詳細(xì)介紹一下布隆過濾器及其使用場景

擴(kuò)展-布隆過濾器

概述

布隆過濾器是由布隆(Burton Howard Bloom)在1970年提出的 一種緊湊型的、比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu),特點(diǎn)是高效地插入和查詢,查詢時(shí)可以用來判斷 “一定不存在或者可能存在”,它是用多個(gè)哈希函數(shù),將一個(gè)數(shù)據(jù)映射到位圖結(jié)構(gòu)中。

原理

當(dāng)一個(gè)元素被加入集合時(shí),通過 K 個(gè)散列函數(shù)將這個(gè)元素映射成一個(gè)位圖中的 K 個(gè)位置,把它們置為 1。查詢時(shí),只要查看這些位置是不是都是 1 ,就知道集合中有沒有它了:如果這些位置有任何一個(gè) 0,則被查詢元素一定不存在;如果都是 1,則被查詢元素很可能存在。

簡單來說就是將一個(gè)長度為 m 的位數(shù)組的所有元素初始化為 0,用 k 個(gè)散列函數(shù)對元素進(jìn)行 k 次散列運(yùn)算跟 len (m) 取余得到 k 個(gè)位置并將 m 中對應(yīng)位置設(shè)置為 1。

圖片圖片

如上圖,位數(shù)組的長度是8,散列函數(shù)個(gè)數(shù)是 3,兩個(gè)元素x,y。這兩個(gè)元素都經(jīng)過三次哈希函數(shù)生成三個(gè)哈希值,并映射到位數(shù)組的不同的位置,并置為1。元素 x 映射到位數(shù)組的第0位,第4位,第7位,元素y映射到數(shù)組的位數(shù)組的第1位,第4位,第6位。

當(dāng)布隆過濾器保存的元素越多,被置為 1 的 bit 位也會越來越多,元素 z 即便沒有存儲過,假設(shè)哈希函數(shù)將z映射到位數(shù)組的三個(gè)位都被其他值設(shè)置為 1 了,對于布隆過濾器的機(jī)制來講,元素 z 這個(gè)值也是存在的,也就是說布隆過濾器存在一定的誤判率。因此布隆過濾器只能保證一定不存在和可能存在。

誤判率

布隆過濾器包含如下四個(gè)屬性:

  • k : 哈希函數(shù)個(gè)數(shù)
  • m : 位數(shù)組長度
  • n : 插入的元素個(gè)數(shù)
  • p : 誤判率

若位數(shù)組長度太小則會導(dǎo)致所有 bit 位很快都會被置為 1 ,那么檢索任意值都會返回“可能存在” , 起不到過濾的效果。位數(shù)組長度越大,則誤判率越小。同時(shí),哈希函數(shù)的個(gè)數(shù)也需要考量,哈希函數(shù)的個(gè)數(shù)越大,檢索的速度會越慢,誤判率也越小,反之,則誤判率越高。

為什么就用一個(gè)hash函數(shù)不行?

其實(shí)布隆過濾器底層是用 位圖 實(shí)現(xiàn)的,而多個(gè)hash函數(shù)就是為了減少位圖的誤判率的。具體可往下看

假設(shè)布隆過濾器中的hash函數(shù)滿足simple uniform hashing假設(shè):每個(gè)元素都等概率地hash到m個(gè)位中的任何一個(gè),與其它元素被hash到哪個(gè)位無關(guān)。那么

顯然,當(dāng)m越大,n減少時(shí),誤判率就越低。并且當(dāng)k越大,誤判率p也就越小,也就是說,hash函數(shù)越多,誤判率越低,但相對檢索的速度會越慢。

如圖:相同位數(shù)組長度的情況下,隨著哈希函數(shù)的個(gè)數(shù)的增長,誤判率顯著的下降。

圖片圖片

布隆過濾器的效率和缺點(diǎn)

布隆過濾器的空間復(fù)雜度為 O(m) ,插入和查詢時(shí)間復(fù)雜度都是 O(k) 。 存儲空間和插入、查詢時(shí)間都不會隨元素增加而增大。 空間、時(shí)間效率都很高。

但是布隆過濾器并不支持刪除元素,因?yàn)槎鄠€(gè)元素可能哈希到一個(gè)布隆過濾器的同一個(gè)位置,如果直接刪除該位置的元素,則會影響其他元素的判斷。因此,就提出了 計(jì)數(shù)布隆過濾器

計(jì)數(shù)布隆過濾器

計(jì)數(shù)過濾器(Counting Bloom Filter)是布隆過濾器的擴(kuò)展,標(biāo)準(zhǔn) Bloom Filter 位數(shù)組的每一位擴(kuò)展為一個(gè)小的計(jì)數(shù)器(Counter),在插入元素時(shí)給對應(yīng)的 k (k 為哈希函數(shù)個(gè)數(shù))個(gè) Counter 的值分別加 1,刪除元素時(shí)給對應(yīng)的 k 個(gè) Counter 的值分別減 1。

圖片圖片

顯然,又引入了另一個(gè)問題:更多的資源占用,而且在很多時(shí)候會造成極大的空間浪費(fèi)

使用場景

Redis的緩存穿透

對于一個(gè)數(shù)據(jù)查詢,其過程大致如下:

圖片圖片

但是當(dāng)查詢的數(shù)據(jù)既不在緩存中,也不存在數(shù)據(jù)庫中,則沒有辦法回寫緩存,當(dāng)有類似這樣大量的請求訪問服務(wù)時(shí),數(shù)據(jù)庫的壓力就會極大。這就是緩存穿透

因此,引入布隆過濾器,當(dāng)用戶請求時(shí),判斷過濾器中是否存在該元素,若不存在該元素,則直接返回不存在。若包含則從緩存中查詢數(shù)據(jù),若緩存中也沒有,則查詢數(shù)據(jù)庫并回寫到緩存里,最后給前端返回。

圖片圖片

盡管布隆過濾器有少量的誤判,即可能不存在的數(shù)據(jù)會判定存在,從而繼續(xù)查詢緩存和數(shù)據(jù)庫,但只要將m和k的值設(shè)置相對理想,少量的不存在查詢也是可以接受的。

元素刪除場景

實(shí)際上,元素不僅僅是只有增加,還存在刪除元素的場景,比如說商品的刪除,刪除后數(shù)據(jù)其實(shí)已經(jīng)不存在了,但是布隆過濾器中還沒刪除,則會判定其存在。

第一種方案就是使用計(jì)數(shù)布隆過濾器。

第二種方案,則是通過 定時(shí)重新構(gòu)建布隆過濾器

圖片圖片

  1. 定時(shí)任務(wù)觸發(fā)全量商品查詢,更新數(shù)據(jù);
  2. 將商品添加到新的布隆過濾器 ;
  3. 修改商品布隆過濾器的映射(從舊 A 修改成 新 B );
  4. 商品服務(wù)根據(jù)布隆過濾器的映射,選擇新的布隆過濾器 B進(jìn)行相關(guān)的查詢操作 ;
  5. 選擇合適的時(shí)間點(diǎn),刪除舊的布隆過濾器 A。

在刪除商品 到 使用新的布隆過濾器B 之間的這段時(shí)間的不存在的查詢有可能還會到數(shù)據(jù)庫層面,但這種少量的不存在查詢也是可以接受的。

應(yīng)用布隆過濾器

Redisson

Redisson 提供了操作布隆過濾器的簡單易用 API,以下是使用布隆過濾器的示例:

  • 引入依賴
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.37.0</version>
</dependency>
  • 使用示例
private void redisson() {
    RedissonClient redissonClient = Redisson.create();

    RBloomFilter < Object > bloomFilter = redissonClient.getBloomFilter("bloomFilter");
    // 初始化大小為 10億,假陽率為 0.001(在使用布隆過濾器之前,必須完成初始化操作)
    bloomFilter.tryInit(1000000000, 0.001);

    Object object = new Object();
    // 添加元素
    bloomFilter.add(object);

    // 檢查元素是否存在
    boolean exist = bloomFilter.contains(object);
}

Guava

Guava 也提供了 BloomFilter 實(shí)現(xiàn),用于高效地判斷一個(gè)元素是否存在于集合中,在 23.0 及之后版本中,是線程安全的。以下是 Guava 中布隆過濾器使用示例:

  • 引入依賴
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <!-- 請根據(jù)需要選擇合適的版本 -->
    <version>33.3.1-jre</version>
</dependency>
  • 使用示例
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class BloomFilterExample {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)布隆過濾器,預(yù)計(jì)插入 3000000 個(gè)整數(shù),假陽率為0.01
        BloomFilter < Integer > bloomFilter = BloomFilter.create(
            Funnels.integerFunnel(), 3000000, 0.01);

        // 向布隆過濾器中添加元素
        for (int i = 0; i < 3000000; i++) {
            bloomFilter.put(i);
        }

        // 測試布隆過濾器
        for (int i = 0; i < 3001000; i++) {
            if (bloomFilter.mightContain(i)) {
                System.out.println(i + " might be in the filter.");
            } else {
                System.out.println(i + " is definitely not in the filter.");
            }
        }
    }
}

布隆過濾器總結(jié)

布隆過濾器的空間效率O(m) 和查詢時(shí)間O(k) 都很優(yōu)秀,但是存在一定的誤判率 (布隆過濾器認(rèn)為不存在,則一定不存在;布隆過濾器認(rèn)為存在,則只是可能存在)

bit數(shù)組的位數(shù)m越大,hash函數(shù)的個(gè)數(shù)k越多,誤判率就越低。但也需要控制合適的大小,比如m越大,但存儲的數(shù)據(jù)少,則會引起空間浪費(fèi),k的個(gè)數(shù)越多,則會一定程度降低查存效率

普通布隆過濾器無法刪除元素,但可以通過計(jì)數(shù)布隆過濾器和定時(shí)重新構(gòu)建布隆過濾器兩種方案實(shí)現(xiàn)刪除元素的效果。

拓展:布谷鳥過濾器

布隆過濾器不記錄元素本身,并且存在一個(gè)位被多個(gè)元素共用的情況,所以它不支持刪除元素。布谷鳥過濾器(詳細(xì)了解可以參考這篇論文《布谷鳥過濾器:實(shí)際上優(yōu)于布隆過濾器》)的提出解決了這個(gè)問題,它支持刪除操作,此外它還帶來了其他優(yōu)勢:

  1. 查找性能更高:布隆過濾器要采用多種哈希函數(shù)進(jìn)行多次哈希,而布谷鳥過濾器只需一次哈希
  2. 節(jié)省更多空間:布谷鳥過濾器記錄元素更加緊湊,論文中提到,如果期望誤報(bào)率在 3% 以下,半排序桶布谷鳥過濾器每個(gè)元素所占用的空間要比布隆過濾器中單個(gè)元素占用空間要小

布谷鳥過濾器之所以被稱為“布谷鳥”,是因?yàn)樗墓ぷ髟眍愃朴诓脊萨B在自然界中的行為。布谷鳥以將自己的蛋產(chǎn)在其他鳥類的巢中而聞名,這樣一來,寄主鳥就會撫養(yǎng)布谷鳥的幼鳥。在布谷鳥過濾器中,如果一個(gè)位置已經(jīng)被占用,新元素會“驅(qū)逐”現(xiàn)有元素,將其移到其他位置。這種“驅(qū)逐”行為類似于布谷鳥將其他鳥蛋推出巢外,以便安置自己的蛋。因此,這種過濾器得名為“布谷鳥”過濾器。

布谷鳥過濾器本質(zhì)上是一個(gè) 桶數(shù)組,每個(gè)桶中保存若干數(shù)量的 指紋(指紋由元素的部分 Hash 值計(jì)算出來)。定義一個(gè)布谷鳥過濾器,每個(gè)桶記錄 2 個(gè)指紋,5 號桶和 11 號桶分別記錄保存 a, b 和 c, d 元素的指紋,如下所示:

圖片圖片

此時(shí),向其中插入新的元素 e,發(fā)現(xiàn)它被哈希到的兩個(gè)候選桶分別為 5 號 和 11 號,但是這兩個(gè)桶中的元素已經(jīng)添加滿了:

圖片圖片

按照布谷鳥過濾器的特性,它會將其中的一個(gè)元素重哈希到其他的桶中(具體選擇哪個(gè)元素,由具體的算法指定),新元素占據(jù)該元素的位置,如下:

圖片圖片

以上便是向布谷鳥過濾器中添加元素并發(fā)生沖突時(shí)的操作流程,在我們的例子中,重新放置元素 e 觸發(fā)了另一個(gè)重置,將現(xiàn)有的項(xiàng) a 從桶 5 踢到桶 15。這個(gè)過程可能會重復(fù),直到找到一個(gè)能容納元素的桶,這就使得布谷鳥哈希表更加緊湊,因此可以更加節(jié)省空間。如果沒有找到空桶則認(rèn)為此哈希表太滿,無法插入。雖然布谷鳥哈希可能執(zhí)行一系列重置,但其均攤插入時(shí)間為 **O(1)**。

與布隆過濾器一樣,布谷鳥過濾器同樣會造成假陽性,造成假陽性的有以下原因:

  1. 有限的空間:布谷鳥過濾器使用有限數(shù)量的桶和每個(gè)桶中的有限空間來存儲元素的指紋。當(dāng)多個(gè)元素的指紋映射到相同的桶時(shí),可能會導(dǎo)致不同元素的指紋存儲在同一位置
  2. 指紋沖突:由于指紋是元素的哈希值的縮減版本,可能會有不同的元素產(chǎn)生相同的指紋。當(dāng)查詢一個(gè)不存在的元素時(shí),可能會發(fā)現(xiàn)其指紋已經(jīng)存在于過濾器中,從而導(dǎo)致假陽性
  3. 哈希函數(shù)的性質(zhì):哈希函數(shù)的選擇和指紋長度決定了指紋的唯一性和沖突概率。較短的指紋更容易產(chǎn)生沖突,從而增加假陽性的概率
  4. 負(fù)載因子:隨著過濾器接近滿載,沖突的概率增加,這會導(dǎo)致更多的“驅(qū)逐”操作。在高負(fù)載情況下,假陽性率也可能上升

cuckoofilter 是 Github 上 Star 數(shù)較多的一個(gè)倉庫,它參考了論文內(nèi)容,并用 Golang 實(shí)現(xiàn)了布谷鳥過濾器,大家感興趣的話可以直接去參考它的源碼。該過濾器重要的參數(shù)如下:

  1. 每個(gè)元素有 2 個(gè)候選桶,每個(gè)桶記錄 4 個(gè)指紋:該配置能夠使桶的利用率達(dá)到 95%,能夠滿足多數(shù)場景,當(dāng)指定假陽性率在 0.00001 和 0.002 之間時(shí),可以將每個(gè)元素占用空間最小化
  2. 指紋的靜態(tài)大小為 8 位:指定誤報(bào)率為 0.03,根據(jù)公式 f >= log2(2b/r) b為桶的大小 r為誤報(bào)率,計(jì)算出指紋大小為 8。在 2 個(gè)候選桶和 4 個(gè)指紋的配置下,隨著指紋大小變大,空間利用率不會再隨之增加,僅降低假陽率

我們在此討論下它的刪除方法實(shí)現(xiàn):

// Delete 刪除過濾器中的指紋
func (cf *Filter) Delete(data []byte) bool {
  // 嘗試在首選桶中刪除
  i1, fp := getIndexAndFingerprint(data, cf.bucketPow)
  if cf.delete(fp, i1) {
    return true
  }
  // 刪除失敗,則嘗試從備用桶刪除
  i2 := getAltIndex(fp, i1, cf.bucketPow)
  return cf.delete(fp, i2)
}

它的刪除方法實(shí)現(xiàn)比較簡單:它檢查給定元素的兩個(gè)候選桶,如果在首選桶中匹配到則將該指紋移除,否則去備用桶中匹配,在備用桶中則移除備用桶指紋,如果備用桶中沒有,則會提示刪除失敗。如果兩個(gè)元素 a, b 發(fā)生碰撞(共享桶和指紋),那么在 a 元素刪除后,因?yàn)?b 元素的存在,仍然會判斷 a 元素在過濾器中,表現(xiàn)出假陽性。需要注意的是,想要安全的刪除某元素,必須事先插入它,否則刪除插入項(xiàng)可能會無意中刪除共享指紋的真實(shí)存在的項(xiàng),而且如果多次插入重復(fù)元素,想要將其刪除干凈還需要知道該元素插入了多少次。

此外,相比于布隆過濾器它也存在一些的劣勢:

  1. 插入性能可能會受到影響:隨著插入元素越多,空間利用率不斷提高,發(fā)生沖突的可能性越大,發(fā)生沖突之后,可能會不斷的觸發(fā)元素的重定位,插入性能會變差,一般通過最大重試次數(shù)來限制
  2. 插入重復(fù)元素次數(shù)存在上限:布隆過濾器插入重復(fù)元素沒有負(fù)面影響,只是再標(biāo)記相同的位,而布谷鳥過濾器插入重復(fù)元素會觸發(fā)元素的重定位,因此它的重復(fù)元素插入存在上限

對于過濾器緩存的使用,大部分情景都是讀多寫少的,而重復(fù)插入并沒有什么意義,布谷鳥過濾器的刪除雖然不完美但總好過沒有(因?yàn)椴悸∵^濾器想要?jiǎng)h除元素便需要重建,上億甚至幾十億的數(shù)據(jù)重建緩存也蠻花時(shí)間),同時(shí)還有更優(yōu)的查詢和存儲效率,應(yīng)該說在絕大多數(shù)情況下其都是一個(gè)性價(jià)比更高的選擇。

責(zé)任編輯:武曉燕 來源: seven97
相關(guān)推薦

2024-01-05 09:04:35

隆過濾器數(shù)據(jù)結(jié)構(gòu)哈希函數(shù)

2023-04-26 08:32:45

Redis布隆過濾器

2019-03-22 15:15:25

Redis緩存擊穿雪崩效應(yīng)

2024-03-15 11:21:22

布隆過濾器數(shù)據(jù)庫數(shù)據(jù)

2024-11-04 08:45:48

布隆過濾器元數(shù)據(jù)指紋值

2024-09-18 10:08:37

2025-02-08 17:30:00

布隆過濾器數(shù)據(jù)結(jié)構(gòu)

2020-10-29 07:16:26

布隆過濾器場景

2021-01-11 08:34:16

緩存穿透QPS

2023-01-31 08:19:53

二進(jìn)制元素數(shù)量

2025-01-23 00:00:00

Java布隆過濾器

2022-03-21 08:31:07

布隆過濾器Redis過濾器原理

2021-09-03 06:33:24

布隆過濾器高并發(fā)

2025-01-22 00:00:00

布隆過濾器二進(jìn)制

2024-09-25 17:44:08

2024-10-09 15:54:38

布隆過濾器函數(shù)

2023-10-30 10:40:29

檢查用戶app注冊數(shù)據(jù)庫

2021-03-06 14:41:07

布隆過濾器算法

2023-07-06 10:15:38

布隆過濾器優(yōu)化

2020-08-28 13:02:17

布隆過濾器算法
點(diǎn)贊
收藏

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

www.日本在线播放| 亚洲一区二区三区毛片| 欧美黑人激情| 日本韩国在线视频爽| 日韩电影一区二区三区| 久久综合免费视频影院| 制服丝袜在线第一页| 欧美xxxxxx| 亚洲伦在线观看| 欧美激情专区| 亚洲av无码国产精品永久一区| 在线一区视频| 久久天天躁狠狠躁夜夜av| 精品影片一区二区入口| 日韩黄色碟片| 日韩欧美综合在线视频| 日本xxxxx18| 精品999视频| 国产99久久久久| 国产剧情久久久久久| 日韩xxxxxxxxx| 欧美 日韩 国产 一区| 国产亚洲一区二区在线| 久久福利小视频| 亚洲一区二区av| 色综合天天综合在线视频| youjizz.com在线观看| 日本视频在线免费观看| 久久美女艺术照精彩视频福利播放| 91亚洲精品在线观看| 91久久国产综合久久91| 亚洲国产专区| 欧美裸身视频免费观看| 日本 欧美 国产| 欧美人妖在线| 日韩美女av在线| 国产+高潮+白浆+无码| 欧美黄视频在线观看| 欧美日韩的一区二区| 日本三区在线观看| 天堂中文在线播放| 欧美日韩国产中文字幕| 欧美成人精品免费| 女同一区二区免费aⅴ| 亚洲精品国产精华液| 中文字幕在线亚洲精品 | 日韩激情中文字幕| 91wwwcom在线观看| 日韩成人免费在线观看| 国一区二区在线观看| 久久成人免费视频| 中文字幕在线2021| 亚洲欧美综合国产精品一区| 欧美成人精品xxx| 日本一二三区在线观看| 天天综合精品| 久久夜色精品国产欧美乱| 五月综合色婷婷| 亚洲九九在线| 欧美国产精品日韩| 精品无码久久久久久久| 亚洲国产精品第一区二区| 国内久久久精品| 黄色片视频网站| 亚洲综合激情| 国产精品v片在线观看不卡| 波多野结衣黄色| 乱一区二区av| 91久色国产| 韩国av永久免费| 91蝌蚪国产九色| 日韩免费av一区二区三区| 一广人看www在线观看免费视频| 国产精品午夜免费| 奇米777四色影视在线看| 丁香花在线高清完整版视频| 欧美日韩在线视频观看| 天天爽人人爽夜夜爽| **日韩最新| 亚洲国产精品久久久久秋霞不卡| 国产成人精品无码片区在线| 欧美精品一区二区久久| 久久精品最新地址| 国产污视频在线观看| 日韩高清在线观看| 亚洲xxxx18| 秋霞av鲁丝片一区二区| 久久久久88色偷偷免费| 日本视频一区二区不卡| 99在线播放| 欧美性猛交xxxx富婆弯腰| 911福利视频| 欧美三级午夜理伦三级在线观看 | 欧美一a一片一级一片| 深夜做爰性大片蜜桃| 蜜臀av一区| 日韩在线播放视频| 亚洲天堂av片| 国产一区二区按摩在线观看| 美乳视频一区二区| 麻豆传媒视频在线观看| 狠狠综合久久av一区二区小说 | 懂色av中文一区二区三区| 欧美精品在线一区| 一区二区三区伦理| 在线观看av一区| 男人女人拔萝卜视频| 国产欧美亚洲精品a| 色综合久久久888| 中文字幕人成人乱码亚洲电影 | 高清国产在线观看| 国内综合精品午夜久久资源| 国产区精品视频| 欧美91精品久久久久国产性生爱| 亚洲乱码中文字幕综合| 黄色三级视频在线| 天美av一区二区三区久久| 久久影院在线观看| 一道本在线视频| 久久婷婷国产综合国色天香| 国产一区二区四区| 国产精品久久久久久久久久辛辛 | 亚洲精品白浆高清久久久久久| 亚洲色图日韩精品| 丝袜亚洲另类欧美| 精品视频一区二区| 丁香高清在线观看完整电影视频| 欧美绝品在线观看成人午夜影视| 日本xxxxxxxxx18| 国产一区二区你懂的| 国产成人免费电影| 日韩三级免费| 欧美一区午夜精品| 亚洲一区电影在线观看| 日韩国产欧美一区二区三区| 蜜桃狠狠色伊人亚洲综合网站| av电影在线地址| 日韩精品一区二区三区视频| 91高清免费看| 国产一区二区三区在线观看免费 | 日本高清视频在线播放| 欧美亚洲一区二区在线观看| 在线小视频你懂的| 日韩精品高清不卡| 日本一区二区三区四区高清视频| 美脚恋feet久草欧美| 亚洲精品一区中文字幕乱码| 亚洲视频 欧美视频| 久久九九久久九九| 成人一区二区三| 国产亚洲电影| 国产精品女人网站| 麻豆av在线免费看| 91精品国产综合久久久久久久 | 国产一区电影| 欧美色电影在线| 777777国产7777777| 国产精品自拍毛片| 日本男女交配视频| 欧美精品国产白浆久久久久| 欧美一区亚洲一区| 成人三级黄色免费网站| 欧美日韩国产经典色站一区二区三区| 后入内射无码人妻一区| 国产激情一区二区三区四区 | 疯狂试爱三2浴室激情视频| 国产精品自拍毛片| 黄色一级视频在线播放| 美日韩中文字幕| 成人国产在线激情| 免费毛片在线看片免费丝瓜视频| 日韩精品免费电影| 中文字幕在线观看第二页| 亚洲欧美激情视频在线观看一区二区三区| 免费高清视频在线观看| 99精品免费视频| 亚洲v国产v在线观看| 国产一区二区久久久久| 97国产在线视频| 成人在线高清视频| 日韩美女主播在线视频一区二区三区| 四虎永久在线精品| 亚洲国产经典视频| 岛国av免费观看| 日本亚洲欧美天堂免费| 黄色影视在线观看| 国产一区二区三区电影在线观看| 成人亚洲激情网| 忘忧草在线日韩www影院| 在线看福利67194| 亚洲乱码精品久久久久..| 色综合久久久久久久| 男女做暖暖视频| 久久这里都是精品| 亚洲一级片免费观看| 久久天堂精品| www.男人天堂网| 欧洲杯半决赛直播| 国产一区在线观| 日韩欧国产精品一区综合无码| 午夜精品久久久久久99热| 午夜视频在线看| 日韩精品视频在线播放| 99久久99久久久精品棕色圆| 欧美天堂在线观看| 久久久久99精品| 国产精品免费观看视频| 91精品人妻一区二区| 国产精品羞羞答答xxdd| 视色视频在线观看| 国产日韩专区| 黄色一级片国产| 天天操夜夜操国产精品| 日本一区二区精品视频| 农村少妇一区二区三区四区五区| 亚洲一区二区久久久久久久| 日本精品在线一区| 2020欧美日韩在线视频| 日韩av官网| 日韩一级黄色av| 岛国在线视频免费看| 日韩成人av在线| 成人久久久精品国产乱码一区二区| 欧美日韩美少妇| 欧美日韩在线视频播放| 色综合一个色综合亚洲| 国产尤物在线视频| 亚洲成人激情自拍| 亚洲精品午夜久久久久久久| 伊人色综合久久天天人手人婷| 亚洲女同二女同志奶水| 国产日韩欧美a| wwwwww日本| 久久综合色8888| www.17c.com喷水少妇| 不卡电影一区二区三区| 蜜臀aⅴ国产精品久久久国产老师| 韩国三级中文字幕hd久久精品| av污在线观看| 日韩av中文在线观看| 熟女少妇精品一区二区| 日韩av不卡在线观看| 婷婷丁香激情网| 美女精品一区二区| 五月天激情视频在线观看| 日本欧美一区二区在线观看| 午夜欧美福利视频| 强制捆绑调教一区二区| mm131国产精品| 激情综合网激情| 国产黑丝在线视频| 丰满亚洲少妇av| 日本xxxx裸体xxxx| 久久久国际精品| 99久久精品免费视频| 国产精品色婷婷久久58| 999精品视频在线观看播放 | 国产成人精品一区二三区| 欧美日韩国产一区二区| 免费视频网站在线观看入口| 欧美日韩在线三级| 国产露脸91国语对白| 欧美va在线播放| 天堂91在线| 尤物九九久久国产精品的分类| 99riav在线| 欧美巨大黑人极品精男| 国产白浆在线免费观看| 日韩免费观看av| 国产日韩欧美中文在线| 国内成+人亚洲| 欧美亚洲在线日韩| 午夜久久久久久久久久久| 亚洲人体偷拍| 天天爽天天爽夜夜爽| 国产精选一区二区三区| 在线免费观看污视频| 日本一区二区不卡视频| 国产在线观看免费av| 色av一区二区| 国产高潮流白浆喷水视频| 亚洲国产天堂久久综合| sese在线视频| 久久久久久欧美| 日本综合视频| 粉嫩av免费一区二区三区| 天天躁日日躁狠狠躁欧美巨大小说| 日韩理论片在线观看| 欧美日本三区| 亚洲成人av免费看| 国产91高潮流白浆在线麻豆 | 成人福利在线观看| 麻豆成人入口| 国产又黄又爽免费视频| 免费久久99精品国产自在现线| 久久婷婷中文字幕| 久久先锋影音av鲁色资源网| 欧美丰满艳妇bbwbbw| 在线观看三级视频欧美| 欧美 日韩 综合| 日韩在线观看免费全集电视剧网站| 精品精品导航| 国产专区欧美专区| 亚洲精品国产setv| 日韩久久久久久久久久久久| 老司机免费视频一区二区三区| 久久一区二区电影| 一区二区三区小说| 一本到在线视频| 亚洲人在线观看| 爱啪啪综合导航| 99超碰麻豆| 99精品综合| 国产精品视频分类| 久久在线免费观看| 日韩成人免费在线视频| 欧美tickling挠脚心丨vk| 国产乱色在线观看| 国产精品狼人色视频一区| 亚洲动漫精品| 日本韩国欧美在线观看| 成人精品高清在线| 欧美成人三级在线观看| 91精品国产综合久久精品app| 国产福利小视频在线| 日韩免费视频在线观看| 日韩大尺度在线观看| 日本在线xxx| 粉嫩aⅴ一区二区三区四区| 真实国产乱子伦对白在线| 欧美日韩不卡一区| 国产视频福利在线| 国产精品第三页| 精品一区二区三区在线| 成人小视频在线看| 久久蜜桃av一区精品变态类天堂 | 国产精品成人久久| 日韩欧美色电影| 在线视频中文字幕第一页| 91久久久久久久久久久| 香蕉综合视频| 9191在线视频| 亚洲国产精品综合小说图片区| 精品区在线观看| 欧美劲爆第一页| 久久久久观看| 可以免费观看av毛片| 国产午夜亚洲精品午夜鲁丝片| 国产精品xxxxxx| 色悠悠国产精品| 日本久久久久| 伊人网在线免费| 国产乱码字幕精品高清av| 青草草在线视频| 亚洲电影在线观看| 男人久久天堂| 日韩精品不卡| 精品一区二区三区的国产在线播放| 国产真实乱在线更新| 欧美成人a∨高清免费观看| 男人av在线播放| 欧美亚洲免费高清在线观看| 青青草精品视频| www.色小姐com| 亚洲国产美女久久久久| 香蕉久久免费电影| 手机福利在线视频| 国产99久久久久| www.久久久久久久| 久久伊人91精品综合网站| 牛牛视频精品一区二区不卡| 男人的天堂日韩| 亚洲综合无码一区二区| 三级理论午夜在线观看| 国产精品自产拍高潮在线观看| 欧美freesex交免费视频| 波多野结衣福利| 制服丝袜日韩国产| 丁香花视频在线观看| 婷婷五月色综合| 国产白丝精品91爽爽久久| 久久人妻免费视频| 精品国产依人香蕉在线精品| 国内精品国产成人国产三级粉色| 日本在线观看a| 一区二区激情视频| 国产最新视频在线观看| 成人综合电影| 日日摸夜夜添夜夜添亚洲女人| 老湿机69福利| 亚洲视频在线观看| 2020国产精品极品色在线观看| 中文字幕欧美人妻精品一区| 亚洲一区二区视频在线观看| 超碰在线国产| 精品国产一区二区三区久久久久久| 捆绑紧缚一区二区三区视频| 国产成人在线观看网站| 久久久久999| 精品久久影视|