成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

PHP高并發(fā)實例詳解之解決商品庫存超賣問題

本篇文章給大家?guī)砹岁P(guān)于PHP的相關(guān)知識,其中主要介紹了關(guān)于在高并發(fā)情況下防止商品庫存超賣的相關(guān)問題,主要解決高并發(fā)對數(shù)據(jù)庫產(chǎn)生的壓力以及競爭狀態(tài)下如何解決商品庫存超賣,希望對大家有幫助。

PHP高并發(fā)實例詳解之解決商品庫存超賣問題

推薦學(xué)習(xí):《PHP教程》

商城系統(tǒng)中,搶購和秒殺是很常見的營銷場景,在一定時間內(nèi)有大量的用戶訪問商場下單,主要需要解決的問題有兩個:

  • 高并發(fā)對數(shù)據(jù)庫產(chǎn)生的壓力;

  • 競爭狀態(tài)下如何解決商品庫存超賣;

高并發(fā)對數(shù)據(jù)庫產(chǎn)生的壓力

對于第一個問題,使用緩存來處理,避免直接操作數(shù)據(jù)庫,例如使用 Redis。

競爭狀態(tài)下如何解決商品庫存超賣

對于第二個問題,需要重點說明。

常規(guī)寫法:查詢出對應(yīng)商品的庫存,判斷庫存數(shù)量否大于 0,然后執(zhí)行生成訂單等操作,但是在判斷庫存是否大于 0 處,如果在高并發(fā)下就會有問題,導(dǎo)致庫存量出現(xiàn)負數(shù)。

測試表 sql

把如下表數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫中

/* Navicat MySQL Data Transfer Source Server         : 01 本地localhost Source Server Version : 50553 Source Host           : localhost:3306 Source Database       : test Target Server Type    : MYSQL Target Server Version : 50553 File Encoding         : 65001 Date: 2020-11-06 14:31:35 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for products -- ---------------------------- DROP TABLE IF EXISTS `products`; CREATE TABLE `products` (   `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',   `title` varchar(50) DEFAULT NULL COMMENT '貨品名稱',   `store` int(11) DEFAULT '0' COMMENT '貨品庫存',   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='貨品表'; -- ---------------------------- -- Records of products -- ---------------------------- INSERT INTO `products` VALUES ('1', '稻花香大米', '20'); -- ---------------------------- -- Table structure for order_log -- ---------------------------- DROP TABLE IF EXISTS `order_log`; CREATE TABLE `order_log` (   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `content` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '日志內(nèi)容',   `c_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',   PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- ---------------------------- -- Table structure for order -- ---------------------------- DROP TABLE IF EXISTS `order`; CREATE TABLE `order` (   `oid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '訂單號',   `product_id` int(11) DEFAULT '0' COMMENT '商品ID',   `number` int(11) DEFAULT '0' COMMENT '購買數(shù)量',   `c_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',   PRIMARY KEY (`oid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='訂單表';

下單處理代碼

<?php db(); global $con; //step1 接收下單參數(shù) $product_id = 1;// 商品ID $buy_num = 1;// 購買數(shù)量 //step2 查詢商品信息 $sql = "select * from products where id={$product_id}"; $result = mysqli_query($con, $sql); $row = mysqli_fetch_assoc($result); //step3 判斷商品下單數(shù)量是否大于商品庫存數(shù)量 //此處在高并發(fā)下,可能出現(xiàn)上一個下單后還沒來得及更新庫存,下一個下單判斷庫存數(shù)不是最新的庫存 if ($row['store'] > 0) {     sleep(1);     //step4 更新商品庫存數(shù)量(減去下單數(shù)量)     $sql = "update products set store=store-{$buy_num} where id={$product_id}";     if (mysqli_query($con, $sql)) {         echo "更新成功";         //step5 生成訂單號創(chuàng)建訂單         $oid = build_order_no();         create_order($oid, $product_id, $buy_num);         insertLog('庫存減少成功,下單成功');     } else {         echo "更新失敗";         insertLog('庫存減少失敗');     } } else {     echo "沒有庫存";     insertLog('庫存不夠'); } function db() {     global $con;     $con = new mysqli('localhost','root','root','test');     if (!$con) {         echo "數(shù)據(jù)庫連接失敗";     } } /**  * 生成唯一訂單號  */ function build_order_no() {     return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); } function create_order($oid, $product_id, $number) {     global $con;     $sql = "INSERT INTO `order` (oid, product_id, number) values('$oid', '$product_id', '$number')";     mysqli_query($con, $sql); } /**  * 記錄日志  */ function insertLog($content) {     global $con;     $sql = "INSERT INTO `order_log` (content) values('$content')";     mysqli_query($con, $sql); }

將庫存字段字段設(shè)為 unsigned

因為庫存字段不能為負數(shù),在下單后更新商品庫存時,如果出現(xiàn)負數(shù)將返回 false

<?php db(); global $con; //step1 接收下單參數(shù) $product_id = 1;// 商品ID $buy_num = 1;// 購買數(shù)量 //step2 查詢商品信息 $sql = "select * from products where id={$product_id} for UPDATE";//利用for update 開啟行鎖 $result = mysqli_query($con, $sql); $row = mysqli_fetch_assoc($result); //step3 判斷商品下單數(shù)量是否大于商品庫存數(shù)量 if ($row['store'] > 0) {     sleep(1);     //step4 更新商品庫存數(shù)量(減去下單數(shù)量)     $sql = "update products set store=store-{$buy_num} where id={$product_id}";     if (mysqli_query($con, $sql)) {         echo "更新成功";         //step5 生成訂單號創(chuàng)建訂單         $oid = build_order_no();         create_order($oid, $product_id, $buy_num);         insertLog('庫存減少成功,下單成功');     } else {         // 如果出現(xiàn)負數(shù)將返回false         echo "更新失敗";         insertLog('庫存減少失敗');     } } else {     //商品已經(jīng)搶購?fù)?    echo "沒有庫存";     insertLog('庫存不夠'); } function db() {     global $con;     $con = new mysqli('localhost','root','root','test');     if (!$con) {         echo "數(shù)據(jù)庫連接失敗";     } } /**  * 生成唯一訂單號  */ function build_order_no() {     return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); } function create_order($oid, $product_id, $number) {     global $con;     $sql = "INSERT INTO `order` (oid, product_id, number) values('$oid', '$product_id', '$number')";     mysqli_query($con, $sql); } /**  * 記錄日志  */ function insertLog($content) {     global $con;     $sql = "INSERT INTO `order_log` (content) values('$content')";     mysqli_query($con, $sql); }

使用 mysql 的事務(wù),鎖住操作的行

在下單處理過程中,使用 mysql 的事務(wù)將正在下單商品行數(shù)據(jù)鎖定

<?php db(); global $con; //step1 接收下單參數(shù) $product_id = 1;// 商品ID $buy_num = 1;// 購買數(shù)量 mysqli_query($con, "BEGIN"); //開始事務(wù) //step2 查詢商品信息 $sql = "select * from products where id={$product_id} for UPDATE";//利用for update 開啟行鎖 $result = mysqli_query($con, $sql); $row = mysqli_fetch_assoc($result); //step3 判斷商品下單數(shù)量是否大于商品庫存數(shù)量 if ($row['store'] > 0) {     sleep(1);     //step4 更新商品庫存數(shù)量(減去下單數(shù)量)     $sql = "update products set store=store-{$buy_num} where id={$product_id}";     if (mysqli_query($con, $sql)) {         echo "更新成功";         //step5 生成訂單號創(chuàng)建訂單         $oid = build_order_no();         create_order($oid, $product_id, $buy_num);         insertLog('庫存減少成功,下單成功');         mysqli_query($con, "COMMIT");//事務(wù)提交即解鎖     } else {         echo "更新失敗";         insertLog('庫存減少失敗');         mysqli_query($con, "ROLLBACK");//事務(wù)回滾即解鎖     } } else {     //商品已經(jīng)搶購?fù)?    echo "沒有庫存";     insertLog('庫存不夠');     mysqli_query($con, "ROLLBACK");//事務(wù)回滾即解鎖 } function db() {     global $con;     $con = new mysqli('localhost','root','root','test');     if (!$con) {         echo "數(shù)據(jù)庫連接失敗";     } } /**  * 生成唯一訂單號  */ function build_order_no() {     return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); } function create_order($oid, $product_id, $number) {     global $con;     $sql = "INSERT INTO `order` (oid, product_id, number) values('$oid', '$product_id', '$number')";     mysqli_query($con, $sql); } /**  * 記錄日志  */ function insertLog($content) {     global $con;     $sql = "INSERT INTO `order_log` (content) values('$content')";     mysqli_query($con, $sql); }

使用非阻塞的文件排他鎖

在處理下單請求的時候,用 flock 鎖定一個文件,如果鎖定失敗說明有其他訂單正在處理,此時要么等待要么直接提示用戶” 服務(wù)器繁忙”,計數(shù)器存儲搶購的商品數(shù)量,避免查詢數(shù)據(jù)庫。

阻塞 (等待) 模式:并發(fā)時,當(dāng)有第二個用戶請求時,會等待第一個用戶請求完成、釋放鎖,獲得文件鎖之后,程序才會繼續(xù)運行下去。

<?php db(); global $con; //step1 接收下單參數(shù) $product_id = 1;// 商品ID $buy_num = 1;// 購買數(shù)量 $fp = fopen('lock.txt', 'w'); if (flock($fp, LOCK_EX)) {   //文件獨占鎖,阻塞     //step2 查詢商品信息     $sql = "select * from products where id={$product_id}";     $result = mysqli_query($con, $sql);     $row = mysqli_fetch_assoc($result);     //step3 判斷商品下單數(shù)量是否大于商品庫存數(shù)量     if ($row['store'] > 0) {         //處理訂單         sleep(1);         //step4 更新商品庫存數(shù)量(減去下單數(shù)量)         $sql = "update products set store=store-{$buy_num} where id={$product_id}";         if (mysqli_query($con, $sql)) {             echo "更新成功";             //step5 生成訂單號創(chuàng)建訂單             $oid = build_order_no();             create_order($oid, $product_id, $buy_num);             insertLog('庫存減少成功,下單成功');         } else {             echo "更新失敗";             insertLog('庫存減少失敗');         }     } else {         //商品已經(jīng)搶購?fù)?        echo "沒有庫存";         insertLog('庫存不夠');     }     flock($fp, LOCK_UN); //釋放鎖 } fclose($fp); function db() {     global $con;     $con = new mysqli('localhost','root','root','test');     if (!$con) {         echo "數(shù)據(jù)庫連接失敗";     } } /**  * 生成唯一訂單號  */ function build_order_no() {     return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); } function create_order($oid, $product_id, $number) {     global $con;     $sql = "INSERT INTO `order` (oid, product_id, number) values('$oid', '$product_id', '$number')";     mysqli_query($con, $sql); } /**  * 記錄日志  */ function insertLog($content) {     global $con;     $sql = "INSERT INTO `order_log` (content) values('$content')";     mysqli_query($con, $sql); }

非阻塞模式:并發(fā)時,第一個用戶請求,拿得文件鎖之后。后面請求的用戶直接返回系統(tǒng)繁忙,請稍后再試

<?php db(); global $con; //step1 接收下單參數(shù) $product_id = 1;// 商品ID $buy_num = 1;// 購買數(shù)量 $fp = fopen('lock.txt', 'w'); if (flock($fp, LOCK_EX|LOCK_NB)) {   //文件獨占鎖,非阻塞     //step2 查詢商品信息     $sql = "select * from products where id={$product_id}";     $result = mysqli_query($con, $sql);     $row = mysqli_fetch_assoc($result);     //step3 判斷商品下單數(shù)量是否大于商品庫存數(shù)量     if ($row['store'] > 0) {         //處理訂單         sleep(1);         //step4 更新商品庫存數(shù)量(減去下單數(shù)量)         $sql = "update products set store=store-{$buy_num} where id={$product_id}";         if (mysqli_query($con, $sql)) {             echo "更新成功";             //step5 生成訂單號創(chuàng)建訂單             $oid = build_order_no();             create_order($oid, $product_id, $buy_num);             insertLog('庫存減少成功,下單成功');         } else {             echo "更新失敗";             insertLog('庫存減少失敗');         }     } else {         //商品已經(jīng)搶購?fù)?        echo "沒有庫存";         insertLog('庫存不夠');     }     flock($fp, LOCK_UN); //釋放鎖 } else {     //系統(tǒng)繁忙,請稍后再試     echo "系統(tǒng)繁忙,請稍后再試";     insertLog('系統(tǒng)繁忙,請稍后再試'); } fclose($fp); function db() {     global $con;     $con = new mysqli('localhost','root','root','test');     if (!$con) {         echo "數(shù)據(jù)庫連接失敗";     } } /**  * 生成唯一訂單號  */ function build_order_no() {     return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); } function create_order($oid, $product_id, $number) {     global $con;     $sql = "INSERT INTO `order` (oid, product_id, number) values('$oid', '$product_id', '$number')";     mysqli_query($con, $sql); } /**  * 記錄日志  */ function insertLog($content) {     global $con;     $sql = "INSERT INTO `order_log` (content) values('$content')";     mysqli_query($con, $sql); }

因為 pop 操作是原子的,即使有很多用戶同時到達,也是依次執(zhí)行,推薦使用

mysql 事務(wù)在高并發(fā)下性能下降很厲害,文件鎖的方式也是

先將商品庫存到 redis 隊列

<?php db(); global $con; // 查詢商品信息 $product_id = 1; $sql = "select * from products where id={$product_id}"; $result = mysqli_query($con, $sql); $row = mysqli_fetch_assoc($result); $store = $row['store']; // 獲取商品在redis緩存的庫存 $redis = new Redis(); $result = $redis->connect('127.0.0.1', 6379); $key = 'goods_store_' . $product_id; $res = $redis->llen($key); $count = $store - $res; for ($i=0; $i<$count; $i++) {     $redis->lpush($key, 1); } echo $redis->llen($key); function db() {     global $con;     $con = new mysqli('localhost','root','root','test');     if (!$con) {         echo "數(shù)據(jù)庫連接失敗";     } }

2. 搶購、秒殺邏輯

<?php db(); global $con; //step1 接收下單參數(shù) $product_id = 1;// 商品ID $buy_num = 1;// 購買數(shù)量 //step2 下單前判斷redis隊列庫存量 $redis = new Redis(); $result = $redis->connect('127.0.0.1',6379); $count = $redis->lpop('goods_store_' . $product_id); if (!$count) {     insertLog('error:no store redis');     return '秒殺結(jié)束,沒有商品庫存了'; } sleep(1); //step3 更新商品庫存數(shù)量(減去下單數(shù)量) $sql = "update products set store=store-{$buy_num} where id={$product_id}"; if (mysqli_query($con, $sql)) {     echo "更新成功";     //step4 生成訂單號創(chuàng)建訂單     $oid = build_order_no();     create_order($oid, $product_id, $buy_num);     insertLog('庫存減少成功,下單成功'); } else {     echo "更新失敗";     insertLog('庫存減少失敗'); } function db() {     global $con;     $con = new mysqli('localhost','root','root','test');     if (!$con) {         echo "數(shù)據(jù)庫連接失敗";     } } /**  * 生成唯一訂單號  */ function build_order_no() {     return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); } function create_order($oid, $product_id, $number) {     global $con;     $sql = "INSERT INTO `order` (oid, product_id, number) values('$oid', '$product_id', '$number')";     mysqli_query($con, $sql); } /**  * 記錄日志  */ function insertLog($content) {     global $con;     $sql = "INSERT INTO `order_log` (content) values('$content')";     mysqli_query($con, $sql); }

redis 樂觀鎖防止超賣

<?php $redis =new Redis(); $redis->connect("127.0.0.1", 6379); $redis->watch('sales');//樂觀鎖 監(jiān)視作用 set()  初始值0 $sales = $redis->get('sales'); $n = 20;// 庫存 if ($sales >= $n) {     exit('秒殺結(jié)束'); } //redis開啟事務(wù) $redis->multi(); $redis->incr('sales'); //將 key 中儲存的數(shù)字值增一 ,如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執(zhí)行 INCR 操作。 $res = $redis->exec(); //成功1 失敗0 if ($res) {     //秒殺成功     $con = new mysqli('localhost','root','root','test');     if (!$con) {         echo "數(shù)據(jù)庫連接失敗";     }     $product_id = 1;// 商品ID     $buy_num = 1;// 購買數(shù)量     sleep(1);     $sql = "update products set store=store-{$buy_num} where id={$product_id}";     if (mysqli_query($con, $sql)) {         echo "秒殺完成";     } } else {     exit('搶購失敗'); }

推薦學(xué)習(xí):《PHP視頻教程》

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
J日本成熟IPHONE69| 99久久国产成人免费网站| 久久综合精品国产一区二区三区无| ZZIJZZIJ亚洲日本少妇J| 国产精品后入内射日本在线观看| 亚洲AV无码精品无码麻豆| 欧美ZC0O人与善交的最新章节| 成人片黄网站色大片免费观看AP| 亚洲熟妇丰满美女XXXXX| 特级毛片A级毛片免费观看网站| 免费A级毛片18禁| 欧美最猛激情性AAAAA| 国产午夜福利在线观看红一片| 在线天堂资源WWW在线中文| 巨人精品福利官方导航| 欧洲精品不卡1卡2卡三卡| 小SB几天没做又欠CH| 2021国内精品久久久久精品K| 婬乱丰满熟妇XXXXX| 午夜无码片在线观看影院网址| 女人丝不挂的正面裸体| 精品国产乱码久久久久久小说| 第一章少妇初尝云雨| 被陌生人在地铁揉到高潮| AV无码不卡在线观看免费| YOUJIZZ丰满熟妇| 班主任掀开裙子让我桶的| 亚洲中文久久精品无码软件| 少妇愉情理伦片高潮日本| 美女扒开尿口让男人桶进| 久久久久久九九99精品| 久久久久亚洲波多野结衣| 黑人大鸡吧操逼日本女人| 国产精品一国产精品一K频道| YELLOW高清免费观看日本| 八戒八戒手机在线高清观看WWW | 成年午夜无码AV片在线观看| 一本到无码AV专区无码| 永久免费观看国产裸体美女| 亚洲国产精品久久精品成人网站| 亚洲AV无码性色AV无码网站| 亚洲精品自偷自拍无码| 曰曰摸天天添天天湿| 特级做A爰片毛片免费看108| 欧美亚洲熟妇少妇性A爱| 色窝窝无码一区二区三区| 亚洲AV成人片无码网站网| 小荡货奶真大水真多紧视频| 亚洲一线产区二线产区区别在哪儿 | 亚洲国产欧美一区二区三区 | 老女人婬乱d一级毛片| 免费午夜爽爽爽WWW视频十八禁| 人人妻人人爽人人| 亚洲AV日韩AV无码大全| 精产国品一二三产区区| 麻花豆传媒剧国产MV入口| 少妇高潮喷水久久久影院| 亚洲性色AV日韩在线观看| 草莓丝瓜芭乐鸭脖奶茶发型| 精东传媒2021精品密友第一季| 欧美激情综合色综合啪啪五月| 乌克兰少妇XXXX做受| 资源在线WWW天堂官网| 国产精品毛片无码| 欧美成人精品在线观看| 亚洲AV婷婷五月产AV中文| 永久免费看啪啪的网站| 丰满人妻一区二区三区无码AV| 娇妻丁字裤公交车被在线观看| 欧美成人精品高清视频 | 精品人人妻人人爽D∨D| 日产一二三区别免费必看| 日本人XXXX裸体XXXX| 亚洲一区二区女搞男| 国产成人精品午夜福利在线播放| 妺妺窝人体色WWW写真| 亚洲—本道 在线无码AV发| 中文字幕无码无码专区| 东北少妇大叫高潮XXXⅩ| 久久久久亚洲AV片无码| 西方最大但人文艺术| 成人国内精品视频在线观看| 拒嫁豪门少奶奶99次出逃| 羞羞午夜爽爽爽爱爱爱爱人人人| 用舌头去添高潮无码视频| 韩国青草自慰喷水无码直播间 | 国产成人亚洲精品无码综合原创 | 午夜欧美精品久久久久久久| 97人洗澡人人澡人人爽人人模| 久久精品国产亚洲AV大全| 日本嫩交12一16XXX视频| 中文字幕久久熟女蜜桃| 国产男女猛烈无遮挡免费网站 | www.XXXXx.com日本| 免费无码又黄又爽又刺激| 把人妻日出白浆人妻视频| 女人被弄高潮视频免费| 夜夜躁狠狠躁日日躁| 久久ZYZ资源站无码中文动漫| 亚洲AVSSS在线观看| 国产亚洲精品A第一页| 性色a∨精品高清在线观看| 国产MV高清砖码2022| 少妇人妻一级AV片| 嗯~啊哈好深好骚啊哼| 日韩人妻中文无码一区二区| メスのちトラレ_在线| 欧美VPSWINDOWS另类| 999精品国产人妻无码系列| 蜜桃人妻一区二区三区| 一二三四在线看日本高清| 美女裸身裸乳免费视频的APP| 在线高清理伦片A| 成人网站在线观看丰满少妇电影| 人妻少妇精品久久久久久| 办公室爆乳女秘在线观看| 日韩在线 | 中韩| 国产精品嫩草影院AV| 亚洲AV中文无码乱人伦在线播放 | 亚洲午夜久久久久久噜噜噜 | 波多野结衣AV中文一区二区三区| 美女裸身裸乳免费视频的APP| 国产精品国语对白露脸在线播放| 亚洲AV无码第一区二区三区| 好大好深好猛好爽视频| 婷婷五月综合色视频| 国产精品成人99久久久久| 日本JAPANESE丰满白浆| 高潮娇喘抽搐喷水潮喷视频网站| 性无码免费一区二区三区在线| 18亚洲AV无码成人国产| 欧洲美女粗暴牲交免费观看| 公交车里抓着摇曳的手环诗情| 日韩精品无码一区二区忘忧草| ZOOM人与ZOOM视频| 欧美乱码卡1卡2卡三卡四卡 | 好喜欢你呐[校园] 里恩ER| 无码人妻精品一区二区蜜桃百度 | 无码国产69精品久久久久孕妇| 国产精品一国产精品| 亚洲AV乱码久久精品蜜桃| 黑人巨大JEEP日本人| 亚洲色欲啪啪久久WWW综合网| 欧美久久高潮久久高潮| 草莓视频APP无限观看| 亚洲HAIRY多毛PICS大全| 欧美乱码卡1卡2卡三卡四卡| 厨房丝袜麻麻被进进出出| 亚洲AV无码专区春药在线观看| 久久无码人妻一区二区三区| 99福利资源久久福利资源| 乳头羞涩NP公主| 久久人人爽人人爽人人片AV高请| 丰满人妻一区二区三区Aⅴ在线| 野花日本大全免费观看3中文版| 欧美精品一区二区三区在线| 国产精品天干天干在线观看澳门| 中中文日产幕无线码一区| 日本人も中国人も汉字を| 久久久久AV综合网成人| 国产成人久久综合第一区| 99精品国产福久久久久久蜜桃 | 亚洲AV无码专区在线播放| 锕锕锕锕锕锕~好深啊APP| 四十路の五十路熟女豊満| 精品女同一区二区三区免费站 | 国产精品亚洲专区无码唯爱网| 亚洲AⅤ日韩久久久久久| 脔到她哭H粗话HWWW男男动漫| 白嫖B站激活码2023| 西方37大但人文艺术A管77| 麻豆精品传媒一二三区| 隔着肚兜偷揉酥乳含乳子| 亚洲乱码一卡二卡四卡乱码新区| 男女嘿咻发声动态图| 人妻无码一区二区三区免费| 国产成人精品一区二区秒拍 | 国产精品国产三级国AV| 亚洲AV成人无码精品电影在线| 欧美成人精品 一区二区三区| 成年女人免费观看播放视频| 亚洲 日本 欧美 中文幕| 免费十大软件大全下载安装| 国产盗摄XXXX视频XXXX| 中文字幕乱码无码人妻系列蜜桃| 无码H片在线观看网站| 女人18片毛片免费| 蜜桃女同一区二区免费AV哟| 国产成人久久AV免费| 厨房里的激战2类型| 几天没C是不是又痒了网站| 男人的天堂在线视频| 人妻少妇88久久中文字幕| 欧美巨大XXXX做受| 厨房里挺进岳丰满大屁股 | 亚洲风情亚Aⅴ在线发布| 人妻精品久久久久中文字幕69| 久久777国产线看观看精品| JIZZJIZZJIZZ亚洲熟| 亚洲欧美日韩中文高清WWW|