久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

從表設(shè)計(jì)到高并發(fā)防超賣:Spring Boot庫存扣減體系完整實(shí)戰(zhàn)

從表設(shè)計(jì)到高并發(fā)防超賣:Spring Boot庫存扣減體系完整實(shí)戰(zhàn) 做后端開發(fā)、電商系統(tǒng)或者進(jìn)銷存系統(tǒng)時(shí)庫存模塊往往是繞不開的核心業(yè)務(wù)。很多項(xiàng)目初期“先做能跑的功能”到后面做秒殺、下單、退款時(shí)庫存扣減就開始出各種問題超賣、少賣、流水對(duì)不上、數(shù)據(jù)不一致。這篇文章會(huì)圍繞庫存管理這個(gè)業(yè)務(wù)場(chǎng)景從數(shù)據(jù)庫表設(shè)計(jì)、核心接口實(shí)現(xiàn)到高并發(fā)防超賣方案完整梳理一套可落地的庫存扣減體系。內(nèi)容包括完整DDL、Spring Boot核心代碼、Redis Lua腳本和常見排查思路適合初學(xué)后端、正在做畢設(shè)或負(fù)責(zé)訂單庫存模塊的開發(fā)者收藏備用。1. 庫存管理的核心概念1.1 庫存到底是什么從業(yè)務(wù)層面看庫存是“可銷售商品數(shù)量”的抽象。在數(shù)據(jù)庫里庫存通常不是一個(gè)簡(jiǎn)單的數(shù)字而是由總庫存、鎖定庫存、可用庫存等字段共同表達(dá)的。很多新手容易把庫存理解成“一張表里一個(gè)數(shù)字”然后每次下單就執(zhí)行UPDATE inventory SET quantity quantity - 1 WHERE sku_id 1001;這種寫法在小流量、單機(jī)環(huán)境下勉強(qiáng)能運(yùn)行但它缺少業(yè)務(wù)語義也無法應(yīng)對(duì)并發(fā)。真實(shí)業(yè)務(wù)里的庫存至少要區(qū)分三個(gè)口徑總庫存商品總共采購/入庫了多少件。鎖定庫存已經(jīng)預(yù)占但還沒完成支付的庫存比如用戶下單后待支付期間占用的庫存??捎脦齑娈?dāng)前還能繼續(xù)被下單的庫存??梢杂靡粋€(gè)簡(jiǎn)單公式說明可用庫存 總庫存 - 鎖定庫存用戶下單后先把“可用庫存”減少、把“鎖定庫存”增加支付成功后再把“總庫存”和“鎖定庫存”同時(shí)扣減如果訂單取消則把鎖定庫存釋放可用庫存回補(bǔ)。這個(gè)流程相比“直接扣減總數(shù)”更嚴(yán)謹(jǐn)也是主流電商系統(tǒng)常用的庫存模型。1.2 常見的庫存業(yè)務(wù)模型在不同業(yè)務(wù)場(chǎng)景下庫存模型會(huì)有所差異。第一種是“現(xiàn)貨庫存模型”常見于電商、商城系統(tǒng)。商品入庫時(shí)增加總庫存用戶下單時(shí)先鎖定庫存支付后扣減總庫存取消訂單時(shí)回補(bǔ)庫存。這種模型需要考慮訂單超時(shí)釋放以及支付回調(diào)與庫存扣減的一致性。第二種是“備貨/預(yù)售模型”常見于倉配系統(tǒng)和供應(yīng)鏈系統(tǒng)。庫存不僅包含可售庫存還包含在途庫存、凍結(jié)庫存、質(zhì)檢庫存等。這類模型更復(fù)雜需要增加庫存狀態(tài)字段比如在途可售凍結(jié)鎖庫出庫中第三種是“門店/多倉庫存模型”需要把庫存按倉庫維度拆分每個(gè)倉庫都有自己的庫存表下單時(shí)還需要按倉庫計(jì)算可用庫存。這類模型在ERPSaaS系統(tǒng)里很常見核心表會(huì)帶warehouse_id這樣的倉庫維度。無論哪種模型底層都需要做到“扣減有依據(jù)、流水可追溯”這是庫存模塊設(shè)計(jì)的第一原則。1.3 庫存模塊在系統(tǒng)中的位置庫存模塊一般不獨(dú)立存在它和商品、訂單、支付、售后等模塊緊密關(guān)聯(lián)。典型調(diào)用鏈路如下商品詳情頁 - 查詢庫存 - 用戶下單 - 鎖定庫存 - 用戶支付 - 支付回調(diào) - 扣減庫存 - 發(fā)貨出庫 - 售后/取消 - 釋放庫存所以庫存接口不僅要考慮“當(dāng)前有沒有貨”還要和訂單狀態(tài)機(jī)聯(lián)動(dòng)。這也意味著庫存模塊是一個(gè)需要強(qiáng)事務(wù)、強(qiáng)一致性、并發(fā)安全的模塊。如果庫存扣減失敗訂單不能創(chuàng)建如果取消訂單庫存必須回補(bǔ)。任何“先改訂單、再改庫存”的做法都要通過事務(wù)或者最終一致性機(jī)制保證兩邊不出現(xiàn)偏差。2. 環(huán)境準(zhǔn)備與項(xiàng)目結(jié)構(gòu)2.1 技術(shù)棧選擇本文示例采用 Java Spring Boot 作為主技術(shù)棧數(shù)據(jù)庫使用 MySQLORM 使用 MyBatis Plus高并發(fā)示例使用 Redis Lua 腳本。這套組合在電商、企業(yè)后臺(tái)系統(tǒng)中非常常見資料多容易落地。技術(shù)環(huán)境如下版本需要根據(jù)你的項(xiàng)目實(shí)際情況調(diào)整JDK1.8 或 11如果使用 Spring Boot 3需要 JDK 17。Spring Boot2.7.x 或 3.x示例以 2.7.x 常見寫法為主。MySQL5.7 或 8.0推薦 8.0。MyBatis Plus3.5.x。Redis5.x / 6.x / 7.x 均可。開發(fā)工具IDEA Maven Postman 或 Apifox。這里說明一下代碼示例并不是版本寫死才能運(yùn)行關(guān)鍵點(diǎn)是鎖庫存、扣庫存的 SQL 和事務(wù)邏輯你在自己的項(xiàng)目里可以按實(shí)際依賴調(diào)整。2.2 數(shù)據(jù)庫準(zhǔn)備啟動(dòng) MySQL 后創(chuàng)建數(shù)據(jù)庫CREATE DATABASE IF NOT EXISTS inventory_demo DEFAULT CHARACTER SET utf8mb4; USE inventory_demo;建議使用 utf8mb4 字符集避免商品名或備注信息出現(xiàn)生僻字時(shí)寫入報(bào)錯(cuò)。2.3 項(xiàng)目目錄結(jié)構(gòu)在 IDEA 中創(chuàng)建一個(gè) Spring Boot 工程包名為com.example.inventory。核心目錄如下src/main/java/com/example/inventory ├── InventoryApplication.java ├── controller │ └── InventoryController.java ├── entity │ ├── Inventory.java │ └── InventoryFlow.java ├── mapper │ └── InventoryMapper.java └── service ├── InventoryService.java └── RedisInventoryService.java src/main/resources ├── application.yml └── lua/ ├── stock_deduct.lua └── stock_release.lua這是一份非常精簡(jiǎn)的后端工程結(jié)構(gòu)實(shí)際項(xiàng)目中還會(huì)包含公共異常處理、統(tǒng)一返回結(jié)構(gòu)、配置類等考慮到教程篇幅本文只保留和庫存強(qiáng)相關(guān)的文件。3. 庫存表設(shè)計(jì)與數(shù)據(jù)模型3.1 商品表、庫存表與流水表設(shè)計(jì)先來看三張核心表的設(shè)計(jì)商品表、庫存表、庫存流水表。商品表比較簡(jiǎn)單用于描述商品和SKU基本信息。CREATE TABLE product ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 主鍵, product_name VARCHAR(128) NOT NULL COMMENT 商品名稱, sku_code VARCHAR(64) NOT NULL COMMENT SKU編碼, price DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT 售價(jià), create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_sku_code (sku_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT商品表;庫存表是核心表記錄每個(gè)SKU的總庫存、鎖定庫存、可用庫存和版本號(hào)。CREATE TABLE inventory ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 主鍵, sku_id BIGINT NOT NULL COMMENT 商品SKU ID, total_quantity INT NOT NULL DEFAULT 0 COMMENT 總庫存, locked_quantity INT NOT NULL DEFAULT 0 COMMENT 鎖定庫存, available_quantity INT NOT NULL DEFAULT 0 COMMENT 可用庫存, version INT NOT NULL DEFAULT 0 COMMENT 樂觀鎖版本號(hào), create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_sku_id (sku_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT庫存表;這里單獨(dú)加了一個(gè)version字段用來做樂觀鎖控制。在高并發(fā)場(chǎng)景下條件更新配合版本號(hào)能有效避免超賣。庫存流水表用于記錄每一次庫存變化方便對(duì)賬和排查。CREATE TABLE inventory_flow ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 主鍵, sku_id BIGINT NOT NULL COMMENT SKU ID, order_id VARCHAR(64) DEFAULT NULL COMMENT 訂單號(hào), change_type TINYINT NOT NULL COMMENT 變化類型1-鎖定 2-扣減 3-釋放 4-入庫, quantity INT NOT NULL COMMENT 變化數(shù)量, before_quantity INT NOT NULL COMMENT 變化前可用庫存, after_quantity INT NOT NULL COMMENT 變化后可用庫存, remark VARCHAR(255) DEFAULT NULL COMMENT 備注, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_sku_id (sku_id), KEY idx_order_id (order_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT庫存流水表;3.2 為什么需要庫存流水表很多小項(xiàng)目不建流水表只在庫存表上直接更新數(shù)量。剛開始問題不大但當(dāng)庫存數(shù)量異常、業(yè)務(wù)方質(zhì)疑“為什么少了一件”、運(yùn)營(yíng)要求“把某一筆扣減找出來”的時(shí)候沒有流水就會(huì)非常被動(dòng)。庫存流水表是庫存模塊的“審計(jì)日志”。每次鎖定、釋放、扣減都要記錄變化的數(shù)量、變化前后的庫存、關(guān)聯(lián)訂單號(hào)和操作類型。有了這張表就可以通過訂單號(hào)反查操作鏈路也能在庫存不一致時(shí)通過流水重建現(xiàn)場(chǎng)。這里有個(gè)實(shí)踐建議流水表的數(shù)據(jù)量增長(zhǎng)會(huì)很快建議定期歸檔或者按月份分表。查詢最近一個(gè)月的流水走熱表歷史流水走歸檔表。3.3 初始化數(shù)據(jù)插入一條商品和庫存測(cè)試數(shù)據(jù)INSERT INTO product (product_name, sku_code, price) VALUES (測(cè)試手機(jī), SKU1001, 3999.00); INSERT INTO inventory (sku_id, total_quantity, locked_quantity, available_quantity, version) VALUES (1, 100, 0, 100, 0);這里總庫存 100鎖定庫存 0可用庫存 100版本號(hào) 0。4. 核心接口實(shí)現(xiàn)庫存查詢、預(yù)占、扣減與回補(bǔ)4.1 庫存查詢庫存查詢是最基礎(chǔ)、也最容易被忽略的接口。高并發(fā)下如果每次查詢都直接穿透數(shù)據(jù)庫會(huì)給數(shù)據(jù)庫帶來較大壓力所以生產(chǎn)環(huán)境通常會(huì)在庫存表前面加一層 Redis 緩存。先看數(shù)據(jù)庫查詢方式使用 MyBatis Plus 的 LambdaQueryWrapper// 文件路徑src/main/java/com/example/inventory/service/InventoryService.java Override public Inventory getInventoryBySkuId(Long skuId) { Inventory inventory inventoryMapper.selectOne( new LambdaQueryWrapperInventory() .eq(Inventory::getSkuId, skuId) ); if (inventory null) { throw new RuntimeException(SKU不存在); } return inventory; }如果使用 MyBatis 原生 Mapper也可以這樣寫Select(SELECT id, sku_id, total_quantity, locked_quantity, available_quantity, version FROM inventory WHERE sku_id #{skuId}) Inventory selectBySkuId(Param(skuId) Long skuId);這里需要注意selectOne方法要求查詢結(jié)果最多只有一條所以inventory表上必須保留sku_id的唯一索引。否則一旦出現(xiàn)重復(fù)數(shù)據(jù)查詢會(huì)直接拋異常。4.2 預(yù)占/鎖定庫存鎖定庫存是下單時(shí)最關(guān)鍵的一步。用戶點(diǎn)擊“提交訂單”后系統(tǒng)先鎖定指定數(shù)量的庫存防止其他用戶把庫存買走。這個(gè)階段還不能直接扣減總庫存因?yàn)橛脩艨赡茏罱K不支付。鎖定庫存的 SQL 使用條件更新保證“可用庫存足夠才更新”// 文件路徑src/main/java/com/example/inventory/mapper/InventoryMapper.java Update(UPDATE inventory SET locked_quantity locked_quantity #{quantity}, available_quantity available_quantity - #{quantity}, version version 1 WHERE sku_id #{skuId} AND available_quantity #{quantity} AND version #{version}) int lockInventory(Param(skuId) Long skuId, Param(quantity) Integer quantity, Param(version) Integer version);這里加入available_quantity #{quantity}條件后即使并發(fā)請(qǐng)求同時(shí)到達(dá)數(shù)據(jù)庫也只會(huì)讓滿足條件的更新成功從源頭上杜絕超賣。Service 內(nèi)實(shí)現(xiàn)鎖定邏輯// 文件路徑src/main/java/com/example/inventory/service/InventoryService.java Transactional(rollbackFor Exception.class) public boolean lockStock(Long skuId, Integer quantity, String orderId) { Inventory inventory inventoryMapper.selectOne( new LambdaQueryWrapperInventory() .eq(Inventory::getSkuId, skuId) ); if (inventory null) { throw new RuntimeException(SKU不存在); } int rows inventoryMapper.lockInventory( skuId, quantity, inventory.getVersion() ); if (rows 0) { throw new RuntimeException(庫存不足或版本沖突請(qǐng)重試); } // 記錄庫存流水 saveFlow(skuId, orderId, 1, quantity, inventory.getAvailableQuantity(), inventory.getAvailableQuantity() - quantity, 下單鎖定庫存); return true; }這個(gè)方法的執(zhí)行順序是先查一次庫存拿到當(dāng)前版本號(hào)然后執(zhí)行條件更新。如果更新影響行數(shù)不為 0說明扣減成功如果為 0說明在這期間庫存已經(jīng)被別人修改過或者可用庫存不足需要讓用戶重新確認(rèn)庫存。4.3 扣減庫存用戶支付成功后系統(tǒng)需要把已經(jīng)鎖定的庫存真正扣減掉。此時(shí)不再檢查可用庫存只檢查鎖定庫存是否足夠。// 文件路徑src/main/java/com/example/inventory/mapper/InventoryMapper.java Update(UPDATE inventory SET total_quantity total_quantity - #{quantity}, locked_quantity locked_quantity - #{quantity} WHERE sku_id #{skuId} AND locked_quantity #{quantity}) int deductInventory(Param(skuId) Long skuId, Param(quantity) Integer quantity);這里為什么要同時(shí)扣減總庫存和鎖定庫存因?yàn)橹版i定庫存時(shí)已經(jīng)把可用庫存減掉了總庫存沒有變化?,F(xiàn)在支付完成商品即將出庫所以總庫存也要同步減少同時(shí)把鎖定的額度釋放掉。對(duì)應(yīng)的 Service 方法Transactional(rollbackFor Exception.class) public boolean deductStock(Long skuId, Integer quantity, String orderId) { Inventory inventory getInventoryBySkuId(skuId); int rows inventoryMapper.deductInventory(skuId, quantity); if (rows 0) { throw new RuntimeException(鎖定庫存不足扣減失敗); } saveFlow(skuId, orderId, 2, quantity, inventory.getAvailableQuantity(), inventory.getAvailableQuantity(), 支付成功扣減庫存); return true; }這里流水中的變化前可用庫存和變化后可用庫存沒有變化因?yàn)殒i定庫存時(shí)已經(jīng)扣減了可用庫存扣減階段不再影響可用庫存。4.4 釋放/回補(bǔ)庫存訂單取消、超時(shí)未支付或售后退貨時(shí)需要把之前鎖定的庫存釋放回可用庫存。// 文件路徑src/main/java/com/example/inventory/mapper/InventoryMapper.java Update(UPDATE inventory SET locked_quantity locked_quantity - #{quantity}, available_quantity available_quantity #{quantity} WHERE sku_id #{skuId} AND locked_quantity #{quantity}) int releaseInventory(Param(skuId) Long skuId, Param(quantity) Integer quantity);釋放庫存時(shí)仍然要加條件locked_quantity #{quantity}避免因?yàn)闃I(yè)務(wù)重復(fù)取消、并發(fā)釋放導(dǎo)致鎖定庫存被扣成負(fù)數(shù)。Service 方法如下Transactional(rollbackFor Exception.class) public boolean releaseStock(Long skuId, Integer quantity, String orderId) { Inventory inventory getInventoryBySkuId(skuId); int rows inventoryMapper.releaseInventory(skuId, quantity); if (rows 0) { throw new RuntimeException(釋放庫存失敗鎖定庫存不足); } saveFlow(skuId, orderId, 3, quantity, inventory.getAvailableQuantity(), inventory.getAvailableQuantity() quantity, 訂單取消釋放庫存); return true; }釋放庫存的流水里變化前可用庫存和變化后可用庫存都需要記錄方便核對(duì)回補(bǔ)的庫存是否準(zhǔn)確。4.5 運(yùn)行與驗(yàn)證啟動(dòng)項(xiàng)目后可以直接用 Postman 或 Apifox 測(cè)試接口。假設(shè)項(xiàng)目運(yùn)行在8080端口鎖定庫存接口如下POST http://localhost:8080/inventory/lock Content-Type: application/json { skuId: 1, quantity: 2, orderId: ORDER20250115001 }返回成功并記錄一條庫存流水后再查詢庫存接口GET http://localhost:8080/inventory/get?skuId1預(yù)期返回總庫存 100鎖定庫存 2可用庫存 98版本號(hào) 1。如果連續(xù)使用同一版本號(hào)再次鎖定則因?yàn)榘姹緵_突而失敗。這是樂觀鎖的一種典型表現(xiàn)。5. 高并發(fā)庫存扣減防超賣與并發(fā)控制5.1 為什么不能直接 update很多同學(xué)剛接觸庫存扣減時(shí)喜歡先寫查詢?cè)賹懜翴nventory inventory getBySkuId(skuId); if (inventory.getAvailableQuantity() quantity) { updateById(...); }這種“先查后改”在多線程并發(fā)下存在競(jìng)態(tài)條件兩個(gè)請(qǐng)求同時(shí)查到可用庫存為 10同時(shí)判斷庫存足夠然后同時(shí)執(zhí)行扣減最終可能把庫存扣成負(fù)數(shù)造成超賣。即使在單體項(xiàng)目中也要盡量避免這種寫法。除非方法內(nèi)加鎖否則數(shù)據(jù)庫的隔離級(jí)別并不能阻止這種“讀-改-寫”的并發(fā)問題。正確做法是把庫存判斷和庫存扣減放在同一條UPDATE語句里讓數(shù)據(jù)庫通過行鎖和條件更新保證原子性。5.2 樂觀鎖方案樂觀鎖方案依賴版本號(hào)或時(shí)間戳。每次更新時(shí)比較當(dāng)前版本號(hào)如果版本號(hào)不匹配則更新失敗。核心 SQL 如下UPDATE inventory SET locked_quantity locked_quantity #{quantity}, available_quantity available_quantity - #{quantity}, version version 1 WHERE sku_id #{skuId} AND available_quantity #{quantity} AND version #{version};優(yōu)點(diǎn)適合并發(fā)沖突不嚴(yán)重的場(chǎng)景。實(shí)現(xiàn)簡(jiǎn)單不需要額外加鎖。通過條件更新防止超賣。缺點(diǎn)高并發(fā)沖突時(shí)大量請(qǐng)求會(huì)更新失敗。需要業(yè)務(wù)層做重試或返回提示。如果你的項(xiàng)目并發(fā)量不是特別高可以先采用樂觀鎖方案。它能保證不超賣但對(duì)用戶體驗(yàn)來說高峰期下單失敗率會(huì)偏高。5.3 悲觀鎖方案悲觀鎖使用數(shù)據(jù)庫的SELECT ... FOR UPDATE把庫存行鎖住然后判斷庫存并更新。Select(SELECT id, sku_id, total_quantity, locked_quantity, available_quantity, version FROM inventory WHERE sku_id #{skuId} FOR UPDATE) Inventory selectBySkuIdForUpdate(Param(skuId) Long skuId);然后 Service 中Transactional(rollbackFor Exception.class) public boolean lockStockWithPessimisticLock(Long skuId, Integer quantity, String orderId) { Inventory inventory inventoryMapper.selectBySkuIdForUpdate(skuId); if (inventory.getAvailableQuantity() quantity) { throw new RuntimeException(庫存不足); } int rows inventoryMapper.lockInventory(skuId, quantity, inventory.getVersion()); if (rows 0) { throw new RuntimeException(鎖定失敗); } saveFlow(...); return true; }注意FOR UPDATE必須在事務(wù)中才能生效。事務(wù)提交或回滾后釋放行鎖。悲觀鎖方案的特點(diǎn)強(qiáng)一致性不會(huì)因?yàn)椴l(fā)沖突導(dǎo)致大量失敗。適合庫存熱點(diǎn)比較集中的場(chǎng)景。缺點(diǎn)是會(huì)阻塞其他事務(wù)降低吞吐量且對(duì)數(shù)據(jù)庫連接占用時(shí)間較長(zhǎng)。在一些企業(yè)內(nèi)部 ERP、進(jìn)銷存系統(tǒng)中因?yàn)椴l(fā)量有限但數(shù)據(jù)一致性要求極高悲觀鎖反而是更簡(jiǎn)單的方案。5.4 Redis Lua 預(yù)扣減方案當(dāng)并發(fā)量非常大比如秒殺場(chǎng)景數(shù)據(jù)庫壓力會(huì)非常大。這時(shí)可以把庫存預(yù)熱到 Redis通過 Lua 腳本原子地完成扣減判斷和扣減操作。Lua 腳本如下-- 文件路徑src/main/resources/lua/stock_deduct.lua local key KEYS[1] local quantity tonumber(ARGV[1]) local stock tonumber(redis.call(get, key)) if stock false then return -1 end if stock - quantity 0 then return 0 end redis.call(decrby, key, quantity) return 1釋放庫存的腳本-- 文件路徑src/main/resources/lua/stock_release.lua local key KEYS[1] local quantity tonumber(ARGV[1]) local stock tonumber(redis.call(get, key)) if stock false then return -1 end redis.call(incrby, key, quantity) return 1Java 調(diào)用示例// 文件路徑src/main/java/com/example/inventory/service/RedisInventoryService.java Service public class RedisInventoryService { Resource private StringRedisTemplate stringRedisTemplate; public static final String STOCK_KEY_PREFIX inventory:stock:; private DefaultRedisScriptLong buildDeductScript() { DefaultRedisScriptLong script new DefaultRedisScript(); script.setLocation(new ClassPathResource(lua/stock_deduct.lua)); script.setResultType(Long.class); return script; } public Long deductStockFromRedis(Long skuId, Integer quantity) { String key STOCK_KEY_PREFIX skuId; return stringRedisTemplate.execute( buildDeductScript(), Collections.singletonList(key), String.valueOf(quantity) ); } }這個(gè)方案把“判斷庫存是否充足”和“扣減庫存”放在同一個(gè) Lua 腳本中Redis 會(huì)原子執(zhí)行整個(gè)腳本不會(huì)出現(xiàn)超賣。但要注意Redis 預(yù)扣減成功之后業(yè)務(wù)還沒有真正落庫。如果后續(xù)訂單創(chuàng)建失敗需要調(diào)用釋放腳本回補(bǔ) Redis 庫存同時(shí)還要考慮到數(shù)據(jù)庫庫存最終扣減。這里有一個(gè)經(jīng)典的異步雙寫問題先更新 Redis再發(fā) MQ 消息異步扣減數(shù)據(jù)庫庫存如果 MQ 消費(fèi)失敗則需要定時(shí)任務(wù)對(duì)賬。推薦的整體鏈路是請(qǐng)求進(jìn)來先執(zhí)行 Redis Lua 扣減預(yù)庫存??蹨p成功創(chuàng)建訂單發(fā)送“庫存扣減消息”。MQ 消費(fèi)者收到消息后在數(shù)據(jù)庫事務(wù)中扣減真實(shí)庫存并記錄流水。如果數(shù)據(jù)庫扣減失敗則回補(bǔ) Redis 庫存并記錄失敗日志。定時(shí)任務(wù)比對(duì) Redis 庫存、數(shù)據(jù)庫庫存和流水發(fā)現(xiàn)不一致就告警并人工處理。這種方案結(jié)構(gòu)更復(fù)雜但能支撐較高的并發(fā)。5.5 消息隊(duì)列異步扣減通過消息隊(duì)列把同一個(gè) SKU 的扣減請(qǐng)求串行化也是一種常見的防超賣方式。例如使用 RabbitMQ 或 RocketMQ訂單服務(wù)在下單時(shí)發(fā)送一條扣減消息消息里包含 SKU ID 和數(shù)量。消費(fèi)端可以保證同一 SKU 的消息串行消費(fèi)這樣即使服務(wù)層沒有加鎖數(shù)據(jù)庫也不會(huì)同時(shí)扣減同一個(gè) SKU。這種方式適合削峰但會(huì)引入消息中間件增加架構(gòu)復(fù)雜度。訂單狀態(tài)下發(fā)后用戶要等待消息處理完成才能看到庫存結(jié)果。所以一般會(huì)和 Redis 預(yù)扣減配合使用而不是完全依賴消息隊(duì)列保證不超賣。6. 完整項(xiàng)目代碼示例為了讓整套邏輯更完整這里把核心代碼文件串起來。以下代碼基于 Spring Boot MyBatis Plus重點(diǎn)看庫存更新 SQL 與事務(wù)控制。6.1 pom.xml 依賴!-- 文件路徑pom.xml -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies注意不同 Spring Boot 版本對(duì) MyBatis Plus 的兼容性不同。如果使用 Spring Boot 3需要把javax換成jakarta并選擇適配 Spring Boot 3 的 MyBatis Plus 版本。6.2 application.yml 配置# 文件路徑src/main/resources/application.yml server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/inventory_demo?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: root redis: host: localhost port: 6379 database: 0 mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0如果你的 MySQL 密碼、Redis 密碼與示例不同請(qǐng)改成自己的配置。map-underscore-to-camel-case: true可以讓數(shù)據(jù)庫字段sku_id自動(dòng)映射到 Java 屬性skuId。6.3 啟動(dòng)類與實(shí)體類// 文件路徑src/main/java/com/example/inventory/InventoryApplication.java SpringBootApplication MapperScan(com.example.inventory.mapper) public class InventoryApplication { public static void main(String[] args) { SpringApplication.run(InventoryApplication.class, args); } }// 文件路徑src/main/java/com/example/inventory/entity/Inventory.java Data TableName(inventory) public class Inventory { TableId(type IdType.AUTO) private Long id; private Long skuId; private Integer totalQuantity; private Integer lockedQuantity; private Integer availableQuantity; private Integer version; }// 文件路徑src/main/java/com/example/inventory/entity/InventoryFlow.java Data TableName(inventory_flow) public class InventoryFlow { TableId(type IdType.AUTO) private Long id; private Long skuId; private String orderId; private Integer changeType; private Integer quantity; private Integer beforeQuantity; private Integer afterQuantity; private String remark; }6.4 Mapper 接口// 文件路徑src/main/java/com/example/inventory/mapper/InventoryMapper.java Mapper public interface InventoryMapper extends BaseMapperInventory { Update(UPDATE inventory SET locked_quantity locked_quantity #{quantity}, available_quantity available_quantity - #{quantity}, version version 1 WHERE sku_id #{skuId} AND available_quantity #{quantity} AND version #{version}) int lockInventory(Param(skuId) Long skuId, Param(quantity) Integer quantity, Param(version) Integer version); Update(UPDATE inventory SET total_quantity total_quantity - #{quantity}, locked_quantity locked_quantity - #{quantity} WHERE sku_id #{skuId} AND locked_quantity #{quantity}) int deductInventory(Param(skuId) Long skuId, Param(quantity) Integer quantity); Update(UPDATE inventory SET locked_quantity locked_quantity - #{quantity}, available_quantity available_quantity #{quantity} WHERE sku_id #{skuId} AND locked_quantity #{quantity}) int releaseInventory(Param(skuId) Long skuId, Param(quantity) Integer quantity); }這里不額外定義InventoryFlowMapper為了節(jié)省篇幅流水寫入在 Service 中通過insert方式完成。你也可以創(chuàng)建一個(gè)InventoryFlowMapper繼承BaseMapper。6.5 Service 完整實(shí)現(xiàn)// 文件路徑src/main/java/com/example/inventory/service/InventoryService.java Service public class InventoryService { Resource private InventoryMapper inventoryMapper; Transactional(rollbackFor Exception.class) public boolean lockStock(Long skuId, Integer quantity, String orderId) { Inventory inventory getInventoryBySkuId(skuId); int rows inventoryMapper.lockInventory(skuId, quantity, inventory.getVersion()); if (rows 0) { throw new RuntimeException(庫存不足或版本沖突請(qǐng)重試); } saveFlow(skuId, orderId, 1, quantity, inventory.getAvailableQuantity(), inventory.getAvailableQuantity() - quantity, 下單鎖定庫存); return true; } Transactional(rollbackFor Exception.class) public boolean deductStock(Long skuId, Integer quantity, String orderId) { inventoryMapper.deductInventory(skuId, quantity); Inventory inventory getInventoryBySkuId(skuId); saveFlow(skuId, orderId, 2, quantity, inventory.getAvailableQuantity(), inventory.getAvailableQuantity(), 支付成功扣減庫存); return true; } Transactional(rollbackFor Exception.class) public boolean releaseStock(Long skuId, Integer quantity, String orderId) { Inventory inventory getInventoryBySkuId(skuId); int rows inventoryMapper.releaseInventory(skuId, quantity); if (rows 0) { throw new RuntimeException(釋放庫存失敗); } saveFlow(skuId, orderId, 3, quantity, inventory.getAvailableQuantity(), inventory.getAvailableQuantity() quantity, 訂單取消釋放庫存); return true; } public Inventory getInventoryBySkuId(Long skuId) { Inventory inventory inventoryMapper.selectOne( new LambdaQueryWrapperInventory() .eq(Inventory::getSkuId, skuId) ); if (inventory null) { throw new RuntimeException(SKU不存在); } return inventory; } private void saveFlow(Long skuId, String orderId, Integer changeType, Integer quantity, Integer beforeQuantity, Integer afterQuantity, String remark) { InventoryFlow flow new InventoryFlow(); flow.setSkuId(skuId); flow.setOrderId(orderId); flow.setChangeType(changeType); flow.setQuantity(quantity); flow.setBeforeQuantity(beforeQuantity); flow.setAfterQuantity(afterQuantity); flow.setRemark(remark); inventoryFlowMapper.insert(flow); } }如果你的項(xiàng)目沒有注入InventoryFlowMapper記得在 Service 中補(bǔ)充定義Resource private InventoryFlowMapper inventoryFlowMapper;并且創(chuàng)建對(duì)應(yīng)的 Mapper// 文件路徑src/main/java/com/example/inventory/mapper/InventoryFlowMapper.java Mapper public interface InventoryFlowMapper extends BaseMapperInventoryFlow { }6.6 Controller 示例// 文件路徑src/main/java/com/example/inventory/controller/InventoryController.java RestController RequestMapping(/inventory) public class InventoryController { Resource private InventoryService inventoryService; GetMapping(/get) public Inventory getInventory(Long skuId) { return inventoryService.getInventoryBySkuId(skuId); } PostMapping(/lock) public String lock(RequestBody LockRequest request) { inventoryService.lockStock(request.getSkuId(), request.getQuantity(), request.getOrderId()); return success; } PostMapping(/deduct) public String deduct(RequestBody LockRequest request) { inventoryService.deductStock(request.getSkuId(), request.getQuantity(), request.getOrderId()); return success; } PostMapping(/release) public String release(RequestBody LockRequest request) { inventoryService.releaseStock(request.getSkuId(), request.getQuantity(), request.getOrderId()); return success; } Data public static class LockRequest { private Long skuId; private Integer quantity; private String orderId; } }到這里一套基于數(shù)據(jù)庫事務(wù)條件的庫存閉合鏈路已經(jīng)跑通。你可以把項(xiàng)目啟動(dòng)后按照 4.5 中的請(qǐng)求示例測(cè)試。7. 常見問題與排查思路在實(shí)際開發(fā)中庫存模塊的高頻問題往往不是代碼寫不出來而是并發(fā)或者數(shù)據(jù)一致性出問題。下面整理了一份排查清單。問題現(xiàn)象常見原因解決思路庫存扣成負(fù)數(shù)先查庫存再更新沒有原子條件使用條件更新available_quantity quantity樂觀鎖沖突導(dǎo)致下單失敗并發(fā)高版本號(hào)頻繁不匹配增加重試機(jī)制或切換悲觀鎖/Redis Lua鎖定庫存后訂單未支付庫存不釋放沒有超時(shí)釋放機(jī)制增加訂單超時(shí)自動(dòng)取消任務(wù)并調(diào)用釋放庫存接口Redis 預(yù)扣減成功但數(shù)據(jù)庫庫存最終沒扣MQ 消費(fèi)失敗或漏發(fā)消息增加定時(shí)對(duì)賬用流水表比對(duì)待扣減記錄庫存流水與庫存表不一致更新庫存和寫入流水不在同一事務(wù)確保庫存更新、流水插入在同一個(gè)Transactional內(nèi)重復(fù)扣減庫存接口沒有做冪等控制使用訂單號(hào)或業(yè)務(wù)單號(hào)做唯一索引重復(fù)請(qǐng)求直接拒絕查詢庫存很慢缺少索引或全表掃描為sku_id建唯一索引流水表建order_id/sku_id索引同一 SKU 并發(fā)下單時(shí)吞吐量低使用行鎖或悲觀鎖阻塞使用 Redis 預(yù)扣減 MQ 異步落庫如果遇到庫存異常建議排查順序如下查庫存流水找對(duì)應(yīng)order_id下的變更記錄。對(duì)比流水中before_quantity和after_quantity確認(rèn)變化量是否連續(xù)。查 Redis 當(dāng)前庫存和數(shù)據(jù)庫庫存看兩者是否一致。查服務(wù)日志重點(diǎn)看數(shù)據(jù)庫更新影響行數(shù)是否為 0。如果發(fā)現(xiàn)流水缺失檢查事務(wù)是否回滾或者是否繞過了庫存服務(wù)直接更新數(shù)據(jù)庫。8. 最佳實(shí)踐與工程建議做完一個(gè)基礎(chǔ)庫存模塊后想在項(xiàng)目里真正穩(wěn)定運(yùn)行還需要注意下面這些工程問題。第一所有庫存變更必須走同一個(gè)庫存服務(wù)。很多系統(tǒng)出現(xiàn)庫存不一致是因?yàn)椴煌K各寫各的UPDATE inventory語句。有的在訂單服務(wù)扣有的在售后服務(wù)扣有的直接在 DB 管理工具里手工改。建議所有庫存操作都收斂到獨(dú)立的 inventory 服務(wù)或獨(dú)立 Service 中方便統(tǒng)一加鎖、統(tǒng)一寫流水、統(tǒng)一監(jiān)控。第二庫存流水要設(shè)置唯一約束和冪等鍵。比如用order_id change_type sku_id作為業(yè)務(wù)冪等鍵防止消息重復(fù)消費(fèi)、接口重試導(dǎo)致重復(fù)扣減??梢越oinventory_flow增加唯一索引ALTER TABLE inventory_flow ADD UNIQUE KEY uk_order_change_sku (order_id, change_type, sku_id);第三庫存表更新時(shí)盡量使用行級(jí)條件更新避免“查出來再判斷”的寫法。哪怕只是簡(jiǎn)單扣減也要習(xí)慣把庫存充足條件寫到 SQL 的WHERE中。第四引入 Redis 后要考慮緩存與數(shù)據(jù)庫的一致性問題。建議采用以下策略啟動(dòng)或運(yùn)營(yíng)編輯庫存后主動(dòng)刷新 Redis 庫存。Redis 庫存設(shè)置合理過期時(shí)間比如 30 分鐘過期后回源數(shù)據(jù)庫。每次數(shù)據(jù)庫庫存扣減成功后刪除 Redis 緩存讓下一次讀取重新加載。定時(shí)任務(wù)每 5 分鐘掃描 Redis 庫存和數(shù)據(jù)庫庫存差異異常時(shí)告警。第五庫存扣減失敗一定要有明確的錯(cuò)誤碼。不要說“系統(tǒng)繁忙”至少區(qū)分庫存不足商品不存在重復(fù)操作庫存服務(wù)超時(shí)這樣前端和客戶端才能做差異化提示。第六生產(chǎn)環(huán)境中的庫存調(diào)整必須走審批和審計(jì)。運(yùn)營(yíng)手工調(diào)整庫存是風(fēng)險(xiǎn)很高的操作建議提供獨(dú)立的管理端接口操作記錄寫入操作日志并且不能直接連數(shù)據(jù)庫修改業(yè)務(wù)表。第七事務(wù)超時(shí)和數(shù)據(jù)庫連接需要注意。悲觀鎖方案中如果事務(wù)內(nèi)有遠(yuǎn)程調(diào)用很容易出現(xiàn)長(zhǎng)事務(wù)。建議庫存事務(wù)內(nèi)只做數(shù)據(jù)庫操作不要嵌套外部 HTTP 請(qǐng)求。遠(yuǎn)程調(diào)用放在事務(wù)提交后再執(zhí)行。9. 總結(jié)與學(xué)習(xí)路線本文圍繞庫存管理完整梳理了從數(shù)據(jù)模型、表設(shè)計(jì)到庫存鎖定、扣減、釋放的落地流程也分析了樂觀鎖、悲觀鎖、Redis Lua 預(yù)扣減和 MQ 異步消峰幾種主流并發(fā)方案。你可以根據(jù)項(xiàng)目規(guī)模選擇合適的方案中小系統(tǒng)先用數(shù)據(jù)庫條件更新即可高并發(fā)場(chǎng)景再逐步引入 Redis 和消息隊(duì)列。接下來可以繼續(xù)學(xué)習(xí)這些方向訂單超時(shí)自動(dòng)取消結(jié)合延遲消息或定時(shí)任務(wù)釋放庫存。庫存對(duì)賬系統(tǒng)通過流水表每日核對(duì)訂單與庫存數(shù)據(jù)。分布式事務(wù)跨服務(wù)和跨庫時(shí)如何保證庫存與訂單一致。多倉庫庫存在庫存模型中增加倉庫維度做倉配庫存管理。庫存盤點(diǎn)結(jié)合 Redis 和數(shù)據(jù)庫實(shí)現(xiàn)高并發(fā)盤點(diǎn)邏輯。在實(shí)際項(xiàng)目中不建議一上來就堆 Redis、MQ、分布式事務(wù)。先把單庫事務(wù)版本的庫存鏈路跑通再把 Redis 預(yù)扣減引入熱點(diǎn)商品最后根據(jù)業(yè)務(wù)體量決定是否引入異步隊(duì)列。這種循序漸進(jìn)的方式更容易排查問題也更容易保證系統(tǒng)穩(wěn)定。如果這篇文章對(duì)你有幫助可以收藏備用。下次遇到庫存超賣、鎖庫存失敗或者流水對(duì)不上時(shí)按照本文的思路一步步排查大多數(shù)問題都能快速定位。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91国产丝袜白虎| 亚洲日韩美国人妻| 99久re热视频精品98| 久久婷婷亚洲欧| 69麻豆天美| 国产热RE99久久6国产精品首| 亚洲激情色片| 中文字幕国产| 91爱看| 免费A片三p视频| 色色婷婷丁香| 亚洲国产天堂| 欧美少妇熟女| 中文字幕蜜乳av| 五月天婷婷色| 久久岛国| 91人妻丝袜无码| 在线97视频| 天天舔天天| 日本久久超碰| 色哟哟-国产专区| 人人弄人人摸| 国产精品久久久999| 人人性爱视频免费| 人人噜夜夜操| 三级网色| 亚洲中文sv| 色吧五月| V A在线| 天天摸夜夜摸| 性影在线视频| 久久风骚城市人| 99这里都是精品| 国产 日韩,欧美 自拍| 欧插网站| 欧美,日韩综合久久| 日韩资源网| 久草免费在线一区二区| 色吊丝 日日骚 清纯唯美| 午夜丁香| 欧美色涩| 亚州色阁| 久久久精品九| 97色婷婷| 狠狠操,使劲操| 美女大乳久久久久久久女人18| 国产精品嫩草影院午夜两性| 亚洲高清无码免费观看视频| 秋霞操逼片| 精品少妇后入一区二区三区四区人妻巨乳| 99在线精品视频| 69精品少妇一区二区三区蜜桃| 国产精品99999| 刺激精品视频| 簧片免费看视频| 91亚洲最新在线| 超91综合网| 亚洲AV麻豆Aⅴ无码电影一| 九九九久千久久激情蜜桃在线看 | 日韩av不卡在线观看| 久久久久久裸体| 久久99视频| 思思热国产高清| 伊人伊人LD| 自慰白浆在线观看| 黑人猛交| 毛片麻豆91糖心精品毛情片| 久久综合乱子伦国产免费| 日韩精品人妻系列无码天堂| 777琪琪午夜免费A片| 久久精品99| 成人AV素股で擦久久| 强奸乱伦大香蕉| 欧美日韩久久精品爱爱| 在线中文AV| 一区二区偷拍拍视频| 一区二区三区高清天码| 91爱啪| 欧美精品 - 91爱爱| 久久久久9| 久久草草亚洲蜜桃臀| 综合大香蕉美。| 亚洲国产一区二区三区在线| 久精品无码av一区二免费国产在线观看| 久久人妻熟女一区二区| 91美女看B| 亚洲另类久操网| 精品性爱一二三区| 欧美性爱综合,免费| 在线国产一区二区av| 色噜噜狠狠色综无码久久合欧美| 亚洲色综网| 超碰天天久久79| 精品久久久亚洲AV成人网站| 中文字幕亚洲永久精品| 激情综合网亚洲| 综合网亚洲1| 久久超碰97中文字幕| 婷婷久久五月| 欧美中出1| 日韩性爱1级片视频| 美女诱惑一区| 黑人性欧美| 成人欧美日超碰| 顶级少妇BT天堂| 日本在线一二| 99热免费| 先锋精品av色鲁| 小情侣高清国产在线视频| 中文字幕精品一区欧美| 国产精品ⅴ无码大片在线看.| 国产成人无码久久精品| 日人妻视频91| 国产91乱伦| 岛国黄片网站| 久久国产成人精品国产成人亚洲 | 操逼逼一区视频| 诱惑网综合| 福利天天都操| 9ⅰ久久久天天| 歐美性天天| 爱欲AV| 久操99| 四虎永久在线精品免费网址| 欧美精品另类人妖xxxx| 久久亚洲天天做| 超碰97男人| 欧洲中文字幕| 60秒免费小视频| 97超级欧美| 四虎884a| 视频在线中文字幕| 天天干夜夜操一区二区| 日韩欧美午夜视频在线| 自拍大香蕉乱插| 神马久久久久久伦理片| 岛国在线一区二区三区| 成人5码视频| 亚洲AV秘 精品久久老牛影视| 黄色电影在线播放综合网站| 亚洲精品第一| 久久99网站| 天天综合色| 九九成人视频| 日韩三级在线观看mp4| 青青久操| 深夜激情| 亚洲欧美天堂| 亚洲乱伦图片视频| www久久99| 超碰人人妻| 啊…啊…操我用力操我| 国产精品不卡一区二区三区| 亚洲图片视频小说| 毛片一区二区| 曰韩精品视频一区二区| 丁香五月激情综合国产| 天天欧美欧美亚洲网| 亚洲中文字幕一区二区| 日韩在线AB| 国产女人与拘做受视频免费| 色五月婷婷在线| 密桃99999| 99热这里只有精| 91色艳| 欧洲乱码一区二区| 欧美最大综合网| 中国91AV| 999精品国产高清一区二区| 欧美综合娱乐久久| 久热伊人| 亚洲色图综合网| 亚洲资源一区| 美国黄片aaa| 国产女同性恋视频| 九九九只有精品| 俄罗斯及免费在线看| 熟女五十路一区二区三| 蜜桃久久一区二区三区| 免费亚洲国产精品久久一区| 天天综合网在线观看| av在线不卡一区二区三区| 婷婷五月综合在线| 97bbn| 97极品无码| av日韩国产一区二区| 狼人久草| 极品色电影院| 国产婷婷综合在线观看| 伊人五月天| 九热大香蕉| 成人情色综合网| 中文AV制服乱伦| 日本高清有码网址视频| 中文字幕视频2区| 免费99精品国产自在在线| 欧美日韩亚洲国产中文永久天天看| 国产女同在线观看视频| 99e久久国产精品| 久久五十路熟女人妻| 中文字幕99999| 色妺妺AⅤ| 亚州熟女乱伦| 丁香五月天堂网| 中文字幕精品人妻丝袜| 欧美丝袜美女电影一二三四区| 国产人妻天天干精品| 久操B网| 精品丰满熟妇人妻一区| 亚洲 日韩 丝袜 熟女 变态| 二三四区精品| 婷婷在线视频在线观看| 爆乳免费黄网站| 色97欧美| av凤凰久久久| 久久久久人| 日韩操逼HD| 欧美日韩m| 精品性爱一区二区| 精品无码一二三四区| 2021国产成人精品久久| 精品无码一区二区| 亚洲黑人在线| 麻豆2区1区天美| 亚洲激情久久久伊人综合| 亚洲综合中文字幕有码| 全国男人天堂网| 99日精品欧美国产| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 青青草华人在线欧美在线| 美国一区二区三区视频| 人妻熟女一区二区| 国产激情久久久| 日韩欧美亚洲一区二区三区影院| 欧美天堂超碰97| 你懂的在线观看区国产| 看黑丝美女操逼青青网站| 中文字幕在线免费观看2| 九九九网页| 懂色av一区二区三区天美传媒| 99热超碰在线| 欧美性暴力| 精品国产乱码久久久久久久久1 | 岛国视频一二三区| 欧美传媒一区| 国模精品娜娜一二三区 | 亚洲精品97| 中文高清一区二区的| 蜜臀久久99精品久久久久久婷婷| 91狠婷| 国产日韩久久| 国产60区。| 久久欲| 日韩无码AB| 九月丁香综合网| 夜夜嗨老熟女AV一区二区三区| 秋霞曰韩R级| 精品亚洲国产成人AV制服丝袜| 日韩欧美蜜桃精品久久中文字幕久久| www.色操逼| 91精品久久久久| 黄色污污污污污污网站| 蜜乳AV.COM| 丝袜天堂网| 欧美在线播放aaaa| 永久电影三级在线观看| 日日黄色三级网站| av天堂手机版追回| 欧美色交| 欧美综合另类| 欧美在线啊啊啊 | 中文字幕乱偷人妻久久艾草网| 免费在线黄片视频| 欧成人精品H无码| 鸥美精品一区二区久久婷婷| 久久99午夜精品一区人妻| 99爱爱| 色图四区| 极品久久久久久久久久久久久久| 日韩成人综合网| 3PAV乱伦视频| 中国的操老妇女| 天堂种子在线www网资源| 日日摸日日碰夜夜爽视频| 香蕉一区二区三区在线视频| 香蕉人人操tv| 日韩av在线精品观看| 熟女网站最新| 色999人与兽| 国产99久久99热这里只有精品15| 日韩一级二级在线| 十八禁视频一区二区| 91爱欧美| www老逼91| 久久亚洲AV成人精品无码| 超碰久超碰久| 色综合20p| 色九九久九九| 欧美狠狠操| 一级啊性爱在线视频| 神马九九| 欧美91网| 香蕉免费一区二区三区不读 | 品亲网欧美品亲网| 欧美一级欧美三级在线观看| 蜜臀少妇一区二区| 国内精品伊人久久久久影院会| 亚洲无992tv| 亚洲AV人人澡人人爱| 久视频在线观看| 婷婷99狠狠躁天天躁| 亚洲精品乱码线路中文字幕| 欧美色就是色| 性色综合网| 在线五区| 91综合国产精品| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 久操视频资源站公开| 亚洲中文字幕熟女| 久久岛国| 亚洲精品无码少妇久久| 十八岁啪啪视频免费看| 韩日性爱av| 51国产午夜精品视频| 美女91AV| 91伊人| 国产精品午夜福利| 久久久无码精品人妻二区| 亚洲资源网| 国产超碰在线一区| 亚洲熟妇丝袜在线观看| 91啪9色| 亚码激情| 国产丝袜美女诱惑| 老女人爆菊| 亚洲天堂区| 狠狠操狠狠| 亚洲AV无码国产成人| 夜夜影视四色| 国产精品探花在线| 亚洲欧美一区二区三区一猛片| 国产探花精品在线| 亚洲 一区二区 自拍| 免费av在线播放二区| 中文字幕在线观看AV| 日本福利社| 六月婷婷激情| 天天插天天射| 人人操天天爽| 色大香蕉97N| 色婷婷婷五月天激情四射| 中文乱码99| 天天日天天舔东京热| 天天综合网在线| 欧美在线l亚洲| 亚洲熟女乱综合一区二区三区| 亚洲青色欧美| 国产丸一视频| 少妇色欲综合网2| 欧美自拍网| 日韩欧视频| 精品久9| 九九九免费视频| 国产亚洲色停停久久99精品91| 香蕉欧美| 在线视频免费播放一区| 激情开心五月天| 91亚洲黑人| 久久av色| 久久久久亚洲三级电影| 亚洲精品影视老司机| 乱伦系列一区二区| 91蜜臀熟女| 久久97资源 网| 日韩电影天堂视频二区三区| 日韩人人精品| 91高潮| 精品亚洲一区在线观看| 美国日韩黄色片| 99热精品在线在线| 超碰人妻久久人妻中文97| 亚洲综合校园春色| 999综合网| 爽极品影院| 久久久精品国产亚洲AV无码| 久久久久久久久久久人妻| 午夜后入| 亚洲色人阁| 性久久久| 日本大片日本一区二区免费高清| 欧美午夜色妇色鬼| 久久久555| 乱抡国产91| 熟女人妻一区二区三区| 日韩大香蕉| 国产精品美女久久久久AⅤ国产馆| 中国国国产一级特黄毛片| 污啪啪啪视频| 亚洲精品1区| 91熟女丨老女人| 老子午夜伦不卡影院| 三级片网站在线播放| 德国一二三不卡| 另类老少妇| 亚洲无码 国产无码| 欧美性爱1080p| 在线观看AV不卡| 人妻激情在线视频| 日韩一区二区精彩视频| 日本污ww视频网站| 亚洲色悠悠久久88| 国产无码成人无码| 91久久久久久久久18| 精品九九九九九九九| 91色夜| 最新的亚洲无吗| 国产av高清版| 午夜欧美精品久久久| 日本免费中文字幕在线| 伊人色综合超碰| 大香蕉黄色一区| 亚洲综合113页| 精品国产乱码久久久久久网站入口| 人人摸人人添人人操 | 天天色综合天天操| 亚熟hd视频在线| 精品欧美老熟女一二区| 五月天婷婷色色| 91丝袜美腿片| 人人干黄色| 久久欧美1卡2卡3| 欧美性爱超碰97| 欧美日韩性爱操大逼| 欧美日韩婷婷中文| 国产又黄又粗的视频| 在线观看十八禁| 91美| 大香蕉av在线| 蜜臀在线网站| 大伊香蕉在线视频免费| 九九国产热| heyZO天然素人无码AⅤ专区| 一区 欧美 日韩 麻豆| 香蕉视频欧美一卡二卡| 五月丁香啪| 欧美操逼录像国产黄色国产| 五月丁香六月激情综合| 大茄子熟女AV导航| 婷婷色播婷婷| 巨乳特殊服务按摩| 97天堂| 99热欧美| 91熟女熟妇视频网站| 综合亚洲欧美| 亚洲欧美精品一区天堂久久 | 黄色二级片网站| 国产女大学生AV| 欧亚洲精品有视频| 欧美日韩国产成人高清| 久久做97| 淫荡熟女乱伦网| 天天拍天| 精品一区二区成人动漫| 亚91网| 五月激情综合网| 日韩色香| 久久97资源 网| 久久人人爽爽人人爽人人片αV| 无码久久国产| 96免费视频在线| 91在线超高颜值国产| 青青欧洲黑| 日韩欧美中文日韩欧美色| 久久高清无码夜夜操| 日韩不卡a级视频专区| 欧洲亚洲人妻无码久久三区四区| 婷婷五月天激情网| 69视频入口| 性爱AV天堂| 国人欧美精品一区二区| 密臀在线一区尤物| 欧美 亚洲 大香| 精品人妻一区| 麻豆av一区二区| 日韩 人妻 精品| 五月婷网站| 欧美人妖内射| 欧美日韩免费专区在线| 青椒国产97在线熟女| 黄页网站成人免费| 在线视频一区二区传媒| 亚洲九月丁香| 国产深夜福利| 亚洲熟久久| 久久女婷| 91露脸熟女专区| 9 1超碰九色| 亚洲,欧美,春色,另类| 人妻偷拍一区二区三区| 果冻传媒A片一二三区| 一区二区激情国产熟女| 亚洲一区二区三区播放在线| 欧美激情 亚洲色图| 成年男人的天堂| 亚洲欧美在线观看2021| 18禁在线视频| 大香蕉碰碰| 强被迫伦姧在线观看无码网站| 久操影视| 欧美最婬乱婬爆婬性视频| 国产熟女完整版中字| 男人的天堂VA| 男人的天堂在线| 97色碰| 激情抓乳插进去啪啪啪日韩 | 欧美熟妇人体| 色婷婷色99国产综合精品| 日韩免费av片高清无码| 97鸡把在线视频| 97自拍一区| 六六久久日韩不卡| www国产天美久久久| 国产精品直播在线观看直播| 黄色av一区二区在线| 国产精品 视频| 91亚洲狠狠色| 天天影视射综合网| 欧美 中文字幕 一区| 丁香九月激情啪| 中文字幕一区二区日韩网| 97超碰色色| 日韩无码服务区| 97国产天堂岛| 亚洲色图20p| 96精品在线| 免费观看啪视频| 国产av又色又爽又黄| 家庭乱伦麻豆| 青娱乐91| 久久三区四区| 色偷偷综合91久久噜噜| 日本黄页视频在线观看| 色欲人妻一区二区在线| 美女露胸露奶头| 色激情五月天| 九九热超碰| 黄片在线免费在线观看| 精品v日韩欧美国产| 成全在线观看免费观看| 伦激情人妻另类人妻| A片A5445444| 伊人影院日本| 超碰免费人妻人人| 天天综合网1| 92福利社视频| 免费伦费视频在线观看| 中文字幕91页| 欧美黄色片在线播放| 18禁精品网站在线看| 看日韩黄片| 亚洲自拍天堂| 人人干人人搞人人摸| 99久久com免费视频′| 久久久久精| 国产免费大片| 啊啊啊好疼| 成人日韩中文字幕| 日韩伦理视频| 曰本精品久久久| 五月天伊人| 欧美性区| 神马久久啊啊| 影音先锋每日最新资源在线观看| 日日超碰亚洲| 中文操逼字幕| 色色网91| 日韩在线观看字幕精品| 免费一级欧美片片线观看| 国产高潮AA片免费看| 五月婷久久| 亚洲麻豆精品二区三区| 国产91 丝袜在线播放00-百度| 日韩欧美视频青青| 色妹子A V| 夜夜操天天肏| 天操老女人| 伊人久久亚洲色欲综合网站 | 十八禁啪啪视频| 懂色Av| 手机午夜电影神马久久| 久久久亚洲高清不打码| 久久一区二区三区入口| 人妻少妇视频在线播放| 国产欧美一区二区| 亚洲精品国产av天美传媒| 超碰9 7女人| 久久αⅴ| 五十路六十路七十路熟婆| 3028国产精品| 日本免费中文一区二区三区四区| 精品v1区| 久久久久久久综合,国产| 狠狠躁伊人中文字幕| 大学生美女口爆| 久久久久成人蜜桃精品| 碰超人人在线一区二区三区| 人人干人人操人人爱| 亚洲无码色| 97在线青| 懂色av色欲av蜜臀av| 九九热精品| 欧美性生活内射| 亚洲高清无毛一区二区| 91在线视频免费中出| 中文啪啪视频| 激情视频一二三| 麻豆AV一区二区| Sekablack无码一区| 97超碰超碰| 中文日韩欧美熟| 精品久久久久久久| 日韩欧美综合激情| 国内精品999| 亚洲欧洲日韩天堂av| 日本操BAV| 97干com| 99国产精品自在自在| 韩国三级色呦呦| 秋霞免费AV| 亚州综合电影| 国产sv美女内射| 婷婷丁香九月| 日韩欧美麻豆大片| 综合天天。| 成人五级久久| 3571色综合一区二区二区| 亚洲综合69| 国产1024在线播放| 日本久久99| 狠操91,com| 青娱乐福利99| 蜜臀av在线播放一区二区三区| 学生妹天天看| Sekablack无码一区| 国产刺激视频| 99色热| 亚洲97久久精品亚洲| 天天日日日射| 在线不欧美| www.激情| 久久久性少妇| 福利在线观看一区二区| 在线黄色污污网站| 夜夜草天天| 奸色色 男人天堂 天天射| 婷婷10月天青娱乐| 免费在线观看国内色片网站网址| 97日视频| 久久久精品91八戒| 亚洲不卡不卡中文字幕不卡| 大香蕉中文在线| 91操碰| 天美传媒精品久久视频| 久久亚洲精品成人av| 欧美国产操逼| 狠狠色狠狠色狠狠五月| 97超碰久| 夜夜天天噜狠狠爱2021| 欧美 熟女 日韩| 99久国产精品午夜性色福利| 久久精品老司| 欧洲综合无码| 加勒比综合九九99视频在线播放| 12一15性XXXX粉嫩国产| 久久a久久| 成人羞羞视频国产| 天天肏美女| 凹凸精品熟女在线观看| 亚洲91少妇| 91日韩国产欧美亚洲另类精盘州至城都| 色丁香五月婷婷| 国产一线二线三线av| 黑人粗大V S日韩女优视频| 欧美日韩 强奸乱伦| 久久原创中文| 亚洲欧美国产日本一区二区三区| 亚洲区小说| 99色视频| 日韩免费a级毛片无码a∨| 国产欧美一区二区| 欧美大香蕉久| 91老熟女老女人国产老太| 日欧亚洲二三区大片不卡| 中文字幕伊人| 国产又爽又黄| 神马久久久久久久| 操人妻逼91| 26uuu性| 熟女熟妇伦久久影院毛片一区二区| 日本精品不卡一二三区| 亚洲黄色AV电影| 色噜噜人妻av 中文字幕| 日韩免费av片高清无码| 亚洲资源网| 综合一区中亚洲国产成人综合精品 | 一级黄碟在线观看| 精品国产人成在线| 欧美日韩人妻精品一区二区三区 | 日韩97精| 亚洲欧美精品一区天堂久久 | 日本精品成人无码| 亚洲精品97久久| 日韩激情视频| 欧美性爱在线无码| 呦呦一区| 亚洲色丰满少妇高潮| 亚洲精品人妻吞精av| 天天综合官网| 欧美少妇色综合| 激情四射五月天| 亚洲人妻中文在线视频| 九草九九九| 97午夜剧场日韩| 园内精品自拍视频在线播放| 91中出视频| 自拍视频大全亚洲专媒视频/一区二区三区 | 国产精品激情久久久久久久| 91色婷婷综合久久中文字幕二区| 日本大香蕉综合网红本杳社区| 观看免费区二区三区二| 欧美成人一级免费电影| 91综合中文字幕| 久久婷婷亚洲欧| 婷婷五月天激情四射| 人人干黄色| 欧美精品系列| 激情终合网| 激情99| 东北丰满熟女国产一区| 好爽免费视频| 福利大香蕉| 美女高潮视频91| 久久人人爽人人爽人人片Ⅴ| 精品高清av中文字幕| 蜜臀网址在线| 亚洲情色一区二区三区| 爱爱60秒免费视频| 无码高清专| yaouchengrenav| 好湿好紧视频| 欧美视频边做饭边橾| 韩日自拍| 99九九久久| 人、人、摸,人、人、草| 丁香激情网| 成人AV素股で擦久久| 久久这里只| 亚洲男人的天堂亚洲| 操逼短片| 久久精品国产亚洲AV清纯| 亚洲成熟国产精品美女| 东方亚洲在线操逼天堂| 九九九九九九九九九国产精品| 午夜福利在线合集| 日本五区不卡| 蜜臀99久久精品久久久懂爱| 九九色婷婷| 色偷偷综合91久久噜噜| 粉嫩av在线一区二区| 日产操逼| 欧美中出1| 精品少妇99| 九九九综合精品| 男人的天堂不卡一区二区| 久久99午夜精品一区人妻| 午夜福利一区二区影院| 欧美色偷偷| 偷偷人人精品女女久久| 欧美淫乱视频| 亚洲怡春院| 欧美色图91p| 热久日综合| 欧美久久婷婷| 国内操逼视频二区| 成人日韩中文字幕| 亚洲av总站| 熟女在线视频| 亚洲天堂另类小说男人| 四虎永久在线精品免费网址| 国产欧美日韩女同性恋ww喷水精品| 五月色网| 狠狠色色| 激情文学网伊人| 69超碰综合| 国产成人亚洲精品自产在线| 五月天婷婷欧美三区| 丁香五月婷婷五月| 激情综合网激情五月天| 亚洲第一综合| 亚洲丝袜色| 成人在线视频二区| 九九热男人天堂| 啊啊啊啊啊操我视频| 国产一区二区三区不卡手机在线| 夜夜爽妓女| 亚州乱码中文字幕综合久久久| 日韩欧美成人大香蕉| 吉川爱美98堂在线| 蜜桃视频一区二区三区| 欧美综合 站| 国产后入清纯| 久久久无码精品人妻二区 | 精品九区| 国产精品免费久久久久久久久久| 狠狠婷婷亚洲中文综合久久| www.亚洲黄色| 日本免费人成视频播放120秒| 伊人久久大香线蕉无码| 国产精品成人蜜臀AV在线| 国产福利第一视频| 日韩有码一区三区| 亚洲91亚洲| 涩涩久久精品| 99热在线只有精品| 无码78| CCYY草草影院地址入口| 亚洲 自拍偷拍 欧美| 日韩AV无码中文一区二区| 国产精品秘 福利姬在线观看| 99爱精品| 久草资源欧美在线视频| 99国内熟女露脸视频| 999国产精品999久久久久久| 国产性爱强奸乱伦大全| 美女尤物人人操| 亚洲av乱伦色图网站| 97亚洲综合电影| 欧美韩国你懂得在线| 久久精品国产97欧美精品亚洲 | 1769一区二区| 屌逼传媒| 人人噜夜夜操| 熟妇人妻精品一区二区| 18禁在线视频| 黄色av一区二区在线| 国产视频一区二区在线| 久久久久久久9最新免费视频观看| 青青草公开在线免费不卡视频| 中文字幕av亚洲精品| 国产美女mm131爽爽爽爽| 久久黄黄| 91N综合网在线| 91美女视频| 白嫩国模丰满一二三区| 久久久久久久少妇| 蜜臀在线看片| 中国操逼无码| 九九热超碰| 中国小夫妻勾搭露脸淫荡对白| 超碰碰97资源站| 最新三级网址| 欧美九九爱| 密臀国产在线| 欧美亚洲第一页| 超碰av人人人| 亚洲伊人久久精品影院| 一区超碰一区| 欧美性爱第1 页| 九九无码视频| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 粉嫩久久久极品| 精品国产av一区二区三区四区入口 | 白嫩国模丰满一二三区| 国产伦精品免编号公布| 九九九九九九九九九九九蜜桃| 2017亚洲天堂| 女同性恋久久| 婷婷三区| 精品一区99999| 国产97在线 | 亚洲| 欧美成人AⅤ大片在线观看| 亚洲成人av色网| 免费国产| 7777奇米影视久久| 国产伦精品一区二区三区视频女| 亭亭在线资源| 日韩av免费一级电影| 女优免费一区二区永久| 亚洲91射| 欧美呦呦性爱| 麻豆亚洲Av成人无码一区精品| 久久精品一区二区三区蜜桃臀| 中文字幕,人妻,日韩| 麻豆 欧美 日韩| 九九九九一区| 黄色视频特级毛片| 亚洲视频二区 | 熟妇色99| 成人丁香五月| 91久久久久| 操逼视频亚洲| 色天堂在线观看| 久久东京伊人一本到鬼色| 国产污视频麻豆传媒一区二区 | 26uuu国产| 0755午夜福利视频| 国模吧 一区二区三区| 欧洲大香蕉| 中国一级操逼视频| 韩国三级三级BD在线| 中日韩免费看男女操逼大全| 久草大| 国产毛片毛片4p懂色| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 91精品久久久久久77777| 狠狠操狠狠燥| 福利在线观看一区二区| 青青草久久在线| 乱伦AVxx| 91精品婷婷国产综合久久竹菊| 午夜国产乱伦视频| 日日夜夜草草草| 国产av强奸美女| 伊人一区二区三区| 国产精品无码久久久久2025| 欧美国产一区二区三区麻豆传媒| 国内精品a| 91精品国久久久久久无码| 92性色国产午夜福利在线661| 久久久久久久久九九久孕交| 国产精品久久久久久久电影渣男| 亚洲色图国产另类| 13小男生GAY自慰脱裤子| 一区二区三区视频| 狠狠干妹子| 色欲天天综合网| 亚洲美女精品九九视频| 日本在线一二| 亚洲欧美天堂| 久草精品国产蜜臀| 国产Av超碰| 天天影视网色欲色香| 久久久 国产精品| 欧亚 另类 久| 99热色这里只有精品| 另类亚洲一区二区三区| 青青草视频爽一爽| 国产操逼视频在线观看| 大屁股国产在线视频| 亚欧国产无码精品在线| 国产9l 大屁股| 天天干天天日天天射黄色| 国产又色又粗又黄又爽| 亚洲色情在线影视| 国产97视频免费观看| JuliaAnnXXX888| 96精品在线| 国产丝袜美女在线一区| 天天摸天天舔天天操| 亚洲天堂 视频你懂的| 国产97色在线| 丝袜狠狠草尤物人妻av91| 日韩亚洲中文字幕在线| 蜜屁av| 日本999精品视频| 欧美aaaaaaa| 欧美丰满少妇交换91欧美精品| 亚洲男人天堂2019| 超碰国产精品无码| 蜜区区视频79| 婬女免费一二三区A片| 屁股久久久久久| 91精品电影18| 久操网无码在线| 中文字幕乱妇免费视频| 色999偷自拍拍| 日韩一级片| 国产第12页| 综合五月天| 欧美久久婷婷| 99精品在线| 成人无遮挡毛片免费看| 蜜臀久久99精品久久久久久成人小说 | 毛片17S| 国产AV久久久蜜爱影集| 成人线上超碰| 欧美丰满少妇交换91欧美精品| 欧美三级免费伊人| 国产精品久久伊人| 老子午夜伦不卡影院| 韩日欧亚a级| 色男人色天堂东京热| 久操黄色视频| 国产精品成人蜜臀AV在线| 欧美色www亚洲国产阿娇要播| 亚洲文学偷乱拍啪啪啪啪| 天天射网| 五月天久久久| 欧美日韩在线国产在线| 丰满人妻-区二区三区| 亚洲自拍欧美色综合| 成 人 影视 一区 二区 三区 四区| 婷婷中文网| 精品日韩中文在线| 亚洲丝袜诱惑| 97欧美色综合| 久久香蕉超碰97国产精品 | 人人摸人人舔一区二区| 啊…啊…操我用力操我| 人妻一区视频| A级毛片在线看免费| 国产精品久久| 一区二区三区男人的天堂| 品亲网欧美品亲网| 亚洲精品一区二区三区新线路| 久热九九| 精品一区二区成人动漫| 天天操夜夜操狠很操| 无码不卡亚洲成?人片| 9久久久久久| 超碰在线综合97| 亚洲自拍欧美色综合| 欧美大码在线视频| 激情五月天色播| 自拍大香蕉乱插| AAAAAAAAA黄片| 91精品微拍福利| 久久久久99999| 色97欧美| 久久婷婷一区| 亚洲综人| 欧美性五月| 天天综合麻豆视频| 性性欧美| 久久久久78| 天天碰操中国年青熟妇| 欧美久久婷| 一二三啪啪专区| 伊人天堂在线| 欧美日日网| 亚洲……91| 精品精品精品| 欧美久久九九| 97九色人妻| 男人的天堂网免费| 校园春色 男人天堂| 日本综合色图| 99热这里只有精| 屌逼传媒| 99热亚洲天堂| 欧美少妇大量自拍视频在线观看| 久久久啊啊| 亚洲国产一区二区三区在线 | 91丝袜熟女| 男人精品天堂一区| 毛片麻豆91糖心精品毛情片| 日韩美女高潮喷水视频| 粉嫩AV一区夜夜嗨| 超碰久久草| 久久久九九| 理论久久婷婷网8| 久久香蕉国产线看观看亚洲女人 | 97资源制服丝袜| 五月丁香啪| 91原创在线观看| 日本天堂网| 日日黄色三级网站| 久久人妻少妇| 九九九九精品一区| 无码操逼天堂| 久久亚洲色图中文字幕| 欧美综合狠| 四虎影视精品| 亚洲精品国语在线播放| 亚洲日韩精品久久久久一区壹牛| 热久久国产| 日韩 欧美 视频 在线 一区| 国产情侣自拍在线播放| 激情六月天| 色月天AV导航| 蜜桃视频一区二区三区 | 7777奇米影视久久| 粉嫩av在线一区二区| 五月丁香在线| 久久e6只有精品| 成人精品欧洲亚洲| 色网亚洲人| 99久久精品国产系列| 久久亚洲AV无码专区首页| 亚洲aV性爱| 欧美另类色图片| 青娱乐蜜桃臀AV色婷| 日韩人妻精品| 性猛交| 一区二区三区黄片免费观看| 91精品久久久久久77777| 91N欧美| 国产在线精品电影观看| 在线啊啊啊| 另类图片欧美激情综合| 天堂中文资源在线bt| 夜夜中出国产| 欧美性爱网97| 极品色综合| 91网九色蝌蚪操熟女| 无码操逼网| 激情网五月天| 欧美曰韩国产精品| 伊人嫩草| 国产色产精品在线观看| 欧美不卡二区| 色综合美国| 欧美女同在线| 桃花色综合影院| 精品国产乱码久久久久久口爆网站| 中文字幕一区av| 色天堂在线观看| 91 欧美| 户外裸露刺激视频第一区| ′ !γ}丶。。久久精品欧美一区二区三区| 加勒比海成人视频网| 久久超碰com| 美女写真| 69AV女优男人的天堂| 啊啊啊轻点在线观看| 国产成人拍国产亚洲精品| 一区二区三区机械有限公司| 精品九九九九九九九| 久久久精品网| 亚洲一区二区中文字幕| 激情文学网伊人| 青青草色插素人| 色图综合网| 亚洲图片日本AⅤ欧美在线| 亚洲激情网| 一区二区三区四区五区高清无码永久视频| 97超碰逼| 亚洲一二三四区| 欧亚乱色熟女一区二区| 中文字幕55555| 97超碰色色| 在线播放中文字幕| 99热18这里只有精品| 在线中文字幕视频| 色综合久久88色综合久久天天| 干b在线性社区| 试看60秒 爽| 色狠狠色| 青青草五月份天| 黑丝自慰喷水网站| 一区| 亚洲欧美不卡线| 在线日韩视频| 偷拍欧美亚洲| 欧美精品久久久久久久久88| 五月天春色激情网| 9久久精品| 色色激情| 西西美女视频网| 毛片久久|