亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
97在线欧| 亚洲国产欧美日韩人妻日中文| 玖玖视频在线资源一区二区三区| 久日综合网| 亚洲天天操| 日本久久天堂| 91精品人妻一区二区三区蜜桃| 天天操夜夜嗨| 丁香婷婷啪啪| 乱码人妻一区二区三区| 中文字幕中文字幕一区二区| 校园春色亚洲欧洲| 欧美一二三| 高清无码国产亚洲| 国产少妇内射| 91久久久久久久久18| 少妇内射视频| 69精品久久久久中文字幕| 97香焦色区| 九九这里只有精品| 亚洲欧美国产其他二区| 青青草女人天天干| 国产成人无码高清| 美国三级日本三级久久99| 欧美偷拍区| 又大又长又爽| 污色区网站| 91久久精品国产| 狠狠躁伊人中文字幕| 破苞ⅩXXX性无码动漫无码| 97超视频在线观看| 国产精品女久久久久av爽| 免费网站观看www在线观| 国产美女高潮视频| 天美麻豆精品视频99| 夜夜高潮夜夜爽夜夜爱爱一区| 黑人操一区二区| 国产亚洲精品美女| www成人啪啪18秘 免费| 亚洲色图欧美色图在线播放| 免费综合亚洲中文| 国产精品国产精品国产| 日韩AV一区二区三区三州三州| 淫荡网址| 精品中文日韩字幕视频| 亚洲日韩成人性爱视频| 久久久久久久| 欧色综合| 波多野结衣先锋影音| 日本高清熟女久久一区| 人人操人人摸人| 亚洲少妇综合| 男人兔费天堂| 成年人黄色视频免费| 亚洲男人的天堂一区二区| 亚洲在饯| 九九九九九用不成了| 国产东北女人在线视频| 亚洲区小说| 欧美1727免费观看视频| 欧美日韩在线视频网站| 天天日美女的B| 婷婷五月天影院| 欧美丝袜91| 日韩有码一区三区| av日韩国产一区二区| 91美女视频电影| av中文字幕在线熟女| 97在线观看免费| 成片免费观看视频大全| 亚洲无码电影久久久| 99色天堂| 97亚洲综合| 欧洲精品一区二区三区| 欧美日韩不卡a片| 欧美 日韩 婷婷 五月| 亚欧Av| 色综合 加勒比| 精品射1999| 盗摄女人妻在线| 欧美骚少妇| 91久久久久久久久久久| 国产九九九九九九九九| 精…码一二三区| 草伊人高潮喷水超碰| 日本视频在线观看污污污| 欧美韩日精品99综合| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 看免费的黄片| 欧美劲爆第一页| 日韩乱伦视频| 国产熟女无套内射| 2017av无码免费无线播| 欧美一区二区传媒| www.伪伪| 啊啊啊啊啊啊啊网址在线观看| 久久久久免费看少妇A片特黄| 久草视频制服诱惑| 强奸乱伦AV一天堂网| 75大香蕉| 首页中文字幕中文字幕免费| AV色五月| 色综合久久久久| 9九九国产| 宅男影院久久久,99| 视频在线观看一二三区| 中文字幕黄片在线| 精品中文日韩字幕视频| 久久久无码av精| 国产精品一区二区麻豆| 97人人射| 欧美精品久久久久久久丰满| 99re8免费高清在线| 一本大道不卡一二三区| 97亚洲国产| 亚洲各类熟们中文字幕| 国产美女自拍视频| 日韩亚洲美女一区久久| 国产精品久久久无码aV去| 亚洲色图加勒比| 思思久热在线精品66| 亚欧美天堂在线| 操逼www.| 麻豆成人AV| 美女露胸露屁股| 中文字幕精品免费一区二区| 色网1| 亚洲天堂7777| 亚洲国产成人精品女人久久久| 日本一区二区三区精品| 尤物网址| 色香综合| 人妻内射一区二区在线视频| 婷婷色网| 欧美性生活免费网| 午夜精品久久久久久久第一页按摩| 在线a v| 久久老熟女| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 91 国产丝袜在线放观看| 国产毛片毛片4p懂色| 1204av韩国| 日本色色色视频| 亚洲国产97| AV一二区| 在线国产探花| 日本黄色精品专区网站| 91精品国产长腿丝袜美女| 99热官网| 亚洲乱伦图片视频| V A在线| 韩日巨乳美女免费视频在线观看| 五月综合婷婷久久网站| 九九九国产精品| 哈哈操电影AV| www.99热| 亚洲性爱电影| 欧美综合色图网| 日本大香蕉| 欧美日韩性爱精品| 亚洲成aⅴ人片不卡无码| 哈哈操 大香蕉| av麻豆啪啪| 伊人AAA| 国产午夜福利电影免费在线观看| 97 国产精品| 绯色AV粉色AV蜜臀AV| 成人免费福利网站国产| 日本东京热久久久电影| 97超碰欧美中文字幕| 日本不卡一区二区三区| 国产一区麻豆免费观看| 天堂岛av| 亚洲欧美国产其他二区| 97超碰人妻| #NAME?| 大吊色| 97天堂| 日韩亚洲中文字幕在线| 免费久久一级毛片大黄| 欧美亚洲小说| 欧美激情在线观看视频| 夜夜黄| 90后后入| 自拍第一页| 综合天天网| 极品白嫩福利在线| 青青色综合| 亚洲天堂东京热| 国产免费永久精品无码| 日韩av在线精品观看| 欧美性夜| 欧美综合亚洲综合| 国产午夜在线观看| 激情小说亚洲| 天天拍夜夜| 一卡二卡三卡| 久久专区| 深夜国产福利| 中文字幕视频二区| 欧美综合色,www| 亚洲有薄码区久久在线一区| 抽插亚洲无码| 九九九九九九九九九九精品视频| 天天日天天射天天干| 欧美色图天堂在线| 亚洲欧美精品一区天堂久久 | 久久久精| 手机看片1024你懂的国产| 国产白领连续中出在线观看| 强奸乱伦日韩AV| 内射小黄片| 国产a级精品| 欧洲成人性爱视频| 少妇干B| av绯色| 成人麻豆av电影网站| 久久透逼视频| 午夜福利精品| 国产黄片精品在线| 在线v中文字幕一区二区三区| 久久直播国产| 免费强奸av| 欧美一区二区三区蜜桃| 日韩无码黄色片| 26uuu国产成人综合| 深夜国产一区二区三区在线看| 国产第25页在线观看| 精品亚洲黄色片 国产精品导航一区二区 | 丝袜视频网国产90| 日韩大香蕉AV影片| 91老熟女| 啪啪视频亚洲第一| 韩国午夜理伦三级好看| www超碰| 九九九九九九九精品视频| 亚 欧 美 综合| 嗯嗯啊啊亚欧精品| 欧美性高潮| 天天肏天天干| 涩涩涩综合| 青娱乐国产盛宴视频| 乱色视频中文字幕| 自拍丝袜美腿人妻| 加勒比性爱成人在线| 国语精品av| 久久久中文| 成年人三级黄色片视频| 91狠狠综合久久久| 熟女啪啪视频| 亚洲做性| 欧美不卡在线一区二区| 天天日B夜夜干B时时操B| 午夜天堂啪啪| 精品176精品2| 先锋女优在线观看视频| 国产日产精品久久快鸭的功能介绍| 国产精品一二三在线看| 国产欧美伊人| 日夜尻逼网| 久久香蕉国产线看观看亚洲女人 | 亚洲熟女乱色| 夜夜做夜夜爽精品视频| 免费岛国一级片| 粉嫩不卡一区二区性爱| 国产有码一区| 欧美日韩亚洲天堂| 欧美色性爱| 日本污ww视频网站| 久久久久久久九九九九九九| 欧美中字不卡| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 97视频免费播放| 欧美日韩国产成人高清| 国产成人久久久精品免费AV| 大香蕉男人的天堂| 97在线看| 女人高潮大叫一级毛片| 久久久久9999妇女| 中文字幕一区二区三区50路| 亚卅熟女乱色| 精品国产久久乱码| 乱伦一二三区| 青青草视频这里只有精品| 91欧美性| 精品三级在线专区| 五月天开心网| 日韩欧美久久婷婷网站| 久久久久亚洲av综合波多野制衣| 一区二区三区在线资源| 国产外初女出血视频| 国产高清自拍视频| 夜夜中出国产| 蜜桃久久一区| 91黑人无码激情在线| 久久亚洲天天做| 啊v在线观看视频| 国产视频一区二区免费| 亚洲日韩乱码中文无码蜜桃臀网站| 97超碰香蕉| 国产精品亚洲免费| 后入福利视频| 亚洲精品中文字幕一区在线视频| 日本不卡二三区| 欧美综合天天| 日韩中文字幕二区| 热久久无毒不卡| 日韩 欧美 视频 在线 一区| 国产成人AV麻豆| 最新日本中文字幕| 欧美狠狠操| 日韩兔费看黄片| 青青草中文-久久青草精品一区二区三 | 熟妇熟女一区二区三区| 欧美很很操视频| 日日日日做夜夜夜夜无码| 国产一区二区三区精品观看啪| 性爱欧美五月| 91精品久久久| 三级网站超变态精品| 激情文学88| 中文字幕二区日韩天堂| 老熟女网站| 无码免费一区二区三区啪啪| 亚洲黄色AV电影| 二色av| 久久久久女教师免费一区 | 久9久9精品| 嫩草美女久久| 久干网| 国产精品网址| 国产熟女高潮一区二区三区| 人、人、摸,人、人、草| 蜜桃臀AV在线| 久久久久国产精品喷潮免费观看臀| 亚洲一区亚洲天堂| 操逼啊啊啊91| 精品大全99999| 人妻精品一区二区在线| 青青青青青手机视频| 天天日天天舔天天喷天天射| 色图综合网| 九九热男人天堂| 亚洲一区日韩精品中文字幕| 久久伦理视频久久大香蕉视频| 最好看的中文字幕在线2018| 99久久9| 干婷婷综合网| 激情欧美97| 国产精品女同| 午夜乱轮操逼视频免费看| 中文字幕女同在线| 亚洲欧美国产成人综合不卡| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 少妇3P性爱自拍| 欧美日韩婷婷中文| 国产亚洲国产超碰| 韩国三级色呦呦| 中文字幕少妇色| 国产黄片精品在线| 久久久精品,3| 色噜噜国产在线| 狠狠色噜噜狠狠狠狠2018| 伦理弟一页| 欧美一区二区观看在线| 天天干嫩逼网| 日本黄色裸日本黄色裸体| 在线观看中文av字幕| 98超碰欧美| 亚洲AV无码天美传媒一区| 日韩av在线精品观看| 丝袜综合| 97操碰| 呦呦影院| 亚州五月| 人妻天天操天天爽视频免费| www.大香| 999999精品| 欧美在线啊啊啊| 日本护士高潮| 夜夜草天天| 久草久日| 骚乳在线| 日本123区操B视频| 亚洲国产成人7777| 欧美丝袜中文字幕07在线| 国产婷婷一区| 久久xxxx| 免费αⅴ在线观看| 国语少妇精| 亚洲熟久久| 日韩另类色图| 操逼视频亚洲| 视频一区二区免费在线| 亚洲第一页综合在线| 116美女午夜| 国产精品久久久久久片| a片在线播放| 日韩青久久| 青青草十区九区爱夜| 日本污ww视频网站| 国产极品精品美女视频| 蜜臀久久99精品久久久| 日韩美女,国产传媒,视频一区| 久久色情| 乳欲人妻办公室奶水| 黄骗免费网站| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 久草网站免费在线观看| 久久综合九色综合欧洲98| 情色五月天就去干| 一区二区视频你懂的| 夜夜嗨AV一区天天| 丁香六月啪| 久草国产在线视频| 看免费的黄片| 视频不卡中文字幕| 欧美人妻另类在线| 亚洲综合贴图91| 中文字幕制服欧美久久一区| 95人妻爽爽人人做人人澡| 亚洲精品第一| 熟女五十路一区二区三| 色在线综合| 91美女视频| 91观看 国产白丝| 97超碰中文字幕| 91久久堂| 欧美成人色| 欧美一区二区在线资源| 国产精品老熟女一区二区| 淫荡熟女乱伦网| 久久这里只精品免费福利| se..亚洲欧美| 9Ⅰ超碰| 久久精品一区一起草| 超碰久久精品| 欧洲亚洲人人爽爽视频| 久久人妇| 久久久久久久久久久97| 美腿色图| 国产久久久9999| 精品丰满人妻一区二区三区免费观| 欧美视频边做饭边橾| 久久久久久久国产视频| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 国产99999久久精品| 色婷婷在线视频精品导航| 天天色悠悠激情| 天天日老熟妇| 1区2区3区在线视频| 秋霞欧美性爰视频| 久久99精品视频| 日韩成人网址| 丁香五月激情网| 偷窥自拍亚洲天堂网爆| www.色综合| 九九色婷婷| 九九RE视频在线精品| 夜夜草网站| 成人电影一区| 国内91熟女人妻丝袜天天精品视频在线 | 婷婷伊人綜合中文字幕小说| 亚洲图片欧美在线视频| 五月天激情婷婷| 日韩三级一区| 色综合中文字幕不卡| 色综合中文字幕不卡| 91 国产丝袜在线放观看| 大香蕉在线视频15| 亚洲激情 欧美色图| 精品人妻一区春色| 大香蕉性欧美| 蜜臀久久99精品久久久久久酒店 | 欧美激情综合网| 凹凸视频在线一区二区| 伊人五月天婷婷| 岛国毛片手机在线观看| 日韩乱插| 男人的天堂亚洲| 中文字幕在在线观看网站| 白丝少妇一区二区| 亚洲国产精品久久久男人的天堂| AV男人天堂网| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 99国内熟女露脸视频| 99这里都是精品| AV天堂因数| 人人操人人色网| 久久久久久久久久va| 国产精品无码av| 激情五月综合| 欧美丝袜激情| 九九热午夜欧亚国产视频| 一区二区三区一亚洲中文字幕、综合区灬| 人妻精品一区二区| 国产精品原创巨作?v网站| AV不卡在线| 97av在线视频| 91视频成人福利网站在线一区| 裸体美女久久久| 亚洲资源吧| 亚洲电影中字一区二区| 91天堂色男人的天堂| 国产精品一二三区福利| 国产精品高潮久久AV| 亚洲骚男同com| 欧美少妇色图| 艹比视频国产精品| 久久久久久中文字幕中文字幕最新| 国产欧美一区二区| 97超碰中文字幕| 天美91| 综合欧美激情网| 亚洲综合97中文网| 性九九九九九九| 白丝av| 男人高清无码一区二区| 国产欧美一区二区| 精品久久久一本一道| 国产强奸乱伦第1页| 全免费a敌肛交毛片免费| 欧美色棕合| AV色五月天| 欧差乱伦二三| 国产精品久久伊人| 国产美女口爆吞精| 伊人操| 99在线无码精品秘 入口黑人| 野狼激情网| 97爱啪| 免费人成毛片乱码| 久久久久人妻| 青青草国产一区二区三区| 啪啪视频免费在线观看| 婷婷五月天av| 欧洲自拍色图gif在线| 97久久超碰| 婷婷五月天丁香| www.男人天堂| 91丨九色丨国产丨人妻在线| 殴美牲| 2019男人的天堂| 日韩操逼HD| 三级片大波波| 天天cao在线| www…国产操逼| 91超碰碰在线| 免费一级a毛片久久久久久鸭绿欲| 五月婷婷综合在线| 免费精品AB| 九月丁香综合网| 九九成人精品| 超碰精品国产无码| 国产伦精品免编号公布| AV中亚| 狠狠综合| 人人澡人人干| 九九伊人网| 久久精品一区二区三区蜜桃臀| CCYY草草影院地址入口| 天天操天天射青青草| 日韩综合色网| 国模精品一区二区三区苹果色戒| 九九av| 超碰人妻天天干| 一直超碰| 911av网站免费观看| 97人人爱人人做人人乐| 小说区 图片区色 综合区| 97亚洲综合电影| 青青草福利视频| 欧美后进式| 精品人妻一区二区三区日产| 免费观看欧美日韩操逼视频| 大香蕉中文在线| 丁香激情五月天| 欧美激情视频一区二区| 性爱久久| 欧美在线91| 久草精品热视| 欧洲黄色网| 中文字幕88av在线| 亚洲精品性爱片| 怡春苑东京热| 欧美丝袜制服久久| 久9爱精品| 国产免费永久精品无码| 99re视频这里只有精品| 好吊妞转入那个网| 国产精品午夜AV完会免费| 亚洲激情AV| 97干在线| 天天天乱色综合全| 色呦呦呦在线观看视频| 亚洲欧美91√| 色综合五月天| 17c嫩草51久久91嫩草| 日日天天久久啊啊aaa| 国产乱伦性爱区| 久久久久久9999| 亚洲制服欧美另类内射| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 射丝袜高跟鞋99| 午夜小电影在线插入淫高潮| 亚洲蜜臀懂色| α√在线| 97亚洲中文| 夜夜狼人妻| 欧美日韩国产高清在线一二三区| 少妇精品久久久八区九区| 色播丁香| 国内精品嫩模A∨私拍小视频| 亚洲情色在线| 毛片电影一区二区三区| 日韩一级二级三级在线不卡观看完整| 99热在线不卡| 日韩不卡毛片Av免费高清| 91精品91久久久久77777| 99热97| 国产曰批免费观看久久久| 97精品视频在线播放| 欧美一区91大爱| 飘花国产午夜精品不卡| 国内精品久9| 中文字幕 av v| 美女尤物人人操| 欧美激情在线观看视频| 一级黄碟在线观看| 极品尤物女神在线观看| 一区二区三区视频| 天天日美女的B| 国产精品一二三免费网站| 白丝被操91| 国产91专区| 亚洲国产一区二区三区在线| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 激情婷婷综合久久| 日韩大香蕉精品在线视频| 67914亚洲精品| 亚洲欧美国产va在线播放频| 欧美,亚洲,日韩,v,天堂,手机在线观看| 国产精品一二三免费网站| 精品无码久久久久久国产浪潮| 一区超碰一区| 久久久久久91香蕉国产| 久久久久久欧美精品se一二三四| 国产综合在线视频网站| 91n处女在线观看| 一区二区三区蜜桃成人撸久久东京热 | 禁十八久久| 97国产成人精品免费视频| 日韩无码一级黄色av片| 欧美久久人体| 69精品人人人人| 九九在线视频| 老司机射| 性爱综合一区二区| 色妇综合网| 91色综合色| 国产精品国产自产拍高清AV| 超碰91在线| www.91逼逼.com| 家庭乱伦麻豆| 蜜臀久久99精品久久久久久成人小说 | 久久人妻四季| 色婷婷久久| 激情无码日韩| 日本中文字幕不卡视频| 精品夜夜澡人妻无码AV| 色眯眯av| 久久久久ab| 九久9热| 97视频网站| 猛交交| 91性情| 激情五月天婷婷| 97超碰色| 白丝jkav| 岛国在线一区二区三区| 精品视频一区二区| 少妇超碰在线| 一区二区三区免费视频入口| 欧美色图私拍91| 成人熟女视频一区二区三区| 抽插一区二区视频| 伊人色综合网电影| 嗯,啊。舔我逼| 人妻少妇色综合| 成人免费视瓶| 久久久久久9999| 精品一久久久| 天天综合有色网| 在线综合 亚洲 欧美中文字幕| 中文字幕 人妻不满 在线视频| 丁香五月激情婷婷| 凹凸视频特色日本特黄| 91一起操| 九九热AV| 亚洲天堂,男人| 欧美少妇熟女| 久久黄黄| 亚洲免费精品一区| 啊啊啊啊啊操我视频| 精品久久久久黄少妇| 这里只有精品视频在线| 嗯嗯啊啊视频在线看| 中文字幕在线播放2中文字幕在线观看2| AV九九| 五月天激情小说网| 亚洲天堂男人在线| 97二区四区| 超碰激情808| 丝袜无码a片| www.男人天堂| 欧美日韩国产精品久久色婷婷| 国产不卡的视频 | 呦呦一区| 欧美成熟性爱精品| 国产亚洲中文不卡二区| 午夜理论片在线观看免费| 五月婷婷久久综合| renqi久久久久久久久久久久| 麻豆蜜桃视频在线观看| 97国伦国色| 国产一区二区三区,在线观看观看| 亚洲天堂自拍| 亚州国产成人精品女人久久 | 香港澳门日本三级网站| 51久久夜色精品国产麻豆| 欧美性爱日韩性爱| 天天干人妇| 色九月| 91人人看| 久久、1234| 人人澡人人澡人人| 91欧美网| 久久精品国产AV一区二区三区| 十八禁的黄污污免费网站| 人妻精品视频一区二区| 操人妻少妇中文| 大香蕉欧美伊| 欧美黑人168页欧美黑人167| 人妻娇喘 激情视频| 日本在线观看网址| 人人妻人射| 少妇超碰在线| 国产亚卅97| 欧美 日韩第一性色| 97伊人网| 无套内射人妻在线播放| 欧美日综合| 99热导航| 欧美天天在线| 久久久9999| 在线观看色视频| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 欧美成人四级在线播放| 尤物一级在线免费观看| http://qxhbdz.com| 亚洲AV高潮| 东北老熟女| 免费观看网黄| 九九热精品视频在线观看| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 亚洲欧美综合图片| 亚洲日韩精品久久久久一区壹牛| 日韩美女操b| 日韩AV电影网站| 麻豆精品三区视频| 欧美精品三级黄片| 婷婷视频在线免费观看| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 熟女高潮精品一区二区| 黄片qw| 凹凸视频特色日本特黄| 欧美情色男人的天堂| 久久香蕉国产线看观看亚洲女人| 欧美的性爱网站免费| 日日狠狠久久偷偷色综合免费| 一直超碰| 一级黄色性爱裸体视频| 国产精品久久久久久久久AV大片 | 亚洲一区二区三区麻豆传媒| 天天躁日日躁狠狠狠躁| 国产成人99久久亚洲综合| 99亚洲精品| 天天做天天爱天天爽AV| 99这里只有精品| 夜夜福利| 啪啪啪综合网| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 羞答答AV中文字| 国产精品4p在线观看| 999狠狠综合| 人妻天天爽夜夜爽2| 天天爽夜夜爽夜夜爽精| 五月香婷婷| 青草伊人久久| 欧美日韩色综合网| 成人色女网| 日韩三级伊人| 99re视频在线观看这里只有精品| 97欧美色综合| 亚洲囯产精品女人久久久| 综合干干干av久久久综合网| 精品欧美乱码久| 九久9精品| 丰满少妇精品一区二区| 欧美强奸乱能| 亚洲熟女乱综合一区二区三区 | 国产综合操逼高清| 搡老女人老91妇女熟女| 性色av大全| 天天看片天天爽| 少妇蹲下露出大唇5| 97av在线视频| 欧美综合天堂| 日韩国产中文字幕| 麻豆色99999| 黄色视频特级毛片| 少妇久久久免费| 国产精品久久久久久片| 使劲用力艹少妇视频一区二区| 1769国内精品视频| 一区二区三区日韩欧美 | 一本色道无码DVD中文字幕| 久无码| 91丝袜在线观看| 嫖老熟女A片一二三区| 97精品久久久久中文字幕| 久久黄色性爱视频| 9 9无尺码天堂网| 国产性爱在线视频一区二区| 骚熟女吞| 超碰成人公开| 麻豆天美在线喷水AV| 成人性爱美曰韩| 男人天堂无码| 国产精品直播在线观看直播| 少妇免费视频| 亚洲久久久| 欧美日韩国产中文超碰| 天天射夜夜操| 91亚州欧美| 精品少妇人妻av久久免费| 97超碰亚洲| 韩国午夜理伦三级好看| 男人成人黄色视频在线观看免费下载| 看一级特黄a大一片| 高清不卡 中文 人妻| 国产午夜激片Av毛片不卡| 国内一区二区三区| 乱伦熟女区| 欧美 亚洲 在线| 亚洲国产综合久久天堂| 我要去看2个日本美女.com曹逼| 国产一级久久久| 国内精品久久人妻性色av| 亚洲一区亚洲天堂| 午夜AV人气不卡| 天天综合网亚洲综合网| 激情五月天丁香| 亚洲精品九九九| 欧美日韩少妇色情| 日韩精品人妻一| 久久婷婷一区| 91逼逼女人91| 日本三级A片网站com| 97jingpin| 亚洲成人免费在线| 日韩肏逼视频| 一区二区三区四区姦女| 奇米狠999| 天天欧美| 色月天AV导航| 伊人网综合在线视频| 国产中文字幕在线观看| 婷婷香蕉欧美在线一区二区三区| 九九九精品成人免费视频小说| 超碰综合色| 超碰人人干| 欧美综合自拍| 久久综合久色欧美综合狠狠| 牛黄色久午久| 玖玖爱影院| 日韩精品9区| 中文字幕在线观看丝袜| 欧美探花网| 揉揉揉夜夜| 夜夜操91744565| 亚洲av影音先锋| 91综合中文字幕| 日本欧美色| 一起草av| 国产精品蜜臀久久久久无码AV| 99久在线精品99re8| 搡老女人老妇女老妇老熟女怎么读| 国产黄色在线播放观看| 色网亚洲人| 亚洲日韩av一区二区三区百合| 乱伦Av网| 人人操人人色网| 午夜AV污污污| 99精品丰满人妻无| 岛国在线一区二区三区| 激情小说在线视频| 综合97久久| sss视频华人在线| 熟女突然公开看18禁影片| 国产精品com| 九九久久国产精品怡红院| 97综合日韩| 欧美婷婷五月天| 黄色片,com| 超碰美国| 视频在线观看青青99国产| 熟女色图在线| 操99| 一本大道不卡一二三区| 欧美中文综合| 91精品大奶人妻| 国产亚洲精品一区二区三区| 在线啊啊啊| 国产久久一区二区| 国产人妻精品久久久一区二区三区 | 国产午夜视频| 熟妇操花| 51久久夜色精品国产麻豆| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 一起草三级AV电影在线观看 | 全球成人中文在线| 国产乱伦性爱区| 神马午夜久久| 色97欧美| 91少妇香蕉久久精品| 99爱久久视频频| 992这里有精品| 日本精品不卡一二三区| 亚洲一曲日韩精品| 日本二三四区| 亚洲天天天| 啊啊啊啊啊啊啊啊要喷了| 伊人大香蕉在线| 欧美后进式| 国产熟女完整版中字| 国语对白露脸XXXXXX| 国产丝袜啪啪| 国产精品动态一区二区三区四四| 97操97色| 91在线页| 日韩啪啪啪啪啪| 久久久成人国产精品无码| 黄色在线网站| 激情抓乳插进去啪啪啪日韩| 91搡老女人老妇女老熟女歌词翻译| 91精品导航| 九九九九九九视频| 在线黄色污污网站| 欧美精品双插| 婷婷国产精品九区| 大香蕉AV丝袜| 91精品电影18| 女优免费一区二区永久| 国产免费一区二区在线A片视频| 91精品久久久| 色操逼网| 中文字幕一区二区日韩网| 一二三区操逼国产91| 色综合加勒比| 久久婷婷电影网| 97欧美超碰| 视频一区二区免费在线| 夜夜爽夜夜爽| 少妇久久久久久| 精品午夜福利导航| 亚洲精品久久久久久久蜜桃臀| 啊啊啊啊啊啊啊啊在线观看| 精品人妻一区二区三区在线视频不卡| 大香蕉视频啪啪啪啪| 欧洲综合色| 欧美熟妇精品黑人巨大91| 国产97色在线| 超碰在线一区| 91中出| 一区AV| 日本 色 导航| 再深点灬舒服灬太大了添视频| 久久av一级av少妇av高潮| 精品日韩人妻精品一二三区| 亚洲激情综合另类男同| 精品亚洲黄色片 国产精品导航一区二区 | 国产极品999| 日韩美脚一区二区网站| 在线啊啊啊啊| 91久久18禁| 91处女视频在线观看| 日韩欧美中文字| 白嫩妹子国产骚| 夜夜嗨一区| 久久久久久性爱免费视频| AAAA级日本片免费视频| 亲子敌伦对白在线播放| 日韩熟女操逼| AV一区观看| 色哟哟511老熟女| 乱老女人一区二区视频| 九九热在线视频| 欧美色图片91| 欧美综合网1| 天天日骚逼熟女| 亚洲久久久久| 午夜操逼不卡| 国产色精品午夜大片| 精品超碰国产| 一区二区你上我| 激情露脸爱| 人妻少妇色综合| 久久久精品视频欧州站| 国产乱不卡| 久久啊啊| 97超碰久久| 免费久久一级毛片大黄| 欧美国产欧美在线观看| 亚洲欧洲网站免费观看| 色婷婷色99国产综合精品| 国产欧美日韩在线观看麻豆传媒公司 | 色欧美综合| 中文字幕乱码在线| 精品视频免费在线一区| 亚洲九九夜夜| 人妻日日夜夜精品| 一区二区三区色综合| 91 综合网| 亚洲日韩人妻中文字幕一区| 男人高清无码一区二区| 青草视频在线看看看看看看看看看| 夜夜高潮夜夜爽| 成人片在线播放| 色女网日韩| 豆1无夜无码| 97超碰超碰| 操逼视频亚洲| 久久国产视频性吧 | 国产男人又猛又粗又爽| 91在线页| 欧美亚州色的图| 国产白丝av| 欧美自拍偷拍免费观看| 蜜桃视频精品一区二区| 日韩色女精品| 国产在线综合福利网站| 国产网站在线播放| 久久久久久亚洲精品中文字幕人妻| 欧美丝袜美女电影一二三四区| 国产精品白领在线观看 | 丁香六月综合激情| 久神马| 婷婷色综合欧美日韩| 欧美日韩中文亚洲v在线综合| 国产农村妇女精品1区二区| 精品美女少妇一区二区| 亚洲熟女性高潮久久久| 精品四五区| 中文字幕第7页| 爽极品影院| 91色碰| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 亚洲精品啪视频| 97硬碰| 日韩有码回春沙龙第一页| 日韩极品无码B| 嗯嗯啊操我| 欧美啪啪啪91| 精品九九九九九| 色播综合| 国产中午字一暮区| 伊人久久综合影院| 精品女人999| av影院十区| 人人摸人人干人人拍97| 一道本东京热加勒比一区二区三区| 精品人妻少妇| 亚欧高清在线| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 97看操| 午夜成人爽爽爽爽A片李冰冰| 天天日夜夜爽| 日本黄色XXX| 精品一区二区成人| 久久亚洲熟妇在线视频| 国产精品乱码久久久久久久久| 国产精品视频麻豆入口| 中文字幕丝袜人妻| 90后后入| 色综合av男人天堂| 亚洲情色图片区| 高清国产精品福利网站| 婷婷15月天青娱乐| 色好看av| 国产成年女黄特黄| 欧美亚州手机在线| 97草草| 亚洲精品天堂久久A∨51成人漫| 91色五月俺来也| 日韩免费a级毛片无码a∨| 桃色五月天| 性欧美999| av大香蕉| 色眯眯av| 夜夜影视四色| 天天干1区2区在线| 91人妻素女| 91麻豆一二三区| 97人人操人人摸人人爱| 蜜桃一区二区三区| 人人干黄色| 亚州色图欧美| 无码最新| 国产自产91区13区| 国产无码精品成人| 5252色欧美在线| 国产精品探花色| 欧美性区| 亚洲一区二区三区不卡国产欧美| 二级久久网| 亚洲国产av中文字幕久久 | 日本有码久久| 97干在线| 午夜呻吟欧美| 国产主播福利| 亚洲限制级| 日本Xx性爱| 天天综合站| 欧美性爱在线无码| 欧美色蜜桃97| 天天爱天天韩国日本牛牛牛牛 | 日本精品一区三区| 精品欧美老熟女一二区| 在线女人91| 第四色奇米影视777| 夜夜操一区二区| 中国女人内射6XXXXX| 九九超碰综合网| 丁香六月婷婷综合| 日本一级真人黄色性爱视频| 91在线美女| 天天懆天天日| 高清不卡 中文 人妻| 国模少妇一区二区三区| 日韩欧美女求操每天更新| 久热色情精品| 人人贴人人摸| 午夜福利在线合集| 狠狠综合网| dy888午夜老子影视达达兔| 国产人妻精品久久久一区二区三区| 欧美视频一| 九九综合网| 91色情黑丝搞鸡在线观看一区二区三区三州|