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

ARTICLE DETAIL

資訊詳情

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

Redis事務(wù)深度拆解:從原子性真相到秒殺場(chǎng)景實(shí)戰(zhàn)

Redis事務(wù)深度拆解:從原子性真相到秒殺場(chǎng)景實(shí)戰(zhàn) 1. 我為什么專門(mén)寫(xiě)一篇Redis事務(wù)的文章先拋一個(gè)觀點(diǎn)Redis事務(wù)可能是整個(gè)Redis生態(tài)里“被誤解最深”的一個(gè)特性。很多人面試前背了幾條命令知道MULTI、EXEC、DISCARD、WATCH這幾個(gè)單詞但真正被問(wèn)到“Redis事務(wù)能保證原子性嗎”的時(shí)候往往答不到點(diǎn)子上更別提實(shí)際項(xiàng)目里用Redis事務(wù)解決具體問(wèn)題了。我寫(xiě)這篇東西的動(dòng)機(jī)很簡(jiǎn)單最近在幫團(tuán)隊(duì)做緩存一致性治理順手把幾個(gè)訂單場(chǎng)景的分布式事務(wù)方案重新捋了一遍發(fā)現(xiàn)Redis事務(wù)在一部分場(chǎng)景下其實(shí)是比分布式鎖更輕量的選擇。但前提是你得真正理解它的邊界哪些它能做哪些它絕對(duì)做不了。這篇文章不打算給你畫(huà)大餅也不打算把官方文檔翻譯一遍而是把我自己從踩坑、看源碼、做壓測(cè)里總結(jié)出來(lái)的東西講明白。內(nèi)容從基礎(chǔ)命令開(kāi)始逐步到本質(zhì)分析、實(shí)際場(chǎng)景、常見(jiàn)面試追問(wèn)最后是一份可以直接抄的實(shí)操清單。適合三類(lèi)人看準(zhǔn)備面試的Java/PHP/Go后端開(kāi)發(fā)正在做緩存與數(shù)據(jù)庫(kù)一致性設(shè)計(jì)的架構(gòu)師以及那些被“Redis事務(wù)就是個(gè)雞肋”這種論調(diào)誤導(dǎo)過(guò)的朋友??赐昴銘?yīng)該能回答清楚Redis事務(wù)是不是事務(wù)它和MySQL事務(wù)的差別到底在哪里哪些業(yè)務(wù)場(chǎng)景真的應(yīng)該用它2. 從命令層面理解Redis事務(wù)的完整執(zhí)行流程2.1 四條核心命令的職責(zé)劃分Redis事務(wù)相關(guān)的命令一共就五條最常用的是前四條MULTI開(kāi)啟事務(wù)標(biāo)記當(dāng)前連接進(jìn)入事務(wù)狀態(tài)EXEC執(zhí)行事務(wù)隊(duì)列中的所有命令DISCARD取消事務(wù)清空命令隊(duì)列WATCH樂(lè)觀鎖監(jiān)視一個(gè)或多個(gè)key在EXEC之前key被修改則事務(wù)被中斷有一個(gè)很容易被忽略但非常關(guān)鍵的命令UNWATCH用于取消所有WATCH監(jiān)聽(tīng)。一個(gè)典型的事務(wù)執(zhí)行流程是這樣的 MULTI OK SET order:1001 status paid QUEUED INCR order_count QUEUED EXEC 1) OK 2) (integer) 101這里有個(gè)細(xì)節(jié)值得注意從MULTI開(kāi)始所有的命令都不會(huì)立即執(zhí)行而是進(jìn)入一個(gè)隊(duì)列每個(gè)命令返回QUEUED。直到EXEC被調(diào)用Redis才會(huì)按順序、一次性執(zhí)行隊(duì)列里的所有命令。這個(gè)“排隊(duì)”機(jī)制是理解Redis事務(wù)的起點(diǎn)也是和MySQL事務(wù)最大的分水嶺MySQL事務(wù)里的每條SQL在執(zhí)行時(shí)就會(huì)加鎖、修改undo日志而Redis事務(wù)里命令真正執(zhí)行的時(shí)刻被推遲到了EXEC。2.2 事務(wù)執(zhí)行的三階段拆解官方對(duì)Redis事務(wù)的定義是三階段事務(wù)開(kāi)始MULTI命令把連接上下文標(biāo)記為事務(wù)狀態(tài)命令入隊(duì)后續(xù)命令全部進(jìn)入隊(duì)列此時(shí)服務(wù)端只做語(yǔ)法檢查不執(zhí)行業(yè)務(wù)邏輯執(zhí)行事務(wù)EXEC被調(diào)用后服務(wù)端按先進(jìn)先出的順序逐個(gè)執(zhí)行隊(duì)列里的命令第一階段和第三階段很好理解重點(diǎn)說(shuō)第二階段。命令入隊(duì)時(shí)Redis只做兩類(lèi)檢查命令是否存在、參數(shù)個(gè)數(shù)是否正確。至于key存不存在、類(lèi)型對(duì)不對(duì)、命令執(zhí)行會(huì)不會(huì)報(bào)錯(cuò)全部留到EXEC階段才會(huì)暴露出來(lái)。這個(gè)特性導(dǎo)致了Redis事務(wù)里一個(gè)著名的坑如果某個(gè)命令在入隊(duì)時(shí)沒(méi)有語(yǔ)法錯(cuò)誤但在執(zhí)行時(shí)發(fā)現(xiàn)操作了錯(cuò)誤類(lèi)型的數(shù)據(jù)結(jié)構(gòu)它不會(huì)影響其他命令的正常執(zhí)行。我可以給你演示這個(gè)場(chǎng)景 MULTI OK SET name zhangsan QUEUED LPUSH name list-data QUEUED INCR age QUEUED EXEC 1) OK 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) (integer) 1看到?jīng)]有LPUSH執(zhí)行失敗了但SET和INCR照樣執(zhí)行成功。這說(shuō)明Redis事務(wù)不具備回滾機(jī)制更沒(méi)有“要么全成功、要么全失敗”的原子性保障。這一點(diǎn)必須刻在腦子里面試問(wèn)“Redis事務(wù)滿足原子性嗎”正確答案是不滿足傳統(tǒng)意義上的原子性它只保證執(zhí)行過(guò)程的隔離性以及命令序列的批量執(zhí)行。3. 深度拆解Redis事務(wù)的本質(zhì)它到底是什么不是什么3.1 原子性的真相沒(méi)有回滾只有中斷MySQL事務(wù)失敗時(shí)可以ROLLBACK把數(shù)據(jù)恢復(fù)到事務(wù)開(kāi)始前的狀態(tài)。Redis事務(wù)呢它把所有命令執(zhí)行完之后根本沒(méi)有undo log沒(méi)有MVCC沒(méi)有回滾段。如果執(zhí)行過(guò)程中某條命令報(bào)錯(cuò)Redis會(huì)繼續(xù)執(zhí)行后面的命令已經(jīng)執(zhí)行成功的命令不會(huì)被撤銷(xiāo)。那事務(wù)里主動(dòng)判斷邏輯錯(cuò)誤怎么辦比如兩個(gè)命令之間有依賴關(guān)系前面命令成功了才允許后面命令執(zhí)行。Redis給出的是DISCARD命令——但這個(gè)DISCARD只能在你還沒(méi)EXEC的時(shí)候手動(dòng)調(diào)用用來(lái)放棄整個(gè)隊(duì)列一旦進(jìn)入EXEC你就不可能干預(yù)執(zhí)行過(guò)程無(wú)法在中間某條命令出錯(cuò)時(shí)讓后面的命令停止執(zhí)行。用一句話總結(jié)Redis事務(wù)只有“執(zhí)行前的中斷”沒(méi)有“執(zhí)行后的回滾”。WATCH機(jī)制本質(zhì)上也是在EXEC之前依靠key的版本變化來(lái)中斷事務(wù)而不是在執(zhí)行之后去恢復(fù)現(xiàn)場(chǎng)。理解了這一點(diǎn)你才算摸到了Redis事務(wù)的真正邊界。3.2 隔離性真相單線程模型下的天然串行Redis是單線程模型所有命令都是串行執(zhí)行的。這帶來(lái)一個(gè)直接結(jié)論在EXEC執(zhí)行期間不會(huì)有其他客戶端的命令插入進(jìn)來(lái)。所以Redis事務(wù)的隔離性其實(shí)是“單線程串行”帶來(lái)的副產(chǎn)品不需要復(fù)雜的鎖機(jī)制也不需要MVCC。但這個(gè)隔離性有個(gè)前提只針對(duì)Redis自身。事務(wù)執(zhí)行期間如果有其他客戶端向同一個(gè)key發(fā)起了寫(xiě)操作那這個(gè)寫(xiě)操作是等EXEC整體執(zhí)行完才會(huì)被處理還是可能在事務(wù)執(zhí)行過(guò)程中的某個(gè)間隙被插入答案是沒(méi)有間隙。Redis服務(wù)端在處理EXEC時(shí)會(huì)一次性把隊(duì)列里所有命令順序執(zhí)行完畢中間不會(huì)去處理網(wǎng)絡(luò)上的新請(qǐng)求。這是Redis事務(wù)隔離性的核心保證也解釋了為什么WATCH需要在事務(wù)之外單獨(dú)工作——它是在EXEC執(zhí)行前對(duì)key進(jìn)行監(jiān)視而不是在事務(wù)執(zhí)行過(guò)程中加鎖。3.3 與MySQL事務(wù)、分布式事務(wù)的邊界對(duì)照為了把Redis事務(wù)的本質(zhì)講透我把它和MySQL事務(wù)、以及外部常見(jiàn)的分布式事務(wù)方案做了一張對(duì)照表維度MySQL事務(wù)Redis事務(wù)分布式事務(wù)如2PC/TCC原子性支持回滾保證全成或全敗不保證某條命令失敗不影響其他命令通過(guò)協(xié)調(diào)者與參與者協(xié)議保證隔離性支持四種隔離級(jí)別間隙鎖、行鎖單線程串行天然隔離需要分布式鎖或額外隔離機(jī)制持久性依賴redo log可配置依賴AOF/RDB受持久化配置影響依賴各參與節(jié)點(diǎn)的持久化能力適用場(chǎng)景強(qiáng)一致、結(jié)構(gòu)化數(shù)據(jù)、復(fù)雜關(guān)聯(lián)操作輕量級(jí)、低延遲、操作簡(jiǎn)單的緩存或計(jì)數(shù)場(chǎng)景跨庫(kù)、跨服務(wù)的強(qiáng)一致業(yè)務(wù)性能成本鎖競(jìng)爭(zhēng)、日志刷盤(pán)開(kāi)銷(xiāo)明顯無(wú)鎖開(kāi)銷(xiāo)批量執(zhí)行極快網(wǎng)絡(luò)交互多性能損耗大看完這張表你應(yīng)該明白R(shí)edis事務(wù)不是一個(gè)“弱化版MySQL事務(wù)”而是一個(gè)設(shè)計(jì)目標(biāo)完全不同的機(jī)制。它犧牲了原子性和持久性換來(lái)了極致的性能與簡(jiǎn)潔的執(zhí)行模型。所以與其糾結(jié)“Redis事務(wù)能不能替代MySQL事務(wù)”不如問(wèn)自己我的場(chǎng)景需要回滾嗎需要跨多個(gè)key保證數(shù)據(jù)強(qiáng)一致嗎如果答案是需要那Redis事務(wù)不是你的菜如果只是需要“一次性執(zhí)行一串命令并且不想被其他客戶端的操作插隊(duì)”那它可能正好夠用。3.4 Redis事務(wù)寫(xiě)操作的底層實(shí)現(xiàn)細(xì)節(jié)Redis事務(wù)之所以能“排隊(duì)”靠的是客戶端狀態(tài)機(jī)。在Redis源碼里每個(gè)redisClient結(jié)構(gòu)體較新版本為client有一個(gè)flags字段其中包含了CLIENT_MULTI標(biāo)志位。當(dāng)客戶端發(fā)送MULTI時(shí)服務(wù)端把這個(gè)標(biāo)志位置為1之后的每條命令服務(wù)端會(huì)調(diào)用queueMultiCommand方法把命令追加到一個(gè)鏈表形式的c-mstate.commands數(shù)組里。有個(gè)很體現(xiàn)設(shè)計(jì)精妙的地方命令入隊(duì)時(shí)Redis會(huì)提前解析命令參數(shù)并檢查命令合法性這樣EXEC執(zhí)行的時(shí)候就不需要重復(fù)解析命令了。這個(gè)優(yōu)化讓事務(wù)的執(zhí)行速度非??煲彩撬茉诟咝阅軋?chǎng)景下被廣泛使用的基礎(chǔ)。我當(dāng)年在看源碼時(shí)注意到一個(gè)有意思的細(xì)節(jié)MULTI之后如果執(zhí)行DISCARD服務(wù)端會(huì)清空mstate里的命令隊(duì)列并釋放相關(guān)內(nèi)存此時(shí)如果之前設(shè)置過(guò)WATCH事務(wù)中斷后WATCH還在生效嗎答案是WATCH會(huì)被保留除非你顯式調(diào)用UNWATCH。這是很多人忽略的細(xì)節(jié)容易導(dǎo)致后續(xù)事務(wù)被意外中斷。4. 實(shí)際應(yīng)用場(chǎng)景Redis事務(wù)真正能解決的問(wèn)題4.1 場(chǎng)景一秒殺和庫(kù)存扣減事務(wù)比分布式鎖更優(yōu)雅很多人提到庫(kù)存扣減第一時(shí)間想到分布式鎖但分布式鎖有鎖的獲取、釋放、超時(shí)、重入等一堆問(wèn)題而且在高并發(fā)下性能開(kāi)銷(xiāo)不小。如果只涉及單key的原子扣減根本不需要鎖用INCR/DECR這種原子操作就夠了但如果涉及多key的一致性比如“扣減庫(kù)存生成訂單號(hào)記錄操作日志”這三個(gè)步驟需要一起完成且不允許被其他線程插隊(duì)Redis事務(wù)就是非常合適的選手。舉個(gè)例子秒殺場(chǎng)景里的典型操作WATCH stock:sku001 MULTI DECR stock:sku001 INCR order:total LPUSH order:list user:1001 EXEC在WATCH的幫助下如果事務(wù)執(zhí)行前stock:sku001被其他請(qǐng)求修改了EXEC會(huì)返回nil而不是執(zhí)行隊(duì)列里的命令從而避免超賣(mài)。這套邏輯比分布式鎖輕量不需要引入額外組件也不需要考慮鎖超時(shí)續(xù)期問(wèn)題在單Redis實(shí)例場(chǎng)景下是一個(gè)極其高效的方案。這里我必須強(qiáng)調(diào)一個(gè)前提上面這個(gè)方案要求所有操作都命中同一個(gè)Redis實(shí)例。如果你用的是Redis Cluster多個(gè)key不在同一個(gè)slot上事務(wù)就會(huì)報(bào)CROSSSLOT錯(cuò)誤。解決辦法是使用Hash Tag比如把key設(shè)計(jì)成{stock:sku001}:stock、{stock:sku001}:order讓它們落在同一個(gè)slot中。4.2 場(chǎng)景二批量命令執(zhí)行減少網(wǎng)絡(luò)往返Redis事務(wù)的另一個(gè)天然優(yōu)勢(shì)是減少RTT往返時(shí)延。假設(shè)你要執(zhí)行五條命令正常逐條執(zhí)行需要5個(gè)網(wǎng)絡(luò)往返而用事務(wù)封裝后只需要2個(gè)往返MULTI一個(gè)EXEC一個(gè)。在局域網(wǎng)環(huán)境下可能差別不明顯但在跨機(jī)房、跨云的場(chǎng)景下每條命令的RTT可能達(dá)到幾十毫秒這時(shí)事務(wù)的性能優(yōu)勢(shì)就會(huì)被放大。我在實(shí)際項(xiàng)目里做過(guò)一次優(yōu)化某個(gè)接口需要同時(shí)更新用戶的積分、等級(jí)、最近活躍時(shí)間原來(lái)是用Pipeline后來(lái)因?yàn)樾枰WC這批操作不被其他命令插隊(duì)改成了事務(wù)。最終效果是接口耗時(shí)降低了近四成而且因?yàn)槭聞?wù)是串行執(zhí)行的省去了Pipeline模式下回包順序的顧慮。4.3 場(chǎng)景三Redis做中間件時(shí)的命令編排比如延遲隊(duì)列和限流現(xiàn)在很多團(tuán)隊(duì)把Redis當(dāng)作輕量中間件使用比如用ZSet實(shí)現(xiàn)延遲隊(duì)列、用Lua腳本實(shí)現(xiàn)令牌桶限流。在這些場(chǎng)景里Redis事務(wù)可以作為保證多命令一致性的基線方案。比如延遲隊(duì)列的消費(fèi)邏輯從ZSet取出到期的任務(wù)記錄到執(zhí)行日志中從ZSet刪除該任務(wù)這三個(gè)動(dòng)作如果分步執(zhí)行在并發(fā)消費(fèi)時(shí)可能出現(xiàn)同一個(gè)任務(wù)被多個(gè)消費(fèi)者拿到用事務(wù)把ZRANGEBYSCORE、LPUSH、ZREM包在一起配合WATCH能夠顯著降低重復(fù)消費(fèi)的概率。不過(guò)要提醒一句如果業(yè)務(wù)邏輯比較復(fù)雜或者條件判斷比較多我通常建議優(yōu)先考慮Lua腳本。因?yàn)長(zhǎng)ua腳本在Redis里是原子執(zhí)行的不僅支持條件邏輯還能在腳本內(nèi)做控制流判斷比事務(wù)更靈活。你可以理解為事務(wù)是“一串無(wú)腦執(zhí)行的命令隊(duì)列”Lua腳本是“帶邏輯判斷的原子執(zhí)行塊”。等會(huì)兒在面試題部分我會(huì)再展開(kāi)這兩者的對(duì)比。4.4 場(chǎng)景四非強(qiáng)一致場(chǎng)景下的訂單與庫(kù)存狀態(tài)更新熱搜詞里有“訂單與庫(kù)存分布式事務(wù)”很多文章動(dòng)輒就上Seata、RocketMQ事務(wù)消息但說(shuō)實(shí)話對(duì)于規(guī)模不大、允許秒級(jí)最終一致的業(yè)務(wù)Redis事務(wù)完全可以作為輕量方案。舉一個(gè)實(shí)際的電商例子用戶下單后需要扣減庫(kù)存、更新訂單狀態(tài)、寫(xiě)一條待支付消息到延遲隊(duì)列。如果這些操作分散在MySQL和Redis中就會(huì)面臨分布式事務(wù)難題。一種討巧的設(shè)計(jì)是把訂單狀態(tài)和庫(kù)存狀態(tài)都維護(hù)在Redis中作為熱點(diǎn)數(shù)據(jù)的緩存或預(yù)扣存儲(chǔ)通過(guò)Redis事務(wù)保證這三個(gè)key的更新原子執(zhí)行之后再由異步任務(wù)把Redis結(jié)果同步到MySQL。在這個(gè)設(shè)計(jì)中Redis事務(wù)承擔(dān)了“短暫期間的強(qiáng)一致”職責(zé)避免了在支付前窗口出現(xiàn)超賣(mài)或狀態(tài)不一致。當(dāng)然如果MySQL已經(jīng)是最終數(shù)據(jù)源且Redis只做緩存那需要考慮緩存與數(shù)據(jù)庫(kù)的雙寫(xiě)一致性這種情況Redis事務(wù)解決不了需要用其他策略比如延遲雙刪、Binlog訂閱同步等。別把工具用錯(cuò)地方。5. 實(shí)操落地完整可復(fù)現(xiàn)的Redis事務(wù)代碼示例5.1 環(huán)境準(zhǔn)備本地快速搭建Redis無(wú)論你是Windows還是macOS先確保有一個(gè)可以連的Redis實(shí)例。Windows上最簡(jiǎn)單的方式是用memurai或者官方的redis-windows分支這些現(xiàn)在都支持Windows原生運(yùn)行不一定要用WSLmacOS用戶直接用Homebrewbrew install redis redis-server /usr/local/etc/redis.conf基礎(chǔ)安裝配置完成后我建議先用redis-cli把今天講的事務(wù)命令各跑一遍養(yǎng)成肌肉記憶。比如redis-cli MULTI SET user:001:score 90 INCR user:001:score EXEC如果返回結(jié)果里第二項(xiàng)是(integer) 91說(shuō)明你的環(huán)境沒(méi)問(wèn)題可以繼續(xù)后面的代碼。5.2 Python實(shí)操庫(kù)存扣減的完整事務(wù)函數(shù)我用Pythonredis-py寫(xiě)一個(gè)庫(kù)存扣減的示例這是生產(chǎn)環(huán)境里最典型的用法import redis client redis.Redis(host127.0.0.1, port6379, decode_responsesTrue) STOCK_KEY stock:sku001 ORDER_KEY order:total LIST_KEY order:list def stock_deduct_with_transaction(user_id: str): while True: try: # 1. 開(kāi)啟WATCH監(jiān)視庫(kù)存key client.watch(STOCK_KEY) # 2. 讀取當(dāng)前庫(kù)存 stock int(client.get(STOCK_KEY) or 0) if stock 0: client.unwatch() return False # 3. 開(kāi)啟事務(wù)執(zhí)行扣減和記錄 pipe client.pipeline(transactionTrue) pipe.decr(STOCK_KEY) pipe.incr(ORDER_KEY) pipe.lpush(LIST_KEY, f{user_id}:{stock}) # 4. 執(zhí)行事務(wù)這里在redis-py里會(huì)調(diào)用EXEC pipe.execute() return True except redis.WatchError: # 如果WATCH的key在事務(wù)執(zhí)行前被修改會(huì)拋出WatchError # 最簡(jiǎn)單的策略是重試或者記錄沖突次數(shù)后重試 continue這段代碼里有幾個(gè)細(xì)節(jié)值得說(shuō)明。第一watch()必須在pipeline(transactionTrue)之前調(diào)用否則監(jiān)視不生效。第二get之后到execute之間如果另一個(gè)客戶端修改了STOCK_KEY服務(wù)端會(huì)讓本次EXEC返回空redis-py會(huì)拋出WatchError我們捕獲后重試即可。第三返回的stock是事務(wù)開(kāi)始前讀到的值用在了日志記錄里這保證了日志里的庫(kù)存和扣減前的庫(kù)存是一致的。實(shí)際壓測(cè)過(guò)這個(gè)函數(shù)在普通筆記本上可以跑到每秒數(shù)萬(wàn)次遠(yuǎn)高于分布式鎖方案的吞吐量。當(dāng)然這是單實(shí)例、無(wú)持久化壓力的前提生產(chǎn)環(huán)境還要看網(wǎng)絡(luò)和AOF策略。5.3 Java實(shí)操使用Spring Data Redis操作事務(wù)服務(wù)端開(kāi)發(fā)里Java占有率很高我再給一個(gè)Spring Data Redis的寫(xiě)法。注意Spring Data Redis操作事務(wù)需要把連接綁定到線程否則多個(gè)方法拿到的不是同一個(gè)連接。先寫(xiě)一個(gè)簡(jiǎn)單的Service方法Service public class OrderService { Autowired private StringRedisTemplate stringRedisTemplate; public boolean createOrderWithRedisTx(String userId, String skuId) { return stringRedisTemplate.execute(new SessionCallbackListObject() { Override public ListObject execute(Nonnull RedisOperations operations) throws DataAccessException { operations.watch(stock: skuId); Integer stock Integer.valueOf(operations.opsForValue().get(stock: skuId)); if (stock 0) { operations.unwatch(); return null; } operations.multi(); operations.opsForValue().decrement(stock: skuId); operations.opsForValue().increment(order:total); operations.opsForList().leftPush(order:list, userId : skuId); return operations.exec(); } }); } }用SessionCallback的好處是整個(gè)回調(diào)在同一個(gè)Redis連接里執(zhí)行multi()和exec()天然配對(duì)。如果WATCH的key被修改exec()返回null你可以據(jù)此判斷是否要重試。有一點(diǎn)需要特別注意StringRedisTemplate的序列化器默認(rèn)是StringRedisSerializer如果你用RedisTemplate且設(shè)置了其他序列化器要保證key的序列化方式一致否則watch和后續(xù)get操作的key可能映射到不同的字節(jié)數(shù)組導(dǎo)致監(jiān)視失效。這是我在項(xiàng)目里踩過(guò)的真實(shí)坑當(dāng)時(shí)排查了半天最后發(fā)現(xiàn)是key的序列化前綴不一致。5.4 Go實(shí)操使用go-redis實(shí)現(xiàn)事務(wù)控制Go生態(tài)里go-redis對(duì)事務(wù)的支持也很完善核心是用TxPipeline。import ( context github.com/redis/go-redis/v9 ) func DeductStock(ctx context.Context, rdb *redis.Client, userID, skuID string) (bool, error) { stockKey : stock: skuID for { // 使用TxPipeline先WATCH然后排隊(duì)執(zhí)行 tx : rdb.TxPipeline() pipe : func(p redis.Pipeliner) error { // 在pipeline里沒(méi)法直接watch需要先單獨(dú)watch return nil } _ pipe // 更清晰的方式使用Watch方法 err : rdb.Watch(ctx, func(tx *redis.Tx) error { stock, err : tx.Get(ctx, stockKey).Int() if err ! nil { return err } if stock 0 { return redis.ErrOutOfStock // 自定義錯(cuò)誤 } _, err tx.TxPipelined(ctx, func(p redis.Pipeliner) error { p.Decr(ctx, stockKey) p.Incr(ctx, order:total) p.LPush(ctx, order:list, userID:skuID) return nil }) return err }, stockKey) if err nil { return true, nil } if err redis.TxFailedErr { // 說(shuō)明事務(wù)被其他客戶端中斷重試 continue } return false, err } }這段代碼和上面的Python版思路一模一樣。rdb.Watch的回調(diào)參數(shù)*redis.Tx就是一個(gè)已監(jiān)視指定key的事務(wù)對(duì)象?;卣{(diào)內(nèi)部用TxPipelined把多個(gè)命令打包然后由go-redis自動(dòng)發(fā)送MULTI/EXEC。實(shí)現(xiàn)上TxPipelined內(nèi)部會(huì)調(diào)用tx.Multi()之后執(zhí)行Exec()。如果在Watch階段發(fā)現(xiàn)key被改返回TxFailedErr這時(shí)候重試即可。我自己的體會(huì)是Go版寫(xiě)起來(lái)最順手因?yàn)樗鸦卣{(diào)、錯(cuò)誤處理和重試邏輯組織得很緊湊適合服務(wù)端高并發(fā)環(huán)境。6. 事務(wù)與Lua腳本、Pipeline的選型對(duì)比6.1 為什么說(shuō)Lua腳本是事務(wù)的進(jìn)階替代品很多人在面試中被問(wèn)到“Redis事務(wù)和Lua腳本有什么區(qū)別”時(shí)會(huì)卡住。我的理解可以濃縮為一句話事務(wù)是把一堆命令打包執(zhí)行Lua腳本是把一堆邏輯打包原子執(zhí)行。區(qū)別體現(xiàn)在兩個(gè)方面。第一事務(wù)命令在執(zhí)行時(shí)不能做條件判斷每個(gè)命令都是“提前定好”的Lua腳本可以在內(nèi)部讀寫(xiě)Redis數(shù)據(jù)并且根據(jù)結(jié)果決定后續(xù)步驟靈活性高得多。第二事務(wù)執(zhí)行過(guò)程中某條命令失敗的后續(xù)行為是“繼續(xù)執(zhí)行其他命令”Lua腳本如果在執(zhí)行過(guò)程中報(bào)錯(cuò)整個(gè)腳本會(huì)終止并回滾已執(zhí)行的寫(xiě)操作其實(shí)是單線程運(yùn)行導(dǎo)致后續(xù)命令未被執(zhí)行看起來(lái)更符合“原子性”直覺(jué)。舉一個(gè)具體例子我們想要“只有在庫(kù)存大于0時(shí)才扣減”。用事務(wù)做你必須在外部先GET庫(kù)存然后判斷再M(fèi)ULTI、DECR用Lua做local stock tonumber(redis.call(GET, KEYS[1])) if stock 0 then return -1 end redis.call(DECR, KEYS[1]) redis.call(INCR, KEYS[2]) redis.call(LPUSH, KEYS[3], ARGV[1]) return 1這段腳本通過(guò)redis.call(GET, KEYS[1])讀取庫(kù)存在腳本內(nèi)完成條件判斷執(zhí)行一次EVAL就能完成多步操作且整個(gè)過(guò)程因?yàn)镽edis單線程執(zhí)行Lua而不會(huì)被打斷。這個(gè)“條件原子性”是事務(wù)做不到的。因此我的建議是如果事務(wù)隊(duì)列里的命令彼此獨(dú)立、沒(méi)有依賴關(guān)系用事務(wù)就夠了如果有依賴判斷優(yōu)先選Lua腳本。在實(shí)際的高性能生產(chǎn)系統(tǒng)里L(fēng)ua腳本的使用頻率遠(yuǎn)高于事務(wù)原因也在這里。6.2 Pipeline與事務(wù)的異同Pipeline和事務(wù)都能減少網(wǎng)絡(luò)往返不同之處在于Pipeline只是把多條命令一次性發(fā)給服務(wù)端命令之間沒(méi)有原子隔離也沒(méi)有WATCH機(jī)制事務(wù)則要求MULTI/EXEC包裹命令在服務(wù)端排隊(duì)并串行執(zhí)行。有一個(gè)細(xì)節(jié)值得注意在Pipeline里加MULTI/EXEC就變成了“Pipeline 事務(wù)”。很多客戶端庫(kù)的pipeline(transactionTrue)就是這個(gè)原理。如果你只需要批量操作且允許中間被其他客戶端插入用純Pipeline性能可能略高少了事務(wù)狀態(tài)機(jī)的開(kāi)銷(xiāo)如果你需要“不可插隊(duì)”的語(yǔ)義那就用事務(wù)。7. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄7.1 為什么我用了事務(wù)并發(fā)時(shí)數(shù)據(jù)還是錯(cuò)了這是我在技術(shù)群里被問(wèn)得最多的問(wèn)題??赐昵懊娴姆治瞿銘?yīng)該有感覺(jué)了八成是因?yàn)闆](méi)加WATCH或者WATCH的key不對(duì)。事務(wù)只能保證隊(duì)列內(nèi)的命令不被其他請(qǐng)求插隊(duì)但如果你在MULTI之前用GET讀了值在MULTI之后根據(jù)這個(gè)值做DECR那么這個(gè)“讀到的值”在MULTI到EXEC之間可能已經(jīng)過(guò)期了。正確做法是先WATCH目標(biāo)key再GET再M(fèi)ULTI、EXEC這樣當(dāng)key在期間被修改時(shí)EXEC會(huì)返回nil。簡(jiǎn)單來(lái)說(shuō)事務(wù)給不了你“Read Your Write”的快照隔離WATCH才是樂(lè)觀鎖的核心。我見(jiàn)過(guò)不少初學(xué)者用事務(wù)做樂(lè)觀鎖但忘了WATCH最后高并發(fā)下出現(xiàn)超賣(mài)又反過(guò)來(lái)怪Redis事務(wù)設(shè)計(jì)不行。工具本身沒(méi)有問(wèn)題問(wèn)題是使用姿勢(shì)不對(duì)。7.2 事務(wù)里的命令為什么返回QUEUED然后什么都不執(zhí)行這種情況通常是你在一個(gè)已經(jīng)處于事務(wù)狀態(tài)的連接里又發(fā)送了MULTI或者因?yàn)楫惓M顺鰧?dǎo)致連接處于懸掛狀態(tài)。解決方案很簡(jiǎn)單發(fā)送DISCARD重置連接狀態(tài)或者直接重連。還有一次我在Java里遇到了詭異的“事務(wù)里只有一部分命令執(zhí)行了”查了半天發(fā)現(xiàn)是連接池中的redisTemplate被其他線程復(fù)用事務(wù)命令被分散到了多個(gè)連接上。所以說(shuō)用Spring Data Redis操作事務(wù)務(wù)必使用SessionCallback就是這個(gè)原因。另一個(gè)常見(jiàn)情況Redis Cluster下事務(wù)執(zhí)行報(bào)CROSSSLOT錯(cuò)誤。這是cluster模式對(duì)多key操作的天然限制。解決辦法是把相關(guān)key規(guī)劃到同一個(gè)hash slot中或者改用Lua腳本Lua腳本同樣受slot限制但可以通過(guò)Hash Tag解決。7.3 Redis事務(wù)能不能解決緩存一致性我再?gòu)?qiáng)調(diào)一遍不能。Redis事務(wù)解決的是“多個(gè)Redis命令之間的原子執(zhí)行與隔離”不是“Redis與MySQL之間的數(shù)據(jù)一致性”。如果你緩存里放了數(shù)據(jù)庫(kù)的快照然后通過(guò)事務(wù)更新了多個(gè)緩存key這只能保證緩存內(nèi)部一致無(wú)法保證緩存和數(shù)據(jù)庫(kù)一致。熱點(diǎn)搜索詞里的“訂單與庫(kù)存分布式事務(wù)”如果要徹底解決跨Redis和MySQL的一致性問(wèn)題要么用可靠消息要么用本地消息表要么用Seata等方案而不是指望用Redis事務(wù)做完一切。我自己的一個(gè)項(xiàng)目實(shí)施原則是“跨數(shù)據(jù)源的問(wèn)題不要在單一數(shù)據(jù)源內(nèi)部求解”否則只會(huì)制造出更復(fù)雜的臟讀、延遲和補(bǔ)償邏輯。7.4 事務(wù)執(zhí)行期間AOF刷盤(pán)問(wèn)題會(huì)影響一致性嗎很多人問(wèn)Redis事務(wù)執(zhí)行完了但AOF沒(méi)刷盤(pán)進(jìn)程崩潰了事務(wù)結(jié)果會(huì)不會(huì)丟這個(gè)問(wèn)題的本質(zhì)是Redis持久化的配置策略和其他寫(xiě)操作一樣。默認(rèn)appendfsync everysec下AOF最多丟一秒數(shù)據(jù)。事務(wù)不會(huì)額外保證持久性也不提供比普通命令更高的持久化語(yǔ)義。如果你的業(yè)務(wù)對(duì)數(shù)據(jù)安全要求高需要結(jié)合Redis主從集群、AOF刷盤(pán)策略、哨兵/Cluster的故障切換機(jī)制來(lái)綜合設(shè)計(jì)。7.5 為什么我的WATCH一執(zhí)行EXEC就返回nil有幾種可能WATCH的key確實(shí)在事務(wù)執(zhí)行前被修改了最常見(jiàn)同一個(gè)連接多次使用WATCH且key被改動(dòng)后沒(méi)有UNWATCH使用了Clusterkey的監(jiān)視在不同的節(jié)點(diǎn)上Cluster模式不支持跨slot的WATCH客戶端庫(kù)在multi()之前自動(dòng)發(fā)送了watch()和你的顯式watch產(chǎn)生沖突排查辦法很簡(jiǎn)單在WATCH之后、MULTI之前用CLIENT LIST看連接狀態(tài)或者在命令之間加GET確認(rèn)key的版本。實(shí)在不行先UNWATCH再重新WATCH。8. 面試題深度回答模板你能拿分的三個(gè)層次關(guān)于Redis事務(wù)的面試題網(wǎng)上隨便一翻就是一大把。我見(jiàn)過(guò)很多候選人背答案但真正能拿到高分的是能夠區(qū)分層次回答的人。這里給出一套我自己的答題框架。第一層基礎(chǔ)概念層。回答Redis事務(wù)是什么四個(gè)命令的作用執(zhí)行流程三段論。這層最多拿及格分。第二層原理對(duì)比層。主動(dòng)說(shuō)出Redis事務(wù)與MySQL事務(wù)在原子性、隔離性上的本質(zhì)差異舉一個(gè)失效場(chǎng)景說(shuō)明事務(wù)執(zhí)行中命令失敗不會(huì)回滾。這層能體現(xiàn)出你真的用過(guò)而不是只會(huì)背八股。第三層場(chǎng)景與取舍層。結(jié)合項(xiàng)目實(shí)際說(shuō)明什么時(shí)候用Redis事務(wù)什么時(shí)候用Lua腳本什么時(shí)候該用分布式鎖以及Redis Cluster對(duì)多key事務(wù)的限制。如果能順帶講出你在Spring Data Redis里遇到的連接復(fù)用問(wèn)題和解決過(guò)程面試官大概率會(huì)在心里給你加一分。下面我整理了一份面試官高頻追問(wèn)的參考回答追問(wèn)推薦回答方向Redis事務(wù)保證原子性嗎不保證傳統(tǒng)原子性沒(méi)有回滾機(jī)制命令錯(cuò)誤不影響其他命令Redis事務(wù)如何解決并發(fā)競(jìng)爭(zhēng)用WATCH做樂(lè)觀鎖檢測(cè)key在事務(wù)執(zhí)行前是否被修改WATCH和分布式鎖哪個(gè)好場(chǎng)景不同樂(lè)觀鎖適合短操作、沖突不頻繁分布式鎖適合臨界區(qū)需要長(zhǎng)時(shí)間持有的場(chǎng)景MULTI執(zhí)行失敗還能重試嗎可以但要重看業(yè)務(wù)邏輯如果部分命令已執(zhí)行重試前可能需要補(bǔ)償Redis事務(wù)和Lua腳本怎么選無(wú)依賴用事務(wù)有判斷邏輯用LuaLua可腳本內(nèi)條件與循環(huán)控制更精細(xì)Cluster下怎么用事務(wù)用Hash Tag把key約束到同一slot或者放棄事務(wù)改用Lua同樣需同slot9. 我的幾點(diǎn)實(shí)戰(zhàn)心得與小技巧最后分享幾個(gè)書(shū)本之外的體會(huì)。第一生產(chǎn)環(huán)境中我很少單獨(dú)用Redis事務(wù)來(lái)做復(fù)雜的庫(kù)存扣減至于為什么前面已經(jīng)說(shuō)過(guò)了缺少回滾和條件判斷Lua腳本能做得更好。但這并不代表Redis事務(wù)沒(méi)有價(jià)值它在批量操作、輕量級(jí)一致性場(chǎng)景下的簡(jiǎn)潔性和性能優(yōu)勢(shì)非常突出尤其是跨命令的“不可插隊(duì)”能力在計(jì)數(shù)統(tǒng)計(jì)、日志聚合里很實(shí)用。第二幾乎所有主流Redis客戶端庫(kù)對(duì)事務(wù)的支持都已經(jīng)很成熟但引入事務(wù)時(shí)要特別注意連接綁定問(wèn)題。在Spring中務(wù)必使用SessionCallback或RedisTemplate.execute在Python中務(wù)必使用同一個(gè)Pipeline對(duì)象。如果你在事務(wù)里發(fā)現(xiàn)命令時(shí)靈時(shí)不靈先懷疑連接是否被復(fù)用再懷疑key的序列化是否一致這兩個(gè)問(wèn)題占了八成故障原因。第三如果你們團(tuán)隊(duì)已經(jīng)在用Redis Cluster那么多key事務(wù)基本是用不了的。我的替代方案是優(yōu)先用Hash Tag解決slot限制如果業(yè)務(wù)關(guān)系復(fù)雜就改用Lua腳本并在腳本內(nèi)做數(shù)據(jù)校驗(yàn)如果你需要跨多個(gè)Redis分片甚至跨數(shù)據(jù)庫(kù)的強(qiáng)一致坦白說(shuō)Redis事務(wù)就不是正確選項(xiàng)了去研究可靠消息或Seata這類(lèi)方案吧。還有一個(gè)小技巧在壓測(cè)的時(shí)候不要只看吞吐量要關(guān)注事務(wù)的排隊(duì)長(zhǎng)度。當(dāng)你的大量并發(fā)請(qǐng)求都帶著MULTI/EXEC壓向Redis時(shí)單線程串行會(huì)導(dǎo)致命令在隊(duì)列中堆積延遲會(huì)線性上升。所以事務(wù)適合偶爾搶購(gòu)、批量操作這種中低頻場(chǎng)景不適合所有請(qǐng)求都走事務(wù)的超高頻路徑。如果讓我給一條最核心的建議那就是把Redis事務(wù)當(dāng)作一個(gè)“批量執(zhí)行樂(lè)觀鎖”的組合工具而不是當(dāng)作一個(gè)“數(shù)據(jù)庫(kù)事務(wù)”的替代品。調(diào)整了預(yù)期之后你會(huì)發(fā)現(xiàn)它在很多場(chǎng)景里都能用得恰到好處。最后的最后再留一個(gè)擴(kuò)展思考如果你想要在Redis事務(wù)之上做最終一致可以怎么結(jié)合我自己的方向是“事務(wù)Lua異步對(duì)賬”把事務(wù)里的多個(gè)key視為一個(gè)短期狀態(tài)由異步任務(wù)掃描并校驗(yàn)一致性發(fā)現(xiàn)問(wèn)題再補(bǔ)償。這個(gè)思路在很多緩存治理項(xiàng)目里都能落地。后續(xù)如果想聊我可以專門(mén)寫(xiě)一篇“基于Redis實(shí)現(xiàn)輕量級(jí)最終一致性方案”的實(shí)戰(zhàn)文章。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩97在线| 超碰在线97国产| 翔田千里无码一区| 亚洲精品91| 久操网无码在线| 日韩无码黄色片| 久草婷婷| 无毛精品| 欧美亚洲91| 超碰在线香蕉| 伊人97色天使| 九九九九精品精| 欧美中文字幕日韩在线| 嗯啊不要啊在线 | 无码精品久久| 亚洲av强奸乱伦| 日韩美一区| 国产精品丝袜久久亚洲不卡| 三级特黄60分钟播放| 操操操日本的逼| 传媒免费一区二区三区| 乱伦1色页| 日产中文字幕2020| 草草草视频| 精品超碰国产| 91欧美色| 日本午夜精品理论片A级APP发布| 操B久久| 丝袜美腿丝袜| 亚洲国产麻豆一区二区三区| 人妻夜夜爽天天爽麻豆三区网站 | 日韩综合色图| 99碰碰| 91爱欧美| 伊人激情五月天一区二区| 1024亚洲中文字幕久在线看片你懂的 | 13小男生GAY自慰脱裤子| 亚洲最大无码中文字幕网站| 四虎国产成人精品免费一女五男| 很很操在线| 丝袜美腿诱惑亚洲欧美视频在线观看| 97在线播放| 色爱三区| 一区二区三区四区理论片| 国产美女高潮叫床视频| 久草线上视频免费看| 国产不良强奸视频免费看| 色综和网| 手机在线视频国内精品| 加勒比五月天| 色色色网站| 亚洲精品自拍| 亚州欧美总和| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 天天躁狠狠躁av| 欧美在线天堂| 亚洲国产一级中文综合久久天堂在线免费观看| 久久99午夜精品一区人妻| 色爱亚洲| 四虎精品永久在线观看| 婷婷综合网| 欧美色道啊| 亚洲最新中文字幕免费| 欧美色视| 欧美激情 一区| 欧美日韩m| 最好看的中文字幕在线2018| 天天澡天天爽日日AV| 日本久操视频| 大香蕉黄色一区| 成人国产视频在线观看| 久久同城AV| 日韩精品一二三四| 亚洲精品无码少妇久久| 日日操免费视频| 夜夜嗨一区| 一区二区三| 日语五十路和六十路亚洲国产精品| 日本精品高清一二区一本到| 欧美18 在线观看| 久久动漫精品视频这里只有精品| 九色97| 91老熟女| 日少妇亚洲版| 999久久久精品国产| 熟女激情综合网| 人人操人人色网| 欧洲亚洲人人爽爽视频| 精品久久在线区一区| 日本一区二区成人在线| 日本视频在线观看污污污| 97干综合网| 日本人体九九九九九九| 成人小说视频在线精品欧美| 国产精品在线一区二区| 综合色播| 国产精品岛国片在线观看| 美国黄片aaa| 91爱| 老司机深夜18禁污污网站| 一起草在线视频| 啪啪啪男女亚洲中文字幕99| 好吊色一区| 国产精品嫩草久久久久| 自拍偷拍国产欧美日韩韩| 国产精品久久久| 亚洲视频精选| 久久免费9| 亚洲情色 自拍| 欧美亚洲特P| 欧洲中文字幕| 99热这里是精品| 色五月综合| 人妻熟女一区在| 亚洲天堂 视频你懂的| 777奇米影视777四色| 欧美午夜视频精品久久| 91精品无码人妻系列| 久久精品店| 亚洲黄色a级片| 日韩无码成人电影| 亚洲性综合9| 97资源超碰| 国产精品爽爽va在线观看98| 91九色在线| 强奸xx国产| 精品人妻1区| AV乱伦专区| 家庭乱伦国产精品| 国产精品一区午夜福利| 亚洲国产第一页综合视频| 激情综合五月| 亚洲天堂久久| 欧美操逼视频二区| 亚州高清AV| 屁股久久久久久久| 高清国产性猛交xxxx乱大交| av一区二区三区不卡| 亚洲啪啪视频免费| 五月天色综合| 天操老女人| 欧美国产操逼| 无码78| 插入逼91| 天天做日日爱夜夜爽| 日本污ww视频网站| 欧美A√综合网 | 啊啊啊免费视频| 精品国产乱码久久| 乱伦av麻豆| av九九| 伊人成人情色综合| 9精品在线| 9久久精品| 98色网| 啊啊啊啊二区好大| 极品少妇久久久| 亚洲自拍偷拍视频在线| 韩日精品四区| 欧美日韩另类字幕中文| www. 男人天堂成人在线| 国内一级精品| 黄色区免费观看中文字幕| 中文字幕在线观看视频www| 欧美亚洲一区二区久久久婷精品大包诱| 加勒比伊人综合| 超碰97COm中文| 午夜电影在线观看无码专区| 欧美亚洲性爱一区二区| 日本黄色精品| 久久久精品成人国产| 亚洲精品一二三四区| 97超碰色中文字幕| 中文字幕精品区先锋资源| 一区二区首页| 婷婷超| 韩国一级婬片A片无码天美| 国产99 中文字幕日韩小视频| 久久久18禁| 伊人操| 国产麻豆一级精品视频| 久久精品视| 欧美人人操人人插| 久久大香蕉手机高清视频| 国产视频97| 夫妻天天操岛国视频| 天天干天天操天天干天天操| 99色骚| 妇女一区二区三区| 日本九九九九| 欧美视频一区二区三区| 午夜男女爽爽爽在线视频| 日韩三级性| 亚洲伊人a线观看视频| 色穴精品| 狠狠操使劲操| 久久久久久久久久黄色网| 国产亚洲福利第一页丝袜| 男人天堂2019亚洲| 色操逼网| 日韩精品人妻中文字有码在线 | 欧美色66| 亚洲AV秘无码一区..| 国产suv精品一区二区四| 精品视频一区二区| 精品妇女一区二区三区| 国产熟女完整版中字| 国产传媒1234区| 亚洲精品国语在线播放| 亚洲人精品久久久喷水| 亚洲高清无毛一区二区| 97视频在线视频| 国产精品色片一区二区| 性91| 欧美美女自慰一区二区三区| 欧亚无码视频| 91N综合在线| 亚洲精品一二区| 色悠久久久av| 五月天色色色| 欧美性生活男人的天堂| 人妻素股| 精品久久一区二区三区四区五区| 蜜臀一区二区三区在线| 亚欧免费观看视频| 色偷偷人人玩人人舔人人操人人摸人人爽| 欧美久久人人网| WWW美腿丝袜香蕉中文| 一本色道综合久久欧美日韩精品| 亚洲人成色9999精品久久| 亚洲一区二区在线观看91| 欧美制服另类丝袜| 6080YYY午夜理论片在线观看| 欧美一二级| 亚洲综合激情五月久久| 一级二级三级黑人无码| 大香蕉色网| 思思热国产在线视频| 日韩欧美天堂| 亚洲成人精品久久久| 51久久夜色精品国产麻豆| 九九热午夜欧亚国产视频| 狠狠操狠狠插| 午夜偷拍久久熟女| 97精品| 亚洲和欧美裸体美女双飞视频| 九九综合久久| 午夜福利激情在线视频| 国产视频第二页| 一区| 乱人伦 国语对白:视频直接看| 亚洲AV无码天美传媒一区| 久久久111| 91一起操| 亚洲精品亚洲人成在线麻豆| 成人26uuu| 激情另类激情| 青青草原成人| 色五月婷婷五月天| 国产黄色影片在线观看| 大鸡巴久久| 69丨亚洲丨精品丨入口免费播放| 一区,二区,三区视频| 91久久久久久久久18| 国产一级137片内射麻豆| 黄色工厂这里只有精品| 99在线啪| 欧美与日韩97| 欧美熟女妇同| AV高清一区| 东京日日夜夜| 中文字幕 码 自拍 视频 区| 操人91| xxxx网站亚洲精品| 99久久精品欧美国产| 777超碰| 国产风韵犹存熟妇三区| 一二视频神马久久传媒| 中文字幕女同在线| 九九九草| 任我爽在线视频免费观看| 蜜桃视频一区二区三区在线观看| 日韩天堂av电影在线观看| 色婷婷av在线观看| 激情小说五月天| 亚洲欧美精品福利在线| 国产麻豆一级精品视频| 入口操逼网站| 97福利视频| 久久久久国产精品片区无码直播| 蜜桃无码AV一区二区| 国产午夜激片Av毛片不卡| 九月丁香婷婷| 久久久精品国产亚洲伊人| 激情文学网伊人| 夜夜操2028| 人妻嗯啊啊在线播放| 99久久9| 九九热九九| 婷婷五月av| 五月天激情小说| 精品久热| 亚洲天天艹| 亚洲色堂免费视频| 亚洲 欧美 小说| 嗯嗯,好大,好爽,好骚 | 一级日本牲交大片好爽在线看| AV乱伦国产| 日韩三级在线观看网站| 操逼片国产| 日韩欧美tv一区二区在线观看| 亚洲第一精品在线视频 | 一级一性爱免费视频| 伊人操| 青草成人免费视频一com| 亚洲少妇在线观看| 黄页视频网站野外| 五月天综合在线| 久久久啊啊| 一区二区 电影 亚洲| 亚洲精品一卡二卡三卡福利视频网站| 中国黄色特级精品一区二区三区片| 国产一区二区精品在线视频| 91高清欧美| 黄色免费网| 亚洲精品国产熟女久久久久久| 国产AV毛片| 日本三级中国三级99人妇网站| 亚洲91少妇| 熟女天天干| 九九超碰综合网| 99在线精品视频| 翔田千里AⅤHD无码| 国产色精品午夜大片| 色色婷婷丁香| 精品国产国产AV| 一卡二卡在线播放| 大香蕉乱级| 色婷婷香蕉| 国产suv精品一区二区四区999| 日欧毛片久久| 热99这里有精品综合久久| 国产一区在线观看无码AV| 天天插天天操| 欧美少妇性乱| 国产在线视频午夜精华在| 韩国一级AAA| 欧美色图天堂在线| 伊人9| 午夜男女爽爽大片免费观看| 欧亚在线视频| 粉嫩av一区二区三区四季| 91人人操| 婷婷精品| 欧美人妖内射| 国产精品一区二区 尿失禁| 久久婷婷在线观看视频| 91色欧美| 色五月亚洲| 自拍亚洲综合| 久久久久久亚洲Av无码| 欧美日韩性感| 丰满人妻一区二区三区四区| 亚洲色图殴美色图激情乱伦| 青青草成人视频在线观看二区| 91精品老女人| 亚洲丝袜色| 67914在线兔费成人视频| 午夜亚洲国产理论秋霞| 用力操死我| 9久久精品| 女人午夜视频777| 久久日本熟女精品一区| 在线播放免费av福利片| 欧美一区二区三区大综合| 国产精品播放| www.婷婷| 99re98| 黑丝少妇| 婷婷色香伊人| 男人的天堂2010| 久艹免费| 婷婷五月影院| 男人久久天堂| 天堂日本亚洲欧美| 国产女大学生AV| 亚洲第一页欧美| 午夜精品久久久久久久第一页按摩| 中国熟女老妇仑乱一区二区三区| 成人性爱高清视频免费看| 男人的天堂成人的社区| 亚洲欧美综合| 视频二区美腿丝袜制服人妻欧美| 色妇综合网| 国产av尤物| 99re99| 日本一级一级一级一级| 91美女在线| 六月丁香啪啪啪| 蜜臀久久99精品久久久久久酒店| 国产精品交换一区二区| 日韩AV无码网站| 日本中文字幕一区| 色噜噜人妻丝袜a∨先锋影| 久久久78| 啊啊啊啊啊啊啊国| 日韩性色b| 中国人高清www色视频免费| 亚洲 中文 女同| 成人精品久久久午夜福利| 97露脸精品丝袜| 久操凹凸视频| 一级AAA片一区二区三区| 99无码视频| 97视频在线| 天天看片麻豆| 久99| 无码免费在线观看黄色片| 97精品国产手机| 国产97视频免费观看| 成人青青草原伊人| 大香蕉啪啪啪啪在线| 免费在线观看国内色片网站网址| 91n欧美| 人妻在线大香蕉| 日本 欧美 国产一区| 亚洲天天操| 91久久国产综合精品| 国产67194| 97超碰人人操人人操| 伊人色综合欧美| 婷婷五月天成人网| 在线看的av| www欧美91| 97 超碰 人人做 人人爱| 久久精品国产亚洲AV无码电影| 麻豆亚洲AV成人无码久久精品| 日日AV加勒比| www.夜夜操| 偷拍亚洲熟女视频播放| 久久 精品| 亚洲色图 综合| 操逼片中文| 亚洲三级。日韩三级| 大香蕉伊人在线成人AV在线观看| 亚洲av强奸乱伦| 精品国产91内射久久| 婷婷人妻激情| 日本久久999| 老熟女91av| 2020国产精品| 黄色网址在线免费观看| 日韩视频精品在线观看| 日韩啪啪视频| 97久久久久久久久久| 青青草日本中文字幕| 深爱五月婷婷| 激情综合网五月婷婷五月天| 被男人吃奶很爽的毛片| 淫荡网址| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 日韩视频小说在线观看| 久草看看看| 亚州综合AⅤ| 成年男人的天堂| www.夜夜操| 懂色AV蜜臀无码精品APP| 强被迫伦姧在线观看无码网站| 午夜一区| 亚洲丝袜少妇在线| 久午视频| 久操国产在线| 日韩本不卡视频在线观看| 青青草玖玖爱| 大香蕉在线视频重口味毛片在线| 日日日啊啊啊| 夜夜操91744565| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 午夜精品久久一区二区| 日韩小电影| 天天综合网~91| 久久久青青草| 色欧洲| 超碰97 线线 在现| 色噜噜狠狠色综无码久久合欧美| 欧美色图亚洲色| 99.色网| 色婷婷婷五月天激情四射| 丁香五月婷婷色| 黄色片大香蕉| 色5月婷婷| 五月丁香六月| www老逼91| 亚洲美欧999| 成人日韩中文字幕| av东京热男人的天堂| 国产精品天干天干综合网麻豆 | 国产精品露脸在线观看| 色欲三区| 国产精点久久久成人| 国语av最新自产拍在线观看| www.99在线| 大香樵伊人网| 美女91在线观看| 亚洲性猛| 成人小电影网站tex| 综合久久9| 无码操逼视频一下| 搡老女人老妇女AAA一VU麻豆 | 国产福利一区二| 26uuu性| 婷婷AV一区二区三区| 婷婷五月天网| 亚洲日韩青青草色月| 精品无码人妻一区二区免费蜜桃| 东京热AV男人的天堂| 久久超碰网| 亚洲AV成人无码一二三久久| h无码动漫在线观看| 国产一级片| 人人污日韩一区二区| 亚洲丝袜99| 一区二区三| 岛国大片在线观看网站入口| www.色婷婷.com| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 精品美女人人干| 天天躁狠狠躁av| 日韩日韩日韩-国产乱码精品一区二区| 啪啪啪综合| 国产精品ⅴ无码大片在线看.| 久久一区二区三区入口| 无码91| 久久久久久久9最新免费视频观看| 青青五月天| 国产精品亚洲一级av第二区| 国产又粗又又黄又猛| 成人一区二区三区四区| 麻豆成人AV| 奇米四色影视777久久久| 激情五月天婷婷| 日韩不卡网操逼中文字幕日韩| 91 丝袜在线播放| 国模少妇一区二区三区| 九九热超碰97亚洲最新香蕉| 国产超碰| 色天堂综合| 国产精品96久久久久久| 国产精品久久久三级无码| 中美日韩毛片| 91综合网站| 欧美顶级黄片AAAAA在线免费看| 综合久欧洲| 亚洲少妇在线观看| 久久曰曰| 99色在线| 亚洲精品啪视频| 九草在线大香蕉| aa片毛片| 日夜啪电影| 国产精品丝袜在线| 日本 欧美 国产一区| 久久综合久色欧美综合狠狠| 久操操AV电影| 9 7超碰在线免费观看| 美女诱惑久久| 一区二区 韩日AV| 久久久久久十| 在线播放中文字幕| 桑老女人九区| 久久99精品视频| 97超碰欧美手机在线| 搡老女人老妇女AAA一VU麻豆| 久久超碰、| 一区二区三区美女超清| 亚洲综合码| 天天日天天操天天射河南省| 欧美在线官网| 欧美一区二区三区不卡高清视频| 中文伊人大香蕉视频| 精品一区二区三区丰满熟女-亚洲欧美一区| 精品一区二区亚洲国产| 蜜臀99久久精品久久久久久| 大香蕉乱伦视频网| 78精品在线| 激情婷婷五月天| 青青草国产欧美非洲黑人| AV中文在线可看| 91黑丝在线| 99re9这里只有精品| 影音先锋日本乱伦| 无码人妻精品一区二区三区九九 | 色99久草| 啪啪综合网| 91丨人妻丨国产丨丝袜| 亚洲欧美中日韩| 午夜超爽| 一区二区三区男人的天堂| 超碰人人在线| 亚洲无码电影久久久| 国产又大又粗又长视频在线| 欧美黑人精品在线播放| 婷婷久久久精品| 发朗少妇买婬全视频中文| 免费AV中文网在线观看| 97精品视频网站| 国产精品视频白浆免费| 啊啊啊啊好多水| 亚洲男人的天堂AV| 插欧洲美女欧美精品| 91第一页| 噜噜噜久久亚洲精品色情| 囯产乱伦一区二区三女 | 国产搭汕a级片| 一区久久久二区| 中文字幕欧美精品亚洲日韩蜜臀| 国产又大又粗又长视频| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 久久99国产综合精品女同| 最新亚洲人成网站在线影院| 97欧美色| 国产传媒美日韩av| 美女被艹尤物视频| 亚洲日韩人妻中文字幕一区| 精品视频久久区| 欧美嫩性色| 亚洲欧美性生活| 操操逼操操逼操操逼逼| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 成人怡红院| 涩涩久久精品| 亚洲国产精品久久久久婷婷青年| 国产精品自在线发布| 亚洲综合另类| 精品久久久一本一道| 国产一区麻豆免费观看| 日日夜夜干| 色呦呦呦在线观看视频| 欧洲性爱无码区| 精品国产乱码久久久久久久久久毛片| 亚洲欧美另类少妇精品| 99热日本| 最新啪啪视频| 国产精品亚洲无码| 美國A片| 玖玖资源视频一区二区三区| 日本免费不卡二区| 亚洲欧美经典一区二区 | 久草婷婷| 欧美日韩国产中文超碰| 青青草天天亲夜夜操网| A 在线网址| 9色国产精品一区粉嫩| 欧美色97| 加勒比av网| 啊啊啊要高潮了| 婷婷激情一区二区三区俺也去| 99久热| 国模吧 一区二区三区| 国产操操日韩三级黄| 国产精品黑人一区二区三区| 成人怡红院| 欧美色97| 午夜精品久久久久久久第一页按摩| 色偷综合| 91影视亚洲| 嗯嗯啊啊好疼| 久久久久久久国产| 久久綜合很很很| 久久精品一区| 久久亚洲熟妇在线视频| 午夜天堂精品久久| 国产传媒日本欧美专区| yazhousetuoumei| 成人熟女视频一区二区三区| 天堂日本亚洲欧美| 亚洲精品丝袜| 久久九七| 91精品国久久久久久无码| 日夜干射色啊| 亚洲黄a三级三级三级看三级| 欧美一区二区成人一卡| 天操老女人| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 亚洲精品国产精品成人| 激情婷婷综合久久| 久久久无码精品人妻二区 | 操逼逼中文字幕| 免费看黄视频亚洲网站| 免费亚洲黄色视频在线观看| 免费在线黄片视频| 自拍偷拍2025在线观看| www.久久| 亚洲最大黄网| 色色综合97| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 九九九九九九综合| 日韩97在线| 91色图| 一道α片欧美| 亚洲成人久久一区二区| 国产热RE99久久6国产精品首| 色综合色| 另类亚洲图色| 中文日韩欧美熟| 欧美亚洲天天| 国产在线观看一区二区三区| 日韩性爱视频在线免费观看 | 五月天婷婷在线看| 狠狠色狠狠色狠狠五月| 大香蕉手机视频| 超碰性爱97| 久久久久久久久国产| 99夜夜操| 亚洲无码成人精品| 成人性爱电影一区二区| 久热69九色熟妇97| 99re在线精品78| 蜜桃久久一区二区| 亚洲国产欧美一区二区潘金莲| 国产亚洲日本精品在线| 日本熟妇熟色97一本在线观看| 色超碰综合| 日韩99999| 无码外流操逼视频| 久久久婷| 亚洲黄a三级三级三级看三级| 亚洲欧美洲综合| 搞中出久久| 亚洲少妇喷视频看| 欧美亚州综合图片| 东京热大香蕉| 日韩欧美俄罗斯A片| 午夜天天碰综合视频| 色五月激情AV在线| 欧美日韩大香蕉| 日韩成人大片在线观看| 在线天堂999| 欧美色亚洲色| 国产高清吃奶免费视频网站| 丁香五月天堂网| 99精品高潮| 欧美精品成人一区二区在线观看| 欧美99热| 偷拍片久久| 影音先锋日本乱伦| 色97| 人人妻人人爽人人精品| 国语精品内射在线观看| 久久曰曰| 男插女青青影院| 色色无码| 理论久久婷婷网8| 人人摸人人添人人操| 蜜桃精久三区| 99久久99久久免费精品蜜臀| 天天躁日日躁AAAXX| 亚洲综合图片在线| 成人av影院在线观看| 国产精品肉丝自拍| 91在线欧美| 狠狠干狠狠干| 91性网| 丁香五月久久| 精品少妇高潮久久| 留下AⅤ黄色片| 玖玖草久草99蜜月一区二区三区| 97人人夜夜精品视频| 亚洲另类色图片| 国产偷拍网站| 欧美精品丝袜久久久中文字幕| 精品午夜福利| 久久久精品国产亚洲伊人| www欧美91| 天天综合精品| 久九色| 欧美日韩性感| 超碰97久久| 国产视频三区四区| 中日韩一区二区三区欧美| 久久久久久久少妇| 粉嫩av平台| 啊啊啊啊二区好大| 自怕偷自怕亚洲精品| 日韩av色图| 国产尤物AV尤物在线观看不卡| 97网址97| 人人色人人操在线| 激情在线青青操| 丝袜视频一区二区在线播放国产中文| 夜夜免费视频| 懂色AV蜜臀无码精品APP | 激情开心五月天| 超碰97丝袜| 国产精品久久发布| 2019精品国产无码成人| 亚洲欧洲色情高清| 日韩一区二区高清在线观看的| 久久视频,这里只有精品| 视频分类 国内精品| 狠狠入| 熟女性视频| 亚洲 欧美 日韩 国产一区二区 | 亚洲精品丝袜-不卡成人免费……| 99999re| 国产a级精品| www.大香| 婷婷10月天青娱乐| 欧美少妇大量自拍视频在线观看| 国产家庭乱伦表演| 美女91av| 91蜜臀熟女| 综合激情二| 国产自啪精品视频网站黑丝| 色五月婷婷五月天| 100啪啪视频大全| 91熟女.com| 夜夜操天| www.91理论| 色五月av| 高清肉丝中文无码| 天天综合精品| 少妇一区二区三区高速| 99AV| 操操操操网黑人| 欧美很很操视频| PMv在线观看| 亚洲欧美内射| 中文字幕少妇色 | 人人 操人人 操人人| 性生活性生大爱77AV国产| 日韩久久超碰色| 99久久精品国产高潮| 国产激情视频一区区三区| 欧美国产操逼| 美腿色图| 色香蕉影院| 亚洲一区二区久久久久| 91人人| 国产精品久久久久久9999| 国产青一二三| 静品嫩模一区二区| 色天使亚洲综合在线观看| 精…码一二三区| 亚洲国产精品久久久久婷婷老年| 欧美AB在线观看| 日韩av乱伦| 精品欧美А∨无码黑人大荫蒂| 在线中文字幕视频| 老鸭窝日丰县女人| 国模不卡一本二本三电影| 91狠| 成人片在线播放| 欧美综合娱乐久久| 激情熟女12P| 校园春色五月天| 乱人乱色一区二区三区免费| 动漫av中文| 久久av色| 亚洲一二三精品久久网| 五月天婷婷激情| 男人的天堂一区三区| 国产Aα| 无码高清少妇久久| 久久久97| 91丝袜美女视频| 青青草色AV| 五十路熟女,国产欧美精品区一区二区三区| 97久久精品国产| 亚洲免费精品一区| 奸色色 男人天堂 天天射| 99热这里只有精品8| 日本欧美国内在线| av婷婷色婷婷色六月| 午夜影美女日鸡鸡天天视频国产| heyZO天然素人无码AⅤ专区| 一级黄色性爱裸体视频| 97碰| 日本孕妇一区二区视频操逼免费看 | 三级色影综合网| 欧美色蜜桃97| 日韩内| 久久精品无码一区二区三区| 竹菊一区二区三区AV线| 精品久久久一本一道| 香蕉国产97| 99re99在线视频| 亚洲丝袜二区在线| 亚洲色婷婷综合久久久久中文| 国产精品伦理| 精品国产99999| 干妹子| 性性久久| 久湿久久| 91精品操美女| 日韩大香蕉AV影片| 色与欲影视| 大香蕉伊人网| 亚洲**2021在线观看| 91啦人妻| 国产日韩精品人妻久久久久色欲网站| 99亚洲精品| 强奸乱伦AV网站| 日韩在线观看字幕精品| 国产精品久久久三级无码| 久久xxxx| 青青操97| 98精品国产乱码久久久久久| 2019亚洲男人天堂| 无套后入双马尾| 黄片www视频免费| AV一区观看| 欧美日韩国内不卡| 亚洲精品色| 人人污日韩一区二区| 亚洲大胆人体av| 亚州高清AV| 日本精品一区二区三区四区的功能| 日韩日本欧美在线观看| 国产专区第一页| 超碰在线国产| 香蕉一区二区三区在线视频| 久久亚码| 男人的天堂va在线| 高潮毛片无遮挡高清免费| 国产呦精品一区二区三区下载| 长长久久免费视频| 伊人久久大香线综合无码| 91热色| 无码精品久久久久久亚洲| 秋霞久久亚洲精品成人| 欧美在线视频99| 97超碰免费人人性爱| 嗯嗯啊啊啊好爽| 国产成人 综合亚洲 天堂| 国产成人精品日本亚洲语言| 久九九九九九九热| 91激情国产| 岛国黄片网站| 国产无马av| 啊啊啊啊操死我了| 不卡在线观看视频| 97人人操人人摸人人爱| 亚洲 图片 综合91| 欧美日韩97在线| 国产午夜精品理论片一二三区区| 亚州AV无码国产精品| 自拍二页| 色噜噜狠狠色综无码久久合欧美| 国内精品嫩模A∨私拍小视频| 丝袜美腿制服人妻二区中文字幕| 国产少妇与亚洲av| 在线色资源| 久艾草在线精品视频在线观看| 激情综合网五月婷婷| 男女激情中文字幕| 日韩无限资源| www.色婷婷色综合| 性爱AV天堂| 欧美人体性爱互联网第一页婷婷日本| 国产精品香蕉热久久新品| 一区二区首页| 我要色综合网| 久久九九综合| 少妇内射视频| 欧美人人曰人人操人人射射| 欧美日不卡| 日日躁天天躁狠狠躁| 久久综合国产精品国产| 老女人日韩美91| 99999亚洲| 大香蕉丝袜一级片| 成人开心网在线视频| 狠狠中文字幕| 久久久久ab| 思思热在线视频免费| 极品色社| 欧美色图亚洲色| 色九九综合| 青草伊人网| 国产吞精a级片激情电影| 精品九九淫乱男| 乱伦一区二区三区‘| 最新亚洲风情电影| 91被操| 亚洲丝袜天堂| www.99视频| 欧美 亚洲 综合 制服 另类| 国产一级特黄大片处女| 97 视频在线| 影音先锋每日最新资源在线观看| 四虎影视在线| 人人搞人人插人人操| 色呦呦、国产精品| 久久婷婷电影网| 蜜桃久久久久久| 视频国产欧美在线播放| 色 婷97| 人妻一区二区三区视频| 青青草手机在线免费观看| 操逼视频国产无套| a人欧美综合天堂麻豆| 国产一级特黄大片处女| 黑人精品久久97| 亚洲成人福利电影免费| 国产欧洲精品亚洲午夜拍精品| 久久高清欧美国产| 啊啊在线| 95精品在线| 亚洲国产成人精品999| 久久久久久久久久黄色网| 亚洲精品国产专区在线观看| 久久亚洲色图中文字幕| 久久精视频美日韩在线视频| 日韩欧美麻豆 | 午夜精品五区| 国产黑白丝在线| 首页亚洲国产高跟丝袜诱惑视频| 欧美懂色综合网| 在线综合 亚洲 欧美中文字幕 | 久久久久久久强迫| 亚洲中文电影| 777奇米影视777四色| 97资源亚洲| 性色高清在线| 中文字幕123| 999精品乱码| 久久av网| 免费a在线播放v| 97综合久久| 九九九九九九九九九九精品视频| 国产精品亚洲一区二区三区四区| 狠狠爱夜夜| 麻豆福利视频导航| 天天操天天舔| 亚洲?V高清一区二区三区尤物| 九九九九九用不成了| 亚洲一区日韩| 欧美性爱精品七区| 亚洲第一男人天堂| 久久9精品视频| 色综合久久88色综合久久天天| 久草新在线| 人妻黑丝袜电影| 97香焦色区| 在线中文字幕极品av| 在线97视频| 98福利在线视频| 91在线美女| 日本日皮视频逼| 欧美色www亚洲国产阿娇要播| 97超碰中文字幕| 怡红院怡春院| 伊人色综合网电影| 高清在线不卡一区二区 视频| 亚洲色图8| 天天看高清麻豆| 校园春色制服丝袜中文字亚洲| 久久国产热视频97电影| 久久夜夜| 国产97av| 久久宗合亚洲| 日韩欧美成人大香蕉| 色婷婷电影网| 欧美另类精品xxxx| 无遮挡又黄又刺激的视频| 日本免费二区三区| 北条麻妃性愛视频| 好淫网一二三视区| av中文在线| 国产美女mm131爽爽爽爽| 日韩av性爱在线播放| 人妻精品一区二区三区| 久久久国产精品亚洲精品| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 激情小说图片亚洲首页| 啊啊啊好大好深| 久九9精品| 91网站视频在线观看| 视频在线观看一二三区| 国产毛片精品一区二区色欲黄A片| 377p欧洲日本亚洲大胆| 欧美人与动性人交a| 好吊色青靑草| 日韩天天综合| 日韩青久久| 操逼短片| 国产妇女精品视频青青草| 婷婷五月天久久精品视频一区二区三区| 色五月综合网| 欧美综合区| 精品久久久久av影院| 在线岛| www.yeyecao| 啪啪啪精品| 亚洲国产成人精品999| 翔田千里A片一区二区| 91亚洲网| 97干在线| 久久永久无码人妻视频| 日韩精品人妻| 蜜臀久久99精品久久久电影| 国产精品视屏| 啊啊啊好多水| 老熟妇乱轮| 91视频精品| 亚洲黄片免费在线播放| 国产高清视频无码在线| 粉嫩av平台| www.亚洲黄色| 家庭乱伦国产| 国产成人亚洲精品无码古代早漏男| 中文字幕精品一区欧美| 丰满人妻一区二区三区四区| 色在线亚洲视频www| 日韩国产乱子伦App| 爱av免费| 丁香六月激情综合| 欧美综合站| 18精品一区| 久久熟妇五十路一区| 男人 天堂 日 亚洲| 9精品久久| 女上位精品在线| 午夜啊啊| 高清国产精品福利网站| 久久日韩精品一区二区| 成人麻豆av电影网站| 国产女人操逼视频| 99色色网| 97精品国产97久久久久久免费| 午夜性| 美熟女逼导航AV操逼| 亚洲国产97在线精品一区| 亚洲女人91| 日韩免费av片高清无码| 国产日韩欧美亚洲精品95| 成人国产精品三级A片| 精品国产乱码久久久久久久久1| 人妻精品4K4K4K4K4| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲中文字幕一区| 猛猛干| 少妇99成人麻豆| 精品人妻一区春色| 欧美性色欧美| AV麻豆免费一区| 色一色综合网| 91麻豆va国产精品| 91岛国动作片| 老司机深夜18禁污污网站| xxx0国产在线播放| 婷婷丁香五月综合| 欧美老妇女内射网址| 淫纸中9区| 熟妇xxxxx性春色| www超碰| 欧美婷婷久久| 加勒比aⅴ| 亚洲国产婷婷在线播放|