精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis 到底能不能保證原子性?

數(shù)據(jù)庫(kù) Redis
Redis是 Java程序員工作中經(jīng)常使用的一個(gè) NoSQL,很多人把它對(duì)標(biāo)成數(shù)據(jù)庫(kù),因此,原子性成了特別關(guān)注的問(wèn)題。那么,Redis到底能不能保證原子性?這篇文章來(lái)聊一聊。

Redis是 Java程序員工作中經(jīng)常使用的一個(gè) NoSQL,很多人把它對(duì)標(biāo)成數(shù)據(jù)庫(kù),因此,原子性成了特別關(guān)注的問(wèn)題。那么,Redis到底能不能保證原子性?這篇文章來(lái)聊一聊。

一、原子性

要想弄清楚這個(gè)問(wèn)題,我們需要對(duì)“原子性”這個(gè)概念有一個(gè)清晰的認(rèn)識(shí),因此,首先要分析的是原子性的概念。

1. 通常意義的原子性

通常意義上,我們說(shuō)的原子性是指關(guān)系型數(shù)據(jù)庫(kù) RDBMS(比如 MySQL)的原子性,也就是 ACID(Atomicity、Consistency、Isolation、Durability)中 Atomicity這一項(xiàng)特性。

ACID 中的原子性指:事務(wù)中的所有操作要么全部執(zhí)行,要么全部不執(zhí)行。

這里以銀行轉(zhuǎn)賬,賬戶A 給賬戶B 轉(zhuǎn)賬100元為例來(lái)解釋原子性:

  • 賬戶A 減去100元;
  • 賬戶B 增加100元;

原子性是指上面兩個(gè)過(guò)程,要么全部執(zhí)行,要么全部不執(zhí)行。也就是說(shuō),賬戶A 減去 100元的同時(shí),賬戶B 必須增加100元,否則,該操作就不具備原子性。Java代碼簡(jiǎn)要實(shí)現(xiàn)如下圖:

2. Lua 原子性

在分析 Lua的原子性之前,我們先看看 Lua是什么,下圖摘自 Lua官方描述:

從官方描述可以得知:Lua 是一種功能強(qiáng)大、高效、輕量級(jí)、可嵌入的腳本語(yǔ)言。它支持過(guò)程編程、面向?qū)ο缶幊?、函?shù)式編程、數(shù)據(jù)驅(qū)動(dòng)編程和數(shù)據(jù)描述。 Lua 將簡(jiǎn)單的過(guò)程語(yǔ)法與基于關(guān)聯(lián)數(shù)組和可擴(kuò)展語(yǔ)義的強(qiáng)大數(shù)據(jù)描述結(jié)構(gòu)相結(jié)合。Lua 是動(dòng)態(tài)類型的,通過(guò)使用基于寄存器的虛擬機(jī)解釋字節(jié)碼來(lái)運(yùn)行,并具有自動(dòng)內(nèi)存管理和增量垃圾回收功能,使其成為配置、腳本編寫和快速原型設(shè)計(jì)的理想選擇。

Lua 本身并沒(méi)有提供對(duì)于原子性的直接支持,它只是一種腳本語(yǔ)言,通常是嵌入到其他宿主程序中運(yùn)行,比如 Redis。

在 Redis中執(zhí)行 Lua的原子性是指:整個(gè) Lua腳本在執(zhí)行期間,會(huì)被當(dāng)作一個(gè)整體,不會(huì)被其他客戶端的命令打斷。

為了對(duì) Redis執(zhí)行 Lua的原子性有一個(gè)感官上的認(rèn)識(shí),這里以 Lua腳本中需要完成 SET key1 value1 和 INCRBY key2 value2 和 SET key3 value3 三個(gè)命令為例:

上述例子,整個(gè) luaScript 字符串腳本作為一個(gè)整體被執(zhí)行且不被其他事務(wù)打斷,這就是一個(gè)原子性的操作。

好了,總結(jié)下 ACID的原子性和 Redis執(zhí)行 Lua腳本原子性在概念上的差異:

  • ACID的原子性是指:事務(wù)中的命令要么全執(zhí)行,要么全部不執(zhí)行;
  • Redis中執(zhí)行 Lua腳本原子性是指:Lua腳本會(huì)作為一個(gè)整體執(zhí)行且不被其他客戶端打斷,至于 Lua腳本里面的命令是否必須全部成功,或者全部失敗,并不要求。關(guān)于這一點(diǎn),在接下來(lái)的內(nèi)容也會(huì)詳細(xì)解釋;

在分析原子性概念時(shí),我們可以發(fā)現(xiàn)“原子性”其實(shí)是事務(wù)中的一項(xiàng)特性,因此,接下來(lái)分析 Redis的事務(wù)。

二、Redis 事務(wù)

下圖是 Redis官方對(duì)事務(wù)描述的摘要:

文檔看起來(lái)很長(zhǎng),總結(jié)成一句話:Redis 事務(wù)允許執(zhí)行一批命令,通過(guò)執(zhí)行 MULTI命令開啟事務(wù),執(zhí)行 EXEC命令結(jié)束事務(wù),WATCH 和 DISCARD 配合事務(wù)一起使用,提供了一種 CAS(check-and-set) 樂(lè)觀鎖的機(jī)制。WATCH 用于監(jiān)聽 Key,如果被監(jiān)聽的 Key有任何一個(gè)發(fā)生變化,則中止事務(wù)(被動(dòng)關(guān)閉事務(wù)),而 DISCARD 用于主動(dòng)中止事務(wù)。

1. MULTI/EXEC

用一個(gè)示例來(lái)理解 MULTI/EXEC:

通過(guò)執(zhí)行的結(jié)果可以看出:Redis的事務(wù)是以 MULTI命令開啟,以 EXEC命令結(jié)束,期間所有的命令都是先進(jìn)入隊(duì)列,只有執(zhí)行 EXEC命令時(shí),才會(huì)把隊(duì)列中的所有命令順序串行執(zhí)行,并且返回一個(gè)所有命令執(zhí)行結(jié)果的數(shù)組,包括命令執(zhí)行的錯(cuò)誤信息。

需要注意的是:在 EXEC 執(zhí)行后,即使事務(wù)隊(duì)列中有命令執(zhí)行失敗,隊(duì)列中的所有其他命令也會(huì)被處理,Redis 不會(huì)停止執(zhí)行這些命令。

DISCARD 和 WATCH 也是 Redis 中用于事務(wù)的兩個(gè)命令,它們與 MULTI 和 EXEC 一起使用,提供更復(fù)雜的事務(wù)處理機(jī)制。

2. WATCH

WATCH 命令用于監(jiān)聽一個(gè)或多個(gè) Key,如果在執(zhí)行事務(wù)期間這些 Key中任何一個(gè)Key的 value被其他事務(wù)修改,當(dāng)前整個(gè)事務(wù)將會(huì)被中止。(需要注意:低于 6.0.9 的 Redis 版本,Key過(guò)期不會(huì)中止事務(wù))

如下示例:事務(wù)1 watch key1 key2,事務(wù)2在事務(wù)1執(zhí)行期間修改 key2 = 10,當(dāng)事務(wù)1執(zhí)行 exec命令時(shí),因?yàn)?watch監(jiān)聽到 key2被其他事務(wù)(事務(wù)2)修改了(value=10) , 因此事務(wù)1被取消,事務(wù)隊(duì)列中的所有命令被清除,即 set key1 value1 和 incrby key 2兩條命令都不執(zhí)行,key2的 value還是10;

事務(wù)1

事務(wù)2

watch key1 key2


multi


set key1 value1


incrby key2 2

set key2 10

exec


keys * // 只有key2=10

keys * // 只有key2=10DISCARD

DISCARD 命令用于中止事務(wù)。

如下示例,執(zhí)行 DISCARD命令后,當(dāng)前事務(wù)被中止,因此,執(zhí)行 EXEC 時(shí)會(huì)報(bào)“ERR EXEC without MULTI”錯(cuò)誤。

3. 事務(wù)中的錯(cuò)誤

事務(wù)中主要會(huì)出現(xiàn)兩種類型的錯(cuò)誤:

(1) 事務(wù)命令進(jìn)入事務(wù)隊(duì)列之前出錯(cuò)。例如,命令語(yǔ)法錯(cuò)誤(參數(shù)錯(cuò)誤、命令名稱錯(cuò)誤等),或者可能存在一些關(guān)鍵情況,比如內(nèi)存不足。如下示例,命令incr key2 1/0 在進(jìn)入事務(wù)隊(duì)列之前報(bào)錯(cuò),所以,當(dāng)前事務(wù)被中止,執(zhí)行 EXEC命令會(huì)報(bào)錯(cuò):

(2) 調(diào)用 EXEC 命令后,事務(wù)隊(duì)列中的命令執(zhí)行失敗。例如,對(duì)字符串值進(jìn)行加1操作。如下示例,key的 value是字符串,當(dāng)對(duì) key 執(zhí)行incr key 操作時(shí)報(bào)錯(cuò),因此,該條命令執(zhí)行失敗:

4. 事務(wù)回滾

Redis的事務(wù)不支持回滾。 官方說(shuō)明如下:

Redis 不支持事務(wù)回滾,因?yàn)橹С只貪L會(huì)對(duì) Redis 的簡(jiǎn)單性和性能產(chǎn)生重大影響。

官方說(shuō)明簡(jiǎn)明扼要,其實(shí),多加思考也能理解:"Redis" 是 "REmote DIctionary Server" 的縮寫,翻譯為“遠(yuǎn)程字典服務(wù)”,設(shè)計(jì)的初衷是用于緩存,追求快速高效。而了解過(guò) ACID事務(wù)的小伙伴應(yīng)該能明白事務(wù)回滾的復(fù)雜度,因此,Redis不支持事務(wù)回滾似乎也合情合理。

到此,我們也對(duì) Redis事務(wù)做個(gè)小結(jié):Redis的事務(wù)由 MULTI/EXEC 兩個(gè)命令完成,WATCH/DISCARD 兩個(gè)命令的加持,給 Redis事務(wù)提供了 CAS 樂(lè)觀鎖機(jī)制。Redis 事務(wù)不支持回滾,它和關(guān)系型數(shù)據(jù)庫(kù)(比如 MySQL)的事務(wù)(ACID)是不一樣的。

三、Redis 如何執(zhí)行 Lua?

分析完原子性和 Redis事務(wù)這些理論知識(shí)后,我們就得動(dòng)手實(shí)操,看看 Redis是如何執(zhí)行 Lua的。

一般情況下,Redis執(zhí)行 Lua常用的方法有 2種:

  • 原生命令,比如 EVAL/EVALSHA命令等;
  • 編程工具,比如編程語(yǔ)言中提供的三方工具包或類庫(kù);

在編寫 Lua腳本時(shí),需要注意區(qū)分 redis.call() 和 redis.pcall() 兩個(gè)命令的使用。

1. EVAL

語(yǔ)法:

EVAL script numkeys [key [key ...]] [arg [arg ...]]

EVAL語(yǔ)法很簡(jiǎn)單,EVAL script numkeys 是必填項(xiàng),[key [key ...]] [arg [arg ...]]是選填項(xiàng)。

如下示例截圖,分別展示了不傳Key,傳 1個(gè)key 和 2個(gè) key 3種場(chǎng)景:

下圖示例展示了 [key [key ...]] [arg [arg ...]] 和 numkeys 匹配錯(cuò)誤時(shí)報(bào)錯(cuò)的場(chǎng)景:

2. redis.call()

redis.call() 用于執(zhí)行 Redis的命令。當(dāng)命令執(zhí)行出錯(cuò)時(shí),會(huì)阻斷整個(gè)腳本執(zhí)行,并將錯(cuò)誤信息返回給客戶端。

如下示例:當(dāng)執(zhí)行INCRBY key2 1/0 失敗時(shí),會(huì)拋異常,后續(xù)流程被阻斷,即SET key3 value3沒(méi)有被執(zhí)行。

Redis原生命令執(zhí)行示例如下:

EVAL "redis.call('SET', 'key1', 'value1'); redis.call('INCRBY', 'key2', 1/0); redis.call('SET', 'key3', 'value3')" 0

使用 Jedis框架執(zhí)行 Lua示例如下:

查看 Lua執(zhí)行后各個(gè)key的值。

3. redis.pcall()

redis.pcall() 也用于執(zhí)行 Redis的命令。當(dāng)命令執(zhí)行出錯(cuò)時(shí),不會(huì)阻斷腳本的執(zhí)行,而是內(nèi)部捕獲錯(cuò)誤,并繼續(xù)執(zhí)行后續(xù)的命令。

如下示例:當(dāng)執(zhí)行INCRBY key2 1/0 失敗時(shí),不會(huì)拋異常,后續(xù)流程繼續(xù)執(zhí)行,即SET key3 value3 也被執(zhí)行。

Redis原生命令執(zhí)行示例:

EVAL "redis.pcall('SET', 'key1', 'value1'); redis.pcall('INCRBY', 'key2', 1/0); redis.pcall('SET', 'key3', 'value3')" 0

使用 Jedis框架執(zhí)行 Lua示例:

對(duì)于 Lua中 redis.call() 和 redis.pcall() 如何選擇,需要根據(jù)實(shí)際業(yè)務(wù)來(lái)判斷,標(biāo)準(zhǔn)是:當(dāng) Lua腳本中某條命令執(zhí)行出錯(cuò)時(shí),是否需要阻斷后續(xù)的命令執(zhí)行。

四、如何保證原子性?

首先,可以肯定的是:Redis執(zhí)行 Lua腳本可以保證原子性,不過(guò)這和 Redis Server的部署方式密不可分。

Redis是典型的 C/S(Client/Server) 模型,如下圖:

因此,Redis 通常有 3種不同的部署方式,部署方式不同,原子性的保證也不一樣。

1. 單機(jī)部署

不管 Lua腳本中操作的 key是不是同一個(gè),都能保證原子性;

2. 主從部署

Redis 主從復(fù)制是用于將主節(jié)點(diǎn)的數(shù)據(jù)同步到從節(jié)點(diǎn),以保持?jǐn)?shù)據(jù)的一致性。而Redis的所有寫操作都在主節(jié)點(diǎn)上,所以,不管 Lua腳本中操作的 key是不是同一個(gè),都能保證原子性;

需要注意:當(dāng)主節(jié)點(diǎn)執(zhí)行寫命令時(shí),從節(jié)點(diǎn)會(huì)異步地復(fù)制這些寫操作。在這個(gè)復(fù)制的過(guò)程中,從節(jié)點(diǎn)的數(shù)據(jù)可能與主節(jié)點(diǎn)存在一定的延遲。因此,如果在 Lua 腳本中包含讀操作,并且該腳本在主節(jié)點(diǎn)上執(zhí)行,可能會(huì)讀到最新的數(shù)據(jù),但如果在從節(jié)點(diǎn)上執(zhí)行,可能會(huì)讀到稍有延遲的數(shù)據(jù)。

3. Cluster集群部署

如果 Lua腳本操作的 key是同一個(gè),能保證原子性;

如果操作的 Key不相同,可能被 hash 到不同的 slot,也可能 hash 到相同的 slot,所以不一定能保證原子性;

因此,在 Cluster集群部署的環(huán)境下使用 Lua腳本時(shí)一定要注意:Lua腳本中操作的是同一個(gè) Key;

4. 原子性保證

這里以 Redis單機(jī)部署為例:當(dāng)客戶端向服務(wù)器發(fā)送一個(gè)帶有 Lua腳本的請(qǐng)求時(shí),Redis會(huì)把該腳本當(dāng)作一個(gè)整體,然后加載到一個(gè)腳本緩存中,因?yàn)?Redis讀寫命令是單線程操作(關(guān)于 Redis的單線程模型和多路復(fù)用線程模型會(huì)在其他的文章中講解),最終,Lua腳本的讀寫在 Redis服務(wù)器上可以簡(jiǎn)單地抽象成下圖,所有的 Lua腳本會(huì)按照進(jìn)入順序放入隊(duì)列中,然后串行進(jìn)行讀寫,這樣就保證每個(gè) Lua不會(huì)被其他的客戶端打斷,從而保證了原子性:

五、面試該如何回答?

在面試中,Redis 執(zhí)行 Lua腳本時(shí),能否保證原子性?這個(gè)問(wèn)題如何作答?

  • 第一步,需要解釋這里的原子性是什么?它和關(guān)系數(shù)據(jù)事務(wù) ACID中的一致性的差異是什么?消除原子性在具體載體(RDBMS/NoSQL)上概念的差異;
  • 第二步,需要解釋 Redis的事務(wù),說(shuō)明 RDBMS/NoSQL 在事務(wù)上的差異點(diǎn);
  • 第三步,需要解釋 Redis在不同部署方式下原子性能否保證。Redis部署方式有3種:?jiǎn)螜C(jī)部署,主從部署,Cluster集群部署,需要說(shuō)明在哪些部署方式下能保證原子性,哪些不能保證原子性;
  • 第四步,解釋 Redis 執(zhí)行 Lua腳本是如何保證原子性;
  • 第五步,分析下 Redis的單線程模型 和 IO多路復(fù)用模型(加分項(xiàng)),這步是可選項(xiàng);

六、Why Lua?

既然 Redis事務(wù)能保證原子性,為什么還需要 Lua腳本呢?

  • Lua 是一種嵌入式語(yǔ)言,是 Redis官方推薦的腳本語(yǔ)言;
  • Lua 腳本一般比 MULTI/EXEC 更快、更簡(jiǎn)單;
  • Redis 事務(wù)中,事務(wù)隊(duì)列中的所有命令都必須在 EXEC命令執(zhí)行才會(huì)被執(zhí)行,對(duì)于多個(gè)命令之間存在依賴關(guān)系,比如后面的命令需要依賴上一個(gè)命令結(jié)果的場(chǎng)景,Redis事務(wù)無(wú)法滿足,因此 Lua 腳本更適合復(fù)雜的場(chǎng)景;
  • Redis 事務(wù)能做的 Lua能做,Redis事務(wù)做不到的 Lua也能做;

七、Lua注意事項(xiàng)

Redis執(zhí)行 Lua腳本時(shí),Lua的編寫需要注意以下幾個(gè)點(diǎn):

  • 不要在 Lua腳本中使用阻塞命令(如BLPOP、BRPOP等)。因此這些命令可能會(huì)導(dǎo)致 Redis服務(wù)器在執(zhí)行腳本期間被阻塞,無(wú)法處理其他請(qǐng)求;
  • 不要編寫過(guò)長(zhǎng)的 Lua腳本。因?yàn)?Redis讀寫命令是單線程,過(guò)長(zhǎng)的腳本,加載,解析,運(yùn)行會(huì)比較耗時(shí),導(dǎo)致其他命令的延遲延遲增加;
  • 不要在 Lua腳本中進(jìn)行復(fù)雜耗時(shí)的邏輯;因?yàn)?Redis讀寫命令是單線程的,長(zhǎng)時(shí)間運(yùn)行腳本可能導(dǎo)致其他命令的延遲增加;
  • Lua腳本中,需要注意區(qū)分 redis.call() 和 redis.pcall() 命令;
  • Lua 索引表從索引 1 開始,而不是 0;

八、總結(jié)

  • 原子性需要區(qū)分具體使用的載體,在關(guān)系型數(shù)據(jù)庫(kù)(比如 MySQL))和 No SQL(比如Redis)中,原子性的概念是不相同的;
  • Redis的事務(wù)(MULTI/ESXEC)和關(guān)系型數(shù)據(jù)庫(kù)(比如 MySQL)的事務(wù)(ACID)也是不相同的;
  • ACID的原子性指:命令要么全部執(zhí)行,要么全部不執(zhí)行;
  • Redis執(zhí)行 Lua腳本的原子性指:Lua腳本會(huì)當(dāng)作一個(gè)整體被執(zhí)行且不被其他事務(wù)打斷,但是 Lua 腳本里面的命令無(wú)法保證“要么全部執(zhí)行,要么全部不執(zhí)行”;
  • Lua腳本使用 redis.pcall() 執(zhí)行命令出錯(cuò)時(shí)會(huì)被catch,后續(xù)命令會(huì)正常執(zhí)行;
  • Lua腳本使用 redis.call() 執(zhí)行命令出錯(cuò)時(shí)會(huì)拋給客戶端,后續(xù)命令會(huì)被阻斷;
  • Lua 腳本一般比 MULTI/EXEC 更快、更簡(jiǎn)單;
  • Redis的部署方式?jīng)Q定了 Redis執(zhí)行 Lua腳本是否能保證原子性,編寫 Lua腳本時(shí),特別需要注意在一個(gè)事務(wù)中是否要求操作同一個(gè) key。
責(zé)任編輯:趙寧寧 來(lái)源: 猿java
相關(guān)推薦

2013-04-19 10:42:02

打車軟件大數(shù)據(jù)

2024-04-26 09:37:43

國(guó)產(chǎn)數(shù)據(jù)庫(kù)開發(fā)者

2021-06-15 11:33:48

監(jiān)控微信聊天前端

2018-03-05 07:38:11

2012-03-05 10:36:30

云計(jì)算節(jié)能減排數(shù)據(jù)中心

2009-07-16 22:39:11

2018-12-10 09:14:56

AI教育教育資源留守兒童

2019-01-24 09:53:49

2019-11-21 09:25:23

AI 數(shù)據(jù)人工智能

2021-05-11 15:50:52

比特幣加密貨幣貨幣

2019-02-27 09:28:15

Redis服務(wù)器事務(wù)

2016-05-19 17:10:27

銀行

2021-02-26 21:25:08

比特幣投資貨幣

2022-10-20 08:00:37

機(jī)器人ZadigChatOps

2020-10-16 18:33:18

Rust語(yǔ)言前端開發(fā)

2023-04-06 06:55:24

ChatGPTGPT算力

2012-06-13 11:01:59

英特爾

2022-04-24 11:52:04

元宇宙Web3去中心化

2023-12-27 08:03:53

Go優(yōu)化代碼

2020-12-21 15:09:23

人工智能安全人臉識(shí)別
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久免费视频播放| ass极品水嫩小美女ass| 91大神在线网站| 久久99久久99精品免视看婷婷 | 欧美日韩国产综合草草| 强开小嫩苞一区二区三区网站| 欧美特黄一级视频| 久久机这里只有精品| 欧美高跟鞋交xxxxxhd| 蜜桃av乱码一区二区三区| 日本高清久久| 色综合网色综合| 久久综合亚洲精品| www在线播放| av不卡在线播放| 91精品视频免费| 4438国产精品一区二区| 欧美成人69av| 在线亚洲欧美视频| 丰满少妇一区二区三区| crdy在线观看欧美| 欧美自拍丝袜亚洲| 国产伦精品一区二区三区四区视频_ | 国产一区中文字幕| 青青青国产精品一区二区| 人妻人人澡人人添人人爽| 综合色就爱涩涩涩综合婷婷| 91麻豆精品国产自产在线| 国产一级不卡毛片| 性欧美18xxxhd| 亚洲一区影音先锋| 超碰成人在线免费观看| 国产一级网站视频在线| www.色精品| 97碰碰视频| 91成人一区二区三区| 久久精品动漫| 欧洲一区二区视频| 日本一区二区欧美| 狠狠88综合久久久久综合网| 久久精品欧美视频| 成熟人妻av无码专区| 久久不见久久见国语| 亚洲国产精品人人爽夜夜爽| 成年人看片网站| 日本精品在线观看| 日韩一卡二卡三卡四卡| 在线观看日本www| 粉嫩av国产一区二区三区| 欧美日韩成人综合天天影院| 天堂社区在线视频| 欧美日韩不卡| 欧美图片一区二区三区| 久久久国产欧美| 激情小说亚洲| 欧美日韩国产一级二级| 国产精品区在线| 欧美一级做a| 欧美精品一卡二卡| 性欧美在线视频| 嫩呦国产一区二区三区av| 91精品久久久久久蜜臀| 欧美xxxxxbbbbb| 视频精品一区| 亚洲第一二三四五区| 国产白袜脚足j棉袜在线观看 | 久久精品国产一区二区| 国产精品一区久久久| 一本到在线视频| 国产一区二区不卡老阿姨| 99久久伊人精品影院| 黄色一级a毛片| 91免费国产视频网站| 欧美久久电影| 尤物视频在线免费观看| 亚洲天堂免费看| 成人小视频在线观看免费| 成人免费网站观看| 在线观看视频91| 99九九精品视频| aiai久久| 亚洲天堂免费观看| 国产色无码精品视频国产| 欧美日本一区二区视频在线观看| 国模精品系列视频| 久久久999久久久| 国产精品99久久久久久宅男| 国产欧美日韩一区| 风间由美一区| 专区另类欧美日韩| 精品视频免费在线播放| 成人免费毛片嘿嘿连载视频…| 欧美美女一区二区在线观看| 亚洲欧美综合视频| 禁果av一区二区三区| 久久亚洲精品成人| 国产一区二区99| 日本不卡在线视频| 国产精品久久久一区二区三区| 国产最新视频在线观看| 亚洲欧美日韩国产成人精品影院| 国产黄页在线观看| 日韩一级特黄| 亚洲激情视频网站| 一级片一级片一级片| 99国产精品99久久久久久粉嫩| 国产精品99导航| 欧美自拍偷拍第一页| 国产精品毛片大码女人| 免费无遮挡无码永久视频| 久久久久久久性潮| 日韩成人在线观看| 免费在线观看一级片| 久久综合激情| 国产主播一区二区三区四区| 里番在线观看网站| 色婷婷亚洲一区二区三区| 在线观看一区二区三区四区| 日韩精品欧美| 欧美一区在线直播| 色wwwwww| 亚洲一区二区三区精品在线| 五月婷婷六月丁香激情| 伊人久久大香线蕉综合网蜜芽| 欧美第一淫aaasss性| 亚洲中文一区二区三区| 久久影视一区二区| 人妻无码久久一区二区三区免费| 国产精品毛片无码| 精品国产一区二区三区在线观看 | 欧美高清你懂的| 亚洲毛茸茸少妇高潮呻吟| 国产污视频在线观看| 国内精品国产成人| 一级日韩一区在线观看| 韩国成人在线| 国产亚洲a∨片在线观看| 国产精品久久久久久久久久久久久久久久久 | 不卡日本视频| 国产97在线观看| 欧美黄色小说| 欧美日韩中文在线观看| 久久久久麻豆v国产精华液好用吗| 午夜精品网站| 91久久夜色精品国产网站| jizz在线观看| 欧美中文一区二区三区| 一级片视频免费看| 久久亚洲不卡| 视频一区视频二区视频三区视频四区国产 | 日本乱人伦一区| 中文字幕在线看高清电影| 亚洲一区图片| 欧美日韩精品一区| 蜜桃视频成人m3u8| 在线播放日韩专区| 在线观看免费黄色小视频| 国产精品情趣视频| 中文字幕一区久久| 欧美日本中文| 国产精品伊人日日| 中文字幕在线直播| 亚洲网站在线观看| 中文字字幕在线观看| 中文字幕一区二区三区四区不卡| 欧美在线a视频| 亚洲成人资源| 日本亚洲自拍| 亚洲伦理久久| 欧美黑人巨大xxx极品| 天天干,夜夜爽| 91成人免费网站| 国产美女高潮视频| 国产99久久久国产精品免费看| 欧美亚洲黄色片| 九九热精品视频在线观看| 国产一区二区在线免费| 色屁屁www国产馆在线观看| 亚洲国产高清高潮精品美女| 欧美黑人一区二区| 国产精品毛片大码女人| 久久无码专区国产精品s| 亚洲伊人观看| 亚洲制服中文| 美女一区二区在线观看| 国产精品福利久久久| 99在线视频观看| 亚洲嫩模很污视频| 国产手机视频在线| 精品久久久香蕉免费精品视频| 黄色三级生活片| 国产寡妇亲子伦一区二区| 欧美老熟妇喷水| 午夜av一区| 久久国产精品亚洲va麻豆| 日韩第二十一页| 91干在线观看| av官网在线播放| 国产亚洲精品日韩| 亚洲女人18毛片水真多| 欧美亚洲一区二区在线观看| 国产一级久久久| 国产精品丝袜91| av鲁丝一区鲁丝二区鲁丝三区| 美女视频黄免费的久久| 毛片在线播放视频| 天天精品视频| 日韩欧美精品一区二区| 国产精品白浆| 91免费看片网站| av在线一区不卡| 午夜精品理论片| 天堂8中文在线| 日韩在线国产精品| 国产三级在线看| 亚洲激情成人网| 国产极品久久久| 欧美日韩黄色影视| 无码人妻丰满熟妇精品| 激情亚洲一区二区三区四区| 国语对白在线播放| 国产精品久久久久久久午夜片| 亚洲乱码国产乱码精品精大量| 国产成人免费视| 污污视频在线免费| 久久电影国产免费久久电影| 日韩亚洲在线视频| 亚洲女人av| 欧美二区在线视频| 一区二区自拍| 妺妺窝人体色www看人体| 天天射—综合中文网| 亚洲激情一区二区三区| 欧洲乱码伦视频免费| 欧美人xxxxx| 亚洲区小说区| 欧美日韩喷水| 久草在线成人| 欧美欧美一区二区| 精品久久久中文字幕| 欧美高清视频一区二区三区在线观看| 成人福利免费在线观看| 国产精品国产精品| 国产伦乱精品| 国产欧美一区二区视频| 国产福利一区二区精品秒拍| 国产成人精品自拍| 欧美日韩午夜电影网| 亚洲最大的网站| aaa国产精品视频| 国产伦精品一区二区三区高清版| 一区二区三区高清在线观看| 99国产高清| 麻豆视频一区| 日韩精品一区二区三区色偷偷| 国产亚洲欧美日韩在线观看一区二区| 欧美日韩精品不卡| 日韩大片在线播放| 男同互操gay射视频在线看| 综合视频在线| 国产在线播放观看| 久久婷婷丁香| 777视频在线| 狠狠色丁香婷综合久久| 国产一级二级av| 国产成人精品亚洲午夜麻豆| 91九色蝌蚪porny| 91理论电影在线观看| 91麻豆制片厂| 一区二区三区加勒比av| 日韩三级免费看| 一本色道a无线码一区v| 一级片视频免费| 欧美va亚洲va香蕉在线| 亚洲av毛片成人精品| 国产一区二区三区在线播放免费观看| 在线免费看av| 欧美激情在线有限公司| 欧美人体一区二区三区| 国产精品网站视频| 一区二区三区在线免费看| 蜜桃视频在线观看成人| 三上亚洲一区二区| 日韩一级性生活片| 久热国产精品| 超级砰砰砰97免费观看最新一期| 99久久精品国产观看| 欧美激情视频二区| 亚洲在线观看免费| 探花国产精品一区二区| 欧美xxxxx牲另类人与| 精品视频一二三| 欧美美女18p| 色豆豆成人网| 国产经品一区二区| 精品欧美激情在线观看| 精品国偷自产一区二区三区| 视频一区二区中文字幕| 91精产国品一二三| 国产性做久久久久久| 久久丫精品久久丫| 欧美三级日韩在线| 色吊丝在线永久观看最新版本| 日韩中文字幕在线播放| 色戒汤唯在线| 不卡视频一区二区| 日韩一区二区三区免费播放| 欧美一级在线看| 国产精品99久| 免费看日本黄色片| 午夜av一区二区| 国产视频在线免费观看| 中文国产成人精品| 自拍网站在线观看| 成人av资源| 一区二区电影| 午夜激情av在线| 久久久久国产一区二区三区四区| 免费在线视频观看| 在线成人小视频| av资源网在线观看| 国产97在线亚洲| 欧美天堂影院| av免费观看大全| 福利电影一区二区| 黄色一级免费视频| 欧美一级片在线看| 米奇777四色精品人人爽| 国产精品6699| 国产成人高清| 黑人糟蹋人妻hd中文字幕| 99久久婷婷国产精品综合| 久久丫精品久久丫| 精品久久国产97色综合| av免费在线网站| 亚洲一区二区免费在线| 1024精品久久久久久久久| 免费看污污网站| 中文字幕欧美日韩一区| 乱子伦一区二区三区| 国产一区二区动漫| 欧美自拍电影| 色一情一乱一伦一区二区三欧美 | 激情欧美国产欧美| 日本wwwxx| 亚洲一区av在线| 高潮一区二区三区乱码| 久久久久国产一区二区三区| 亚洲三级av| 久久精品国产sm调教网站演员| 粉嫩av一区二区三区| 国产污视频在线看| 国产视频久久网| 女生影院久久| 亚洲国产精品一区二区第四页av| 欧美96一区二区免费视频| 毛片久久久久久| 4438x成人网最大色成网站| 怡红院在线观看| 久久99精品久久久久子伦| 久久精品观看| 青青青视频在线免费观看| 7777精品伊人久久久大香线蕉超级流畅| 欧美a免费在线| 高清国产在线一区| 国产精品亚洲综合色区韩国| 欧美激情aaa| 欧美久久久久中文字幕| 免费看电影在线| 久久青青草原| 看国产成人h片视频| 欧美亚洲日本在线| 日韩成人在线视频观看| 成人黄色免费短视频| 在线视频亚洲自拍| 懂色av中文一区二区三区| 成人在线免费看视频| 色多多国产成人永久免费网站| 国产美女视频一区二区| 久久久一本二本三本| 日本一区二区三区在线观看| 国产av无码专区亚洲av麻豆| 57pao成人永久免费视频| 久久中文亚洲字幕| 成人区人妻精品一区二| 欧洲一区二区三区免费视频| av片在线观看永久免费| 欧美午夜精品久久久久久蜜| 紧缚奴在线一区二区三区| 国产网址在线观看| 色偷偷av一区二区三区乱| 精品一区二区男人吃奶| 玖玖爱视频在线| 午夜久久久影院| 日本美女高清在线观看免费| 国内精品国语自产拍在线观看| 久久国产福利国产秒拍| 日韩成人高清视频| 久久艳片www.17c.com| 一区二区三区日本久久久|