国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

【W(wǎng)eb技術(shù)】1052- 前端 API 請(qǐng)求緩存的 5 種方案(干貨內(nèi)容)

共 17458字,需瀏覽 35分鐘

 ·

2021-08-20 21:12

作者:wsafight,原文:https://github.com/wsafight/personBlog/issues/2

在開發(fā) web 應(yīng)用程序時(shí),性能都是必不可少的話題。

對(duì)于webpack打包的單頁面應(yīng)用程序而言,我們可以采用很多方式來對(duì)性能進(jìn)行優(yōu)化,比方說 tree-shaking、模塊懶加載、利用 extrens 網(wǎng)絡(luò)cdn 加速這些常規(guī)的優(yōu)化。

甚至在vue-cli 項(xiàng)目中我們可以使用 --modern 指令生成新舊兩份瀏覽器代碼來對(duì)程序進(jìn)行優(yōu)化。

而事實(shí)上,緩存一定是提升web應(yīng)用程序有效方法之一,尤其是用戶受限于網(wǎng)速的情況下。提升系統(tǒng)的響應(yīng)能力,降低網(wǎng)絡(luò)的消耗。當(dāng)然,內(nèi)容越接近于用戶,則緩存的速度就會(huì)越快,緩存的有效性則會(huì)越高。

以客戶端而言,我們有很多緩存數(shù)據(jù)與資源的方法,例如 標(biāo)準(zhǔn)的瀏覽器緩存 以及 目前火熱的 Service worker。但是,他們更適合靜態(tài)內(nèi)容的緩存。例如 html,js,css以及圖片等文件。而緩存系統(tǒng)數(shù)據(jù),我采用另外的方案。

那我現(xiàn)在就對(duì)我應(yīng)用到項(xiàng)目中的各種 api 請(qǐng)求緩存方案,從簡單到復(fù)雜依次介紹一下。

方案一 數(shù)據(jù)緩存

簡單的 數(shù)據(jù) 緩存,第一次請(qǐng)求時(shí)候獲取數(shù)據(jù),之后便使用數(shù)據(jù),不再請(qǐng)求后端api。代碼如下:

const dataCache = new Map()

async getWares() {
    let key = 'wares'
    // 從data 緩存中獲取 數(shù)據(jù)
    let data = dataCache.get(key)
    if (!data) {
        // 沒有數(shù)據(jù)請(qǐng)求服務(wù)器
        const res = await request.get('/getWares')

        // 其他操作
        ...
        data = ...

        // 設(shè)置數(shù)據(jù)緩存
        dataCache.set(key, data)

    }
    return data

第一行代碼 使用了 es6以上的 Map,如果對(duì)map不是很理解的情況下,你可以參考ECMAScript 6 入門 Set 和 Map 或者 Exploring ES6 關(guān)于 map 和 set的介紹,此處可以理解為一個(gè)鍵值對(duì)存儲(chǔ)結(jié)構(gòu)。

之后 代碼 使用 了 async 函數(shù),可以將異步操作變得更為方便。你可以參考ECMAScript 6 入門 async函數(shù)來進(jìn)行學(xué)習(xí)或者鞏固知識(shí)。

代碼本身很容易理解,是利用 Map 對(duì)象對(duì)數(shù)據(jù)進(jìn)行緩存,之后調(diào)用從 Map 對(duì)象來取數(shù)據(jù)。對(duì)于及其簡單的業(yè)務(wù)場景,直接利用此代碼即可。

調(diào)用方式:

getWares().then( ... )
// 第二次調(diào)用 取得先前的data
getWares().then( ... )

方案二 promise 緩存

方案一本身是不足的。因?yàn)槿绻紤]同時(shí)兩個(gè)以上的調(diào)用此 api,會(huì)因?yàn)檎?qǐng)求未返回而進(jìn)行第二次請(qǐng)求api。當(dāng)然,如果你在系統(tǒng)中添加類似于 vuex、redux這樣的單一數(shù)據(jù)源框架,這樣的問題不太會(huì)遇到,但是有時(shí)候我們想在各個(gè)復(fù)雜組件分別調(diào)用api,而不想對(duì)組件進(jìn)行組件通信數(shù)據(jù)時(shí)候,便會(huì)遇到此場景。

const promiseCache = new Map()

getWares() {
    const key = 'wares'
    let promise = promiseCache.get(key);
    // 當(dāng)前promise緩存中沒有 該promise
    if (!promise) {
        promise = request.get('/getWares').then(res => {
            // 對(duì)res 進(jìn)行操作
            ...
        }).catch(error => {
            // 在請(qǐng)求回來后,如果出現(xiàn)問題,把promise從cache中刪除 以避免第二次請(qǐng)求繼續(xù)出錯(cuò)S
            promiseCache.delete(key)
            return Promise.reject(error)
        })
    }
    // 返回promise
    return promise
}

該代碼避免了方案一的同一時(shí)間多次請(qǐng)求的問題。同時(shí)也在后端出錯(cuò)的情況下對(duì)promise進(jìn)行了刪除,不會(huì)出現(xiàn)緩存了錯(cuò)誤的promise就一直出錯(cuò)的問題。

調(diào)用方式:

getWares().then( ... )
// 第二次調(diào)用 取得先前的promise
getWares().then( ... )

方案三 多promise 緩存

該方案是同時(shí)需要 一個(gè)以上 的api請(qǐng)求的情況下,對(duì)數(shù)據(jù)同時(shí)返回,如果某一個(gè)api發(fā)生錯(cuò)誤的情況下。均不返回正確數(shù)據(jù)。

const querys ={
    wares'getWares',
    skus'getSku'
}
const promiseCache = new Map()

async queryAll(queryApiName) {
    // 判斷傳入的數(shù)據(jù)是否是數(shù)組
    const queryIsArray = Array.isArray(queryApiName)
    // 統(tǒng)一化處理數(shù)據(jù),無論是字符串還是數(shù)組均視為數(shù)組
    const apis = queryIsArray ? queryApiName : [queryApiName]

    // 獲取所有的 請(qǐng)求服務(wù)
    const promiseApi = []

    apis.forEach(api => {
        // 利用promise 
        let promise = promiseCache.get(api)

        if (promise) {
            // 如果 緩存中有,直接push
            promise.push(promise)
        } else {
             promise = request.get(querys[api]).then(res => {
                // 對(duì)res 進(jìn)行操作
                ...
                }).catch(error => {
                // 在請(qǐng)求回來后,如果出現(xiàn)問題,把promise從cache中刪除
                promiseCache.delete(api)
                return Promise.reject(error)
            })
            promiseCache.set(api, promise)
            promiseCache.push(promise)
        }
    })
    return Promise.all(promiseApi).then(res => {
        // 根據(jù)傳入的 是字符串還是數(shù)組來返回?cái)?shù)據(jù),因?yàn)楸旧矶际菙?shù)組操作
        // 如果傳入的是字符串,則需要取出操作
        return queryIsArray ? res : res[0]
    })
}

該方案是同時(shí)獲取多個(gè)服務(wù)器數(shù)據(jù)的方式??梢酝瑫r(shí)獲得多個(gè)數(shù)據(jù)進(jìn)行操作,不會(huì)因?yàn)閱蝹€(gè)數(shù)據(jù)出現(xiàn)問題而發(fā)生錯(cuò)誤。

調(diào)用方式

queryAll('wares').then( ... )
// 第二次調(diào)用 不會(huì)去取 wares,只會(huì)去skus
queryAll(['wares''skus']).then( ... )

方案四 添加時(shí)間有關(guān)的緩存

往往緩存是有危害的,如果我們在知道修改了數(shù)據(jù)的情況下,直接把 cache 刪除即可,此時(shí)我們調(diào)用方法就可以向服務(wù)器進(jìn)行請(qǐng)求。這樣我們規(guī)避了前端顯示舊的的數(shù)據(jù)。但是我們可能一段時(shí)間沒有對(duì)數(shù)據(jù)進(jìn)行操作,那么此時(shí)舊的數(shù)據(jù)就一直存在,那么我們最好規(guī)定個(gè)時(shí)間來去除數(shù)據(jù)。該方案是采用了 類 持久化數(shù)據(jù)來做數(shù)據(jù)緩存,同時(shí)添加了過期時(shí)長數(shù)據(jù)以及參數(shù)化。代碼如下:首先定義持久化類,該類可以存儲(chǔ) promise 或者 data

class ItemCache() {
    construct(data, timeout) {
        this.data = data
        // 設(shè)定超時(shí)時(shí)間,設(shè)定為多少秒
        this.timeout = timeout
        // 創(chuàng)建對(duì)象時(shí)候的時(shí)間,大約設(shè)定為數(shù)據(jù)獲得的時(shí)間
        this.cacheTime = (new Date()).getTime
    }
}

然后我們定義該數(shù)據(jù)緩存。我們采用Map 基本相同的api

class ExpriesCache {
    // 定義靜態(tài)數(shù)據(jù)map來作為緩存池
    static cacheMap =  new Map()

    // 數(shù)據(jù)是否超時(shí)
    static isOverTime(name) {
        const data = ExpriesCache.cacheMap.get(name)

        // 沒有數(shù)據(jù) 一定超時(shí)
        if (!data) return true

        // 獲取系統(tǒng)當(dāng)前時(shí)間戳
        const currentTime = (new Date()).getTime()        

        // 獲取當(dāng)前時(shí)間與存儲(chǔ)時(shí)間的過去的秒數(shù)
        const overTime = (currentTime - data.cacheTime) / 1000

        // 如果過去的秒數(shù)大于當(dāng)前的超時(shí)時(shí)間,也返回null讓其去服務(wù)端取數(shù)據(jù)
        if (Math.abs(overTime) > data.timeout) {
            // 此代碼可以沒有,不會(huì)出現(xiàn)問題,但是如果有此代碼,再次進(jìn)入該方法就可以減少判斷。
            ExpriesCache.cacheMap.delete(name)
            return true
        }

        // 不超時(shí)
        return false
    }

    // 當(dāng)前data在 cache 中是否超時(shí)
    static has(name) {
        return !ExpriesCache.isOverTime(name)
    }

    // 刪除 cache 中的 data
    static delete(name) {
        return ExpriesCache.cacheMap.delete(name) 
    }

    // 獲取
    static get(name) {
        const isDataOverTiem = ExpriesCache.isOverTime(name)
        //如果 數(shù)據(jù)超時(shí),返回null,但是沒有超時(shí),返回?cái)?shù)據(jù),而不是 ItemCache 對(duì)象
        return isDataOverTiem ? null : ExpriesCache.cacheMap.get(name).data
    }

    // 默認(rèn)存儲(chǔ)20分鐘
    static set(name, data, timeout = 1200) {
        // 設(shè)置 itemCache
        const itemCache = mew ItemCache(data, timeout)
        //緩存
        ExpriesCache.cacheMap.set(name, itemCache)
    }
}

此時(shí)數(shù)據(jù)類以及操作類 都已經(jīng)定義好,我們可以在api層這樣定義

// 生成key值錯(cuò)誤
const generateKeyError = new Error("Can't generate key from name and argument")

// 生成key值
function generateKey(name, argument{
    // 從arguments 中取得數(shù)據(jù)然后變?yōu)閿?shù)組
    const params = Array.from(argument).join(',')

    try{
        // 返回 字符串,函數(shù)名 + 函數(shù)參數(shù)
        return `${name}:${params}`
    }catch(_) {
        // 返回生成key錯(cuò)誤
        return generateKeyError
    }
}

async getWare(params1, params2) {
    // 生成key
    const key = generateKey('getWare', [params1, params2]) 
    // 獲得數(shù)據(jù)
    let data = ExpriesCache.get(key)
    if (!data) {
        const res = await request('/getWares', {params1, params2})
        // 使用 10s 緩存,10s之后再次get就會(huì) 獲取null 而從服務(wù)端繼續(xù)請(qǐng)求
        ExpriesCache.set(key, res, 10)
    }
    return data
}

該方案使用了 過期時(shí)間 和 api 參數(shù)不同而進(jìn)行 緩存的方式。已經(jīng)可以滿足絕大部分的業(yè)務(wù)場景。

調(diào)用方式

getWares(1,2).then( ... )
// 第二次調(diào)用 取得先前的promise
getWares(1,2).then( ... )
// 不同的參數(shù),不取先前promise
getWares(1,3).then( ... )

方案五 基于修飾器的方案四

和方案四的解法一致的,但是是基于修飾器來做。代碼如下:

// 生成key值錯(cuò)誤
const generateKeyError = new Error("Can't generate key from name and argument")

// 生成key值
function generateKey(name, argument{
    // 從arguments 中取得數(shù)據(jù)然后變?yōu)閿?shù)組
    const params = Array.from(argument).join(',')
    try{
        // 返回 字符串
        return `${name}:${params}`
    }catch(_) {
        return generateKeyError
    }
}

function decorate(handleDescription, entryArgs{
    // 判斷 當(dāng)前 最后數(shù)據(jù)是否是descriptor,如果是descriptor,直接 使用
    // 例如 log 這樣的修飾器
    if (isDescriptor(entryArgs[entryArgs.length - 1])) {
        return handleDescription(...entryArgs, [])
    } else {
        // 如果不是
        // 例如 add(1) plus(20) 這樣的修飾器
        return function({
            return handleDescription(...Array.protptype.slice.call(arguments), entryArgs)
        }
    }
}

function handleApiCache(target, name, descriptor, ...config{
    // 拿到函數(shù)體并保存
    const fn = descriptor.value
    // 修改函數(shù)體
    descriptor.value = function (
        const key =  generateKey(name, arguments)
        // key無法生成,直接請(qǐng)求 服務(wù)端數(shù)據(jù)
        if (key === generateKeyError)  {
            // 利用剛才保存的函數(shù)體進(jìn)行請(qǐng)求
            return fn.apply(nullarguments)
        }
        let promise = ExpriesCache.get(key)
        if (!promise) {
            // 設(shè)定promise
            promise = fn.apply(nullarguments).catch(error => {
                 // 在請(qǐng)求回來后,如果出現(xiàn)問題,把promise從cache中刪除
                ExpriesCache.delete(key)
                // 返回錯(cuò)誤
                return Promise.reject(error)
            })
            // 使用 10s 緩存,10s之后再次get就會(huì) 獲取null 而從服務(wù)端繼續(xù)請(qǐng)求
            ExpriesCache.set(key, promise, config[0])
        }
        return promise 
    }
    return descriptor;
}

// 制定 修飾器
function ApiCache(...args{
    return decorate(handleApiCache, args)
}

此時(shí) 我們就會(huì)使用 類來對(duì)api進(jìn)行緩存

class Api {
    // 緩存10s
    @ApiCache(10)
    // 此時(shí)不要使用默認(rèn)值,因?yàn)楫?dāng)前 修飾器 取不到
    getWare(params1, params2) {
        return request.get('/getWares')
    }
}

因?yàn)楹瘮?shù)存在函數(shù)提升,所以沒有辦法利用函數(shù)來做 修飾器 例如:

var counter = 0;

var add = function ({
  counter++;
};

@add
function foo({
}

該代碼意圖是執(zhí)行后counter等于 1,但是實(shí)際上結(jié)果是counter等于 0。因?yàn)楹瘮?shù)提升,使得實(shí)際執(zhí)行的代碼是下面這樣

@add
function foo({
}

var counter;
var add;

counter = 0;

add = function ({
  counter++;
};

所以沒有 辦法在函數(shù)上用修飾器。具體參考ECMAScript 6 入門 Decorator此方式寫法簡單且對(duì)業(yè)務(wù)層沒有太多影響。但是不可以動(dòng)態(tài)修改 緩存時(shí)間

調(diào)用方式

getWares(1,2).then( ... )
// 第二次調(diào)用 取得先前的promise
getWares(1,2).then( ... )
// 不同的參數(shù),不取先前promise
getWares(1,3).then( ... )

總結(jié)

api 的緩存機(jī)制與場景在這里也基本上介紹了,基本上能夠完成絕大多數(shù)的數(shù)據(jù)業(yè)務(wù)緩存,在這里我也想請(qǐng)教教大家,有沒有什么更好的解決方案,或者這篇博客中有什么不對(duì)的地方,歡迎指正,在這里感謝各位了。

同時(shí)這里也有很多沒有做完的工作,可能會(huì)在后面的博客中繼續(xù)完善。

1. JavaScript 重溫系列(22篇全)
2. ECMAScript 重溫系列(10篇全)
3. JavaScript設(shè)計(jì)模式 重溫系列(9篇全)
4. 正則 / 框架 / 算法等 重溫系列(16篇全)
5. Webpack4 入門(上)|| Webpack4 入門(下)
6. MobX 入門(上) ||  MobX 入門(下)
7. 120+篇原創(chuàng)系列匯總

回復(fù)“加群”與大佬們一起交流學(xué)習(xí)~

點(diǎn)擊“閱讀原文”查看 130+ 篇原創(chuàng)文章

瀏覽 19
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 久操欧美| 黄网站免费观看| 92丨九色丨偷拍老熟女| 丁香五月六月婷婷| 久久九九热| 亚洲天堂三级片| 91精品酒店视频| 九色视频在线观看| 日屄视频在线观看| 国产婷婷色一区二区在线观看| 亚洲久久在线| 欧美福利在线观看| 好男人一区二区三区在线观看| 无码A级| 成人做爱免费网站| 国产免费一区二区三区| 天天色天天干天天日| 一道本高清无码| 国产精品国产三级国产AⅤ原创 | 亚洲精品成人av无码| WWW色色| 一本加勒比HEZYO东京热无码| 国产精品女人777777| 激情中文网| 正在播放吴梦梦淫行| 国产九九| 欧美成人一级| 亚洲无码在线播放| 久久99久久99久久99人受| 日韩亚洲欧美在线| 久操视频免费在线观看| 日韩精品成人免费观看视频| 玖玖爱这里只有精品| 国产成人自拍视频在线| 人操人人人操| 肏逼网站在线观看| 国产AV18岁| 日韩综合在线| 伊人99| 91.xxxxx| 韩国一级av| 欧美一级婬片AAAA毛片| 久99视频| 夜夜操网站| 人人草人人摸人人看| 亚洲天堂手机在线| 青娱乐免费视频| 欧美成人网站免费在线观看| 一区二区三区在线视频观看| 亚洲国产精品尤物yw在线观看| 国产成人精品毛片| 女公务员人妻呻吟求饶| 边吃奶边做爱| 亚洲黄色无码视频| 四虎国产精品成人久久| 健身房被教练3p喷水了| 久久嫩草精品久久久久精| 天堂在线视频| 操B网站| 中文字幕综合网| 插逼网站| 亚洲中文av| 欧美一区二区三区四区视频| 免费黄色在线视频| 日韩欧美高清视频| 亚洲AV成人无码精在线| 国产高清视频在线观看| 久久激情网| 黄色片网站在线观看| 99自拍视频| 成人性爱AV| 91av| 免费性爱视频网站| 翔田千里珍藏版无码| 青青草操逼视频| 黄色视频视频| 成人在线视频播放| 91精品久久香蕉国产线看观看| 国产成人精品在线| 天干天干天夜夜爽| 天堂免费视频| 91操操| 91精品国产综合久久久不打电影 | 九色PORNY自拍视频| 亚洲无码免费在线| 中文字幕偷拍| 91在线无码| 中文字幕在线免费观看视频| 成人A片视频| 免费无码毛片一区二区A片小说| 肏逼网站| 伊人大香蕉网| 嘿咻无码推油| 操骚B| 蜜桃精品久久久| 日韩精品成人AV| 操逼色| 中文字幕无码A片久久| 成人做爰黄级A片免费看土方| 97人妻一区二区精品免费视频| 人妻日日| a视频免费看| 天天天日天天天天天天天日歌词 | 亚洲精品高清视频| 超碰在线人妻| 一级黄色视频免费观看| 精品人妻一区二区三区在线视频不卡 | 久久久久无码| 99精品在线免费观看| 久久久久国产视频| 人妻人人爱| a片在线免费观看| 韩国无码视频| 一级片黄色电影| 亚洲日韩一区二区三区四区| 青娱乐国产精品一区二区| 青娱乐在线精品| 国产亚洲无码激情前后夹击| 久久无码在线观看| 欧美成人性爱图片| 亚洲无码专区在线观看| 91久久综合亚洲鲁鲁五月天| 91Av视频| 青青草五月天色婷婷丁香| 欧美乱轮| 中国极品少妇XXX| 亚洲一区视频在线| 国产成人秘在线观看免费网站 | 无码a片| 狠狠草视频| 成人视频在线播放| 日韩性爱网站| 午夜老司机福利| 国产免费性爱视频| 黄色一级小说| 国产无遮挡又黄又爽又色视频| 91AV视频在线| 日韩一级无码特黄AAA片| 91日逼视频| 亚洲成人在线免费观看| 亚洲精品成人| 久久久免费黄色视频| 久久久偷拍视频| 艹逼视频| 少妇厨房愉情理伦BD在线观看| 特级婬片A片AAA毛片AA做头| 高H视频在线观看| 国产成人99久久亚洲综合精品 | 狠狠se| 国产无码AV成在线| 婷婷激情av| 国产操比视频| 五月天中文字幕| 日韩成人在线观看| 少妇搡BBBB搡BBB搡打电话| 国产3p绿帽骚妻视频| 99免费在线视频| 丁香婷婷激情| 七十路の高齢熟妇无码| 亚洲日韩一区二区| 大香蕉伊人在线手机网| 影音先锋麻豆传媒| 樱桃性爱视频| 99热在线观看免费精品| 国产在线拍揄自揄拍无码网站新闻 | 亚洲AV无码乱码国产精品黑人| 毛片在线免费| 午夜成人无码| 国产精品成人AV在线| 麻豆精东一区二区欧美国产| 免费毛片观看| 日韩中文字幕av在线| 国产精品揄拍500视频| 18国产免费视频在线观看| 欧美在线中文字幕| 日韩人妻午夜| 久久久久99精品成人片直播| 波多野结衣无码在线视频| 深爱五月网| 特级西西人体WWWww| 亚洲小说图片AV在线| 在线免费高清无码| 男女AV网站| 国产精品98| 你懂的在线播放| 日韩一级在线| 免费AV网站在线| 九色PORNY国产成人| 干老女人视频| 亚洲v视频| 欧美丝袜脚交xxxxBH| 欧美一级婬片免费视频黄| 成人无码免费毛片A片| 日韩va亚洲va欧美va高清| 亚洲免费观看高清完| 亚洲不卡中文字幕| 91爽爽| 蜜桃91精品秘入口内裤| 桃色Av| 亚洲一区二区成人| 人人操人人干人人爽| 黄色三级视频| 波多野结衣中文字幕久久| 亚洲最大网站| 亚洲精品999| 免费a网站| 色婷婷视屏| 欧美级黑寡妇毛片app| 国产一区二区三区四区五区在线| 日本免费黄色片| 亚洲国产精品自在自线| 99精品国产热久久91色欲| 狠狠色色| 亚洲欧美人妻| WWW.豆花视频精品| 日日夜夜精选视频| 无码看片| 精品视频久久| 国产资源网| 国产乱人伦无码视频| 俺来也俺去了| 亚洲无码精品视频| 亚洲香蕉视频网站| 国产成人无码AⅤ片免费播放| 日本AV在线播放| 麻豆蜜桃wwww精品无码| 手机AV在线观看| 久热福利| 奇米影视亚洲春色| 夜夜躁狠狠躁| 亚洲精品午夜| 亚洲成人精品在线观看| 搞搞网日本9| 亚洲成人在线免费| 在线少妇| 操久久| 欧美成人综合一区| 日皮视频在线看| 美日韩毛片| 爆操视频| 久久精品视频一区| 女人的天堂av| 亚洲精品乱码久久久久久蜜桃欧美| 91AV在线免费观看| 激情av| 久久精品电影| 亚洲中字幕| 天天弄天天操| 黄网站在线观看| 简单av网| 亚洲黄色影视| 日韩人妻丰满无码区A片| 欧美系列在线| 9l视频自拍蝌蚪9l成人蝌蚪| 成人电影一区二区三区| 97爱视频| 亚洲色综合久久五月| 91婷婷| 国产乱子伦| 久久精品亚洲无码| 国产日韩欧美在线| 91二区三区| 一级特黄大片色| 日本高清视频九区| 理论在线视频| 秋霞午夜| 欧美一区三区视频z| 夫妻-ThePorn| 欧美在线一区二区| 热久久在线| 丁香五月六月婷婷| 操逼精品| 国产亚洲无码激情前后夹击| 免费看一区二区三区| 成人AV在线电影| 黄色在线播放| 亚洲日本欧美| 亚洲精品系列| 中国免费一级无码成人片| 91成人视频在线观看| 免费爱爱网站| 国产午夜福利在线| 午夜久操| 无码专区中文字幕| 大香蕉中文| 日本三级片无码| 特級西西444WWw高清大膽| 91超碰在线观看| 久久视频在线| 人妻无码一区二区三区摄像头| 亚洲中文字幕在线观看免费| 久久久久成人精品无码| 日韩一级片在线观看| 黄色AV免费观看| 国精品伦一区一区三区有限公司 | 成人伊人大香蕉| 成人国产AV网站| 你懂的网站在线观看| 久草中文在线| 欧美日韩国产免费观看成人片| 99久久99九九99九九九| 免费看黄片| 国产在线精品观看| 最新va在线观看| 日韩精品丰满无码一级A片∴| 日韩无码播放| 欧美激情一区二区A片成人牛牛| 制服丝袜大香蕉| 18禁二区| 毛片精品| 91外围女视频| 99精品视频16在线免费观看| 亚洲色图图片| 色五月婷婷婷| 亚洲人网站| 97超碰在线视| 欧美操逼的| 日韩aaaa| 无码av一区| 五月天激情午夜福利| 河南乱子伦视频国产| 欧美成人毛片| 蜜桃视频日韩| 韩国午夜福利| 欧美成人三级片| 精品人无码一区二区三区下载| 国产一精品一aⅴ一免费| 99久在线精品99re8热| 欧美精品在线免费| 大香蕉欧美视频| 成人三级电影网| 日韩成年视频| 三级片国产| 操操操网| 国产熟妇码视频黑料| 俺去俺来也在线www色情网| 国产成人午夜| 黄色视频A| 91成人亚洲| 中文字幕在线永久| yw尤物| 夜夜爽7777精品国产三级| 影音先锋成人资源站| 亚洲女同在线| 蝌蚪窝在线观看| 日日夜夜综合| 91蝌蚪| 精品三级在线观看| 午夜国产码网站码| 自拍三区| 少妇大战黑人46厘米| 亚洲少妇人妻| 亚洲av在线观看| 天天干天天日| 日韩99| 91成人视频在线免费观看| 欧美日韩免费| 欧美成人自拍视频| 欧美城综合在线观看网| 欧美成人三级精品| WWW.豆花视频精品| 在线观看免费无码| 国产激情内射| 亚洲免费观看高清完整版在va线观 | 天天操b| 波多野结衣福利视频| 日逼免费网站| 日韩国产三级| 久久久九九九| 日日99| 中国老熟妇| 国产黄片免费视频| 91麻豆免费看| 中文字幕一区在线| 岛国av片| 天天干天天色天天日| 国产女人水真多18毛片18精品| 另类罕见稀奇videos| www.91在线看| 无码精品ThePorn| 91在线无码精品在线看| 亚洲高清无码视频| 3d动漫精品H区XXXXX区| 亚洲人视频| A视频在线免费观看| 国产一区二区三区四区五区六区七区| 乱伦三级| www黄色com| 蜜臀av在线| 婷婷五月欧美| 四季AV一区二区凹凸懂色桃花| 蝌蚪窝视频在线| 男女一区二区三区| 天天干天天日天天干| www俺来也com| 欧美操女人| 亚洲一区在线免费观看| 无码人妻一区二区三区三| 亚洲成人网站在线| 91黑人丨人妻丨国产丨| 炮友露脸青楼传媒刘颖儿| 青草视频在线免费观看| 在线中出| 91精品久久香蕉国产线看观看| 日韩a√| 青草影视久久| 欧美久久精品| 人人色人人黄| 中文字幕在线观看网站| 亚洲码无人客一区二区三区| 免费看一级高潮毛片| 日本综合在线| 黄色AV免费观看| 中文字幕亚洲在线| 97香蕉网| 中文字幕AV免费观看| 欧美在线一区二区| 成人先锋| 欧美性爱XXXX| 亚洲爱爱视频| 日韩动态视频| 伊人在线成人视频| 国产色情在线观看| 一级黄色电影免费在线观看| 黄网站在线观看| 97在线视频免费观看| 亚洲三级无码在线观看| 天堂免费视频| 高清亚洲| 国产成人精品片| 免费黄色A片| 香蕉视频毛片| 丝袜东京热AV高清| 蜜桃Av噜噜一区二区| 视频你懂的| 欧美视频色| 国产三级电影在线观看| 亚洲最大网站| 亚洲AV第一页| 护士小雪的yin荡高日记H视频 | 人妻人人澡| 草草草视频| 女人18特级毛片。| 性爱av在线| 免费在线观看亚洲| 色欲影视插综合一区二区三区| 日韩国无码| 免费在线观看AV片| 性欧美亚洲| 蜜臀久久| 亚洲精品女人| 国产又爽又黄视频| 中国操逼视频| 国产成人无码精品| 777偷窥盗摄00000| 免费看黄色片| 欧美视频a| 在线欧美日| 尻屄视频| 看看AV| 2025国产在线| 成人免费福利| 有码在线| 日日操夜夜爽| 欧美成人综合色| 欧美视频一区| 狠狠操狠狠撸| 久久大鸡| 成人影片亚洲| 91人妻无码一区二区三区| 18AV在线观看| 18网站视频| 日本乱伦电影中文字幕| 草久在线视频| 91亚洲精选| 日韩AV成人无码久久电影| 黄色片免费| 岛国无码破解AV在线播放| 人妻精品综合码| 波多野无码| 欧美级毛片一进一出| 逼特逼视频在线| 久草在在线| 中文字幕不卡AV在线观看| 天天操综合| 色综合天天操| 精品网站| 国产三级黄色AV| 成人视频一区二区| 中文字幕在线观看日本| 一区二区av在线| 亚洲欧美美国产| 亚洲精品456| 视色视频在线观看18| 欧美成人在线免费| 国产系列每日更新| 九九综合久久| 亚洲视频在线视频| 8050午夜一级| 丁香五月激情中文字幕| 双飞人妻13p| 中文字幕福利视频| 三级毛片视频| 亚洲激情偷拍| 国产激情在线视频| 猛男大粗猛爽H男人味| 免费操逼电影| 91一级A片在线观看| 欧美性国产| 免费V片| 婷婷亚洲天堂| 日韩在线成人中文字幕亚洲| 色五月婷婷丁香五月| 午夜av在线| 夜夜嗨av| 天堂资源在线观看| 亚洲天堂中文| 国产人与禽zoz0性伦| 国产在线观看免费视频| 亚洲免费三级| 成人先锋| 天天夜夜久久| 老司机无码| 亚洲成人无码在线| 在线观看黄色AV| 国产美女一级真毛片酒店| 最新亚洲无码在线观看| 黄色av无码| 影音先锋成人AV| 亭亭五月丁香| 亚洲成人视频免费在线观看| 免费A级黄片| 久久精品国产AV一区二区三区| 亚洲色婷婷| 色婷婷视频在线| 无码人妻精品一区二区三区蜜桃91 | 国产一级片| 六月婷婷综合| 免费av在线播放| 日韩av小电影| 操逼999| AA片免费| 午夜做爱福利视频| 无码群交东京热| 久久综合久久鬼| 国产一级片网站| 欧美性爱XXXX黑人XYX性爽| 9l蝌蚪PORNY中文| 国产欧美高清在线| 天天日综合| 国产综合AV| 操天天| 91在线不卡| 97人妻精品一区二区三区软件| 中字无码av| 日韩精品高清中文| 唐山熟女工棚嗷嗷叫| 黄色亚洲视频| 欧美成人在线视频网站| 开心激情婷婷| 无码人妻AⅤ一区二区三区| 日韩主播在线| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 白白操白白干| 天天操天天看| 黄色成人视频| 成人在线黄色| 亚洲欧美成人在线观看| 久热免费视频在线观看| 精品无码9| 日本色五月| av操逼网| 在线观看A片| 三级av在线| 午夜精品久久久久久久| 国产日韩在线观看视频| 人人免费操| 免费无码毛片一区二区A片| 人人色人人黄| 亚洲影院第一页在线观看| 中国免费看片| 亚洲在线免费观看| 99热这里只有精品99| 亚洲AV无码电影| 色婷婷综合激情| 先锋资源在线视频| 在线观看的AV| a√天堂资源中文8| 日韩毛片在线免费观看| 成人黄片在线免费观看| 大香蕉伊人在线手机网| 亚洲天天干| 蜜桃Av噜噜一区二区三区| 免费看黃色AAAAAA片| 四虎高清无码| 欧美18禁网站| 无码专区在线观看| 欧美伊人久久| 2025国产在线| 国产免费久久久| 草久在线| 欧美精品在线免费观看| 久久午夜鲁丝| 熟女一区二区三区| 91麻豆精品A片国产在线观看| 三级成人网站| 草逼com| 91天天干| 综合无码| 欧美成人a片| 日韩肏屄视频| 青青草在线播放| 亚洲成人大香蕉| 久久久久无码国产精品不卡| 欧美精品亚洲| 人妻无码一区二区三区| 国产av播放| 国产乱码精品一品二品| 亚洲精品福利视频导航| 男人的天堂色琪琪| 日本AⅤ中文字幕| 成人在线视频一区| 一区二区精品视频| 成人婷婷五月| 五月激情婷婷基地| 亚洲色逼图片| 暗呦罗莉精品一区二区| 中文字幕观看| 美女网站黄| 亚洲欧美色图| 麻豆性爱| 日韩免费AV| 黄色成人在线观看| 国产v片| 成人无码精品| 欧美大香蕉视频| 国产三级片视频| 中文字幕无码av| 在线中文字幕网站| 亚洲精品久久久久久| 69AV在线观看| 爱爱视频日本| 伊人大香蕉在线观看| 国产成人精品免费视频| 国产高清无码自拍| 先锋影音av资源网| 亚洲色五月| 在线观看高清无码视频| 国产又爽又黄免费网站校园里 | 亚洲一级二级三级片| 国产热99| 大香蕉综合久久| 麻豆AV在线播放| yw在线播放| 人人妻人人玩人人澡人人爽| 69福利视频| 亚洲精品中文字幕乱码三区91 | 一级欧美黑人大战白妞| 激情伊人五月天| 午夜在线观看视频| 无码视频在线看| 欧美a片在线观看| 嫰BBB槡BBBB槡BBBB| 国产成人精品av| 亚洲乱码精品久久久久..| 能看的av| 三级无码在线| 日韩激情无码一区二区| 黄色成人网站免费在线观看| 亚洲成人视屏| 国产在线小电影| 三级乱伦| 蜜桃av秘无码一区三区四| 国产成人视频| 无码秘蜜桃一区二区| 初学影院WWWBD英语完整版在线观看 | 夜夜爱爱| 国产无码一| 小黄片高清无码| 蜜乳AV一区二区三区| 超碰人人人| 一区无码精品| 国产自慰一区| 51妺嘿嘿在线电影免费观看| 中国婬乱a| 亚洲精品女人久久久| 艹逼免费视频| 无码白浆| 亚洲AV观看| 99热精品在线播放| 四虎精品一区二区三区| 一道本在线| 欧美18禁黄免费网站| 亚洲夜夜爱| 亚洲午夜福利一区二区三区| 日韩三级麻豆| 91人人妻人人澡人人爽人人精品| 欧美日韩国产免费观看成人片| 我爱大香蕉| 天天爽天天爽成人A片影院| 亚洲毛片在线| 色色色五月| 精品偷拍视频| 超碰乱伦| 高清无码免费| 国产精品无码永久免费A片| 免费看黄片| 一道本无码视频| 国内自拍视频网站| 黄色片视频免费| 99xav| av无码电影| 熟女网址| 天天日天天爽| 午夜久操| 中文字幕综合在线| 香蕉视频啪啪啪| 操操片| 亚洲黄色成人| 无码一区二区视频| 成人午夜福利网站| 午夜黄色视频| www.色欲av| 91久久精品一区二区三区| 黑人毛片91久久久久久| 久久大陆| 大茄子熟女AV导航| 日韩精品一二三区| 东京热综合网| 人妻精品一卡二卡| 性毛片| 嘿咻嘿咻动态图| 乱伦内射视频| 黑人猛躁白人BBBBBBBBB| 青青草在线播放| 人人妻人人| 成人aaa| AⅤ视频在线观看| 国产成人三级片在线观看| 四虎综合网| 66久久| 99久在线精品99re8热| 最近中文字幕免费| 黑巨茎大战欧美白妞| 黄色电影天堂网站| 日韩欧美成人网| 日韩黄色一级| 日韩日日日| 婷婷成人电影| 亚洲无码天堂| 久久国产精品伦子伦| 亚洲中文字幕日韩精品| 少妇喷水视频| 先锋影音资源网站| 免费观看av| 天美果冻麻豆国产一区| 日狠狠| 在线性视频| 影音av资源| 超碰人人草| 九九无码| 91丨人妻丨国产| 日韩无码视频一区二区| 国产精品免费观看久久久久久久久| 国产A片免费观看| 五月天婷婷视频| 欧美激情色色| 中文字幕av网站| 久久成人无码电影| 91国语对白| 欧美成人性爱网| 亚洲欧洲无码在线| 337P大胆粉嫩银噜噜噜| 欧美日韩在线视频一区| 国产免费a片| 91在线精品一区二区| 欧美日韩国产尤物主播精品| 婷婷五月福利| AV自拍| 日逼精品| 婷婷一区二区| 乱伦99| 日韩香蕉网| 波多野结衣亚洲视频| 成人色色网| 成人网站在线免费观看| 国产一区2区| av无码精品一区| 久草网在线| 逼特逼在线观看| 夫妻无码| 女生自慰网站免费| 黄页网址在线观看| 五月丁香欧美| 国产91探花系列在线观看| 黄片在线网站| 日韩高清无码片| 91久久国产性奴调教| 九九99电影| 国产成人三级在线播放| 日韩av小电影| 国产AⅤ爽aV久久久久成人| 麻豆成人91精品二区三区| 大香蕉精品一区| 日本一区二区视频在线| 国产成人精品免高潮在线人与禽一 | 波多野结衣大战黑人| 91视频内射| 欧美mv日韩mv国产网站| 99久久久久久久久久| 国产乱伦免费视频| 国产精品色8| 成人毛片网站| 人人澡av| 台湾精品无码| 精品偷拍视频| 精品无码一区二区人妻久久蜜桃 | AA片网站| 天堂资源中文在线| 在线观看国产免费视频| 午夜亚洲福利视频| 手机在线操B视频| 六月丁香视频| 婷婷午夜| 激情二区| 青青草原网站在线观看| a在线免费观看| 日韩免费在线观看一区入口| 韩国无码高清视频| 污视频在线看| 大香蕉国产视频| AAA一区二区三区| 丰满人妻一区二区三区免费 | 激情五月天影院| 婷婷色综合视频二区| 大肉大捧一进一出免费阅读| 91高清在线| 日本无码中文字幕| 激情婷婷av| 俄罗斯白嫩BBwBBwBBw91| 午夜综合| 瘦精品无码一区二区三区四区五区六区七区八区 | www.啪啪| 欧美日韩视频免费观看| 一区二区三区四区五区无码| 国产激情无码视频| 操逼电影免费| 亚洲欧美日韩动漫| 九九热热| 欧美h| 国产精品秘ThePorn| 午夜激情视频网站| 国产麻豆AⅤMDMD0071| 大地中文资源5页的更新内容| 高清无码做爱视频| 欧美精品一区二区三区四区| 一本久久综合亚洲鲁鲁五月天 | 加勒比无码在线| 91视频在线免费观看app| 亚洲无码入口| 亚洲一区视频| AV观看免费| 欧美国产日韩在线观看| 色婷婷精品国产一区二区三区 | 爱爱高清视频| 少妇高潮喷水视频| 青娱乐亚洲领先| 中文字幕一级片| 亚洲视频一区二区三区四区娇小视频在线观看视频 | 色综合天天操| 操逼大全| 天堂中文在线a| 国产精品高潮无套内谢| 五月丁香在线观看| 婷婷久久久久久| 亚洲无码在线免费视频| 亚洲色图15p| 色播国产成人AV| 东京热国产| 精品欧美片在线观看步骤| 91天天爽| 污视频免费在线观看| 蜜乳AV一区二区三区| 国产豆花视频| 国产黄网| 欧美精品久久久久久久久| 免费大黄网站| aaa在线免费视频| 肏逼综合网| 亚洲卡一卡二| 蜜乳AV一区二区三区| 欧美婷婷综合| 无码成人AV在线看免费| 91精品视频在线免费观看| 日韩爱爱网| 青草视频精品| 成人黄色小电影| 一区二区不卡视频| 扒开让我91看片在线看| 亚洲无码一级片|