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

Redis Stream 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)原理真的很強(qiáng)

數(shù)據(jù)庫 Redis
Stream 是 Redis 5.0 版本專門為消息隊(duì)列設(shè)計(jì)的數(shù)據(jù)類型,借鑒了 Kafka 的 Consume Group 設(shè)計(jì)思路,提供了消費(fèi)組概念。同時(shí)提供了消息的持久化和主從復(fù)制機(jī)制,客戶端可以訪問任何時(shí)刻的數(shù)據(jù),并且能記住每一個(gè)客戶端的訪問位置,從而保證消息不丟失。

你好,我是碼哥,一個(gè)擁抱硬核技術(shù)和對(duì)象,面向人民幣編程的男人,設(shè)置星標(biāo)不迷路。

我在【Redis 使用 List 實(shí)現(xiàn)消息隊(duì)列的利與弊】說過使用 List 實(shí)現(xiàn)消息隊(duì)列有很多局限性。

  • 沒有 ACK 機(jī)制。
  • 沒有類似 Kafka 的 ConsumerGroup 消費(fèi)組概念。
  • 消息堆積。
  • List 是線性結(jié)構(gòu),查詢指定數(shù)據(jù)需要遍歷整個(gè)列表。

1、是什么

Stream 是 Redis 5.0 版本專門為消息隊(duì)列設(shè)計(jì)的數(shù)據(jù)類型,借鑒了 Kafka 的 Consume Group 設(shè)計(jì)思路,提供了消費(fèi)組概念。

同時(shí)提供了消息的持久化和主從復(fù)制機(jī)制,客戶端可以訪問任何時(shí)刻的數(shù)據(jù),并且能記住每一個(gè)客戶端的訪問位置,從而保證消息不丟失。

以下幾個(gè)是 Stream 類型的主要特性。

  • 使用 Radix Tree 和 listpack 結(jié)構(gòu)來存儲(chǔ)消息。
  • 消息 ID 序列化生成。
  • 借鑒 Kafka Consume Group 的概念,多個(gè)消費(fèi)者劃分到不同的 Consume Group 中,消費(fèi)同一個(gè) Streams,同一個(gè) Consume Group 的多個(gè)消費(fèi)者可以一起并行但不重復(fù)消費(fèi),提升消費(fèi)能力。
  • 支持多播(多對(duì)多),阻塞和非阻塞讀取。
  • ACK 確認(rèn)機(jī)制,保證了消息至少被消費(fèi)一次。
  • 可設(shè)置消息保存上限閾值,我會(huì)把歷史消息丟棄,防止內(nèi)存占用過大。

需要注意的是,Redis Stream 是一種超輕量級(jí)的 MQ,并沒有完全實(shí)現(xiàn)消息隊(duì)列的所有設(shè)計(jì)要點(diǎn),所以它的使用場(chǎng)景需要考慮業(yè)務(wù)的數(shù)據(jù)量和對(duì)性能、可靠性的需求。

適合系統(tǒng)消息量不大,容忍數(shù)據(jù)丟失,使用 Redis Stream 作為消息隊(duì)列就能享受高性能快速讀寫消息的優(yōu)勢(shì)

2、修煉心法

每個(gè) Stream 都有一個(gè)唯一的名稱,作為 Stream 在 Redis 的 key,在首次使用 xadd 指令添加消息的時(shí)候會(huì)自動(dòng)創(chuàng)建。

可以看到 Stream 在一個(gè) Redix Tree 樹上,樹上存儲(chǔ)的是消息 ID,每個(gè)消息 ID 對(duì)應(yīng)的消息通過一個(gè)指針指向 listpack。

Stream 流就像是一個(gè)僅追加內(nèi)容的消息鏈表,把消息一個(gè)個(gè)串起來,每個(gè)消息都有一個(gè)唯一的 ID 和消息內(nèi)容,消息內(nèi)容則由多個(gè) field/value 鍵值對(duì)組成。底層使用 Radix Tree 和 listpack 數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。

為了便于理解,我畫了一張圖,并對(duì) Radix Tree 的存儲(chǔ)數(shù)據(jù)做了下變形,使用列表來體現(xiàn) Stream 中消息的邏輯有序性。

這張圖涉及很多概念,但是你不要慌。我一步步拆開說,最后你再回頭看就懂了。

先帶你屢下全局思路。

  • Consumer Group:消費(fèi)組,每個(gè)消費(fèi)組可以有一個(gè)或者多個(gè)消費(fèi)者,消費(fèi)者之間是競(jìng)爭關(guān)系。不同消費(fèi)組的消費(fèi)者之間無任何關(guān)系。
  • *pel,全稱是 Pending Entries List,記錄了當(dāng)前被客戶端讀取但是還沒有 ack(Acknowledge character 確認(rèn)字符)的消息。如果客戶端沒有 ack,這個(gè)變量的消息 ID 會(huì)越來越多。這是一個(gè)核心數(shù)據(jù)結(jié)構(gòu),用來確保客戶端至少消費(fèi)消息一次。

Stream 結(jié)構(gòu)

Streams 結(jié)構(gòu)的源碼定義在 stream.h 源碼中的 stream 結(jié)構(gòu)體中。

typedef struct stream {
    rax *rax;
    uint64_t length;
    streamID last_id;
    streamID first_id;
    streamID max_deleted_entry_id;
    uint64_t entries_added;
    rax *cgroups;
} stream;

typedef struct streamID {
    uint64_t ms;
    uint64_t seq;
} streamID;
  • *rax,是一個(gè) rax 的指針,指向一個(gè) Radix Tree,key 存儲(chǔ)消息 ID,value 實(shí)際上指向一個(gè) listpack 數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)了多條消息,每條消息的 ID 都大于等于 這個(gè) key 的消息 ID。
  • length,該 Stream 的消息條數(shù)。
  • streamID結(jié)構(gòu)體,消息 ID 抽象,一共占 128 位,內(nèi)部維護(hù)了毫秒時(shí)間戳(字段 ms);一個(gè)毫秒內(nèi)的自增序號(hào)(字段 seq),用于區(qū)分同一毫秒內(nèi)插入多條消息。
  • last_id,當(dāng)前 Stream 最后一條消息的 ID。
  • first_id,當(dāng)前 Stream 第一條消息的 ID。
  • max_deleted_entry_id,當(dāng)前 Stream 被刪除的最大的消息 ID。
  • entries_added,總共有多少條消息添加到 Stream 中,entries_added = 已刪除消息條數(shù) + 未刪除消息條數(shù)。
  • *cgroups,rax 指針,也指向一個(gè) Radix Tree ,記錄當(dāng)前 Stream 的所有 Consume Group,每個(gè) Consume Group 的名稱都是唯一標(biāo)識(shí),作為 Radix Tree 的 key,Consumer Group 實(shí)例作為 value。

Consumer Group

Consumer Group 由 streamCG 結(jié)構(gòu)體定義,每個(gè) Stream 可以有多個(gè) Consumer Group,一個(gè)消費(fèi)組可以有多個(gè)消費(fèi)者同時(shí)對(duì)組內(nèi)消息進(jìn)行消費(fèi)。

/* Consumer group. */
typedef struct streamCG {
    streamID last_id;
    long long entries_read;
    rax *pel;
    rax *consumers;
} streamCG;
  • last_id,表示該消費(fèi)組的消費(fèi)者已經(jīng)讀取但還未 ACK 的最后一條消息 ID。
  • *pel,是 pending entries list 簡寫,指向一個(gè) Radix Tree 的指針,保存著 Consumer group 中所有消費(fèi)者讀取但還未 ACK 確認(rèn)的消息,就是這玩意實(shí)現(xiàn)了 ACK 機(jī)制。該樹的 key 是消息 ID,value 關(guān)聯(lián)一個(gè) streamNACK 實(shí)例。
  • *consumers, Radix Tree 指針,表示消費(fèi)組中的所有消費(fèi)者,key 是消費(fèi)者名稱,value 指向一個(gè) streamConsumer 實(shí)例。

streamNACK

streamCG -> *pel 對(duì)應(yīng)的 value 是一個(gè) streamNACK 實(shí)例,用于抽象消費(fèi)者已經(jīng)讀取,但是未 ACK 的消息 ID 相關(guān)信息。

/* Pending (yet not acknowledged) message in a consumer group. */
typedef struct streamNACK {
    mstime_t delivery_time;
    uint64_t delivery_count;
    streamConsumer *consumer;
} streamNACK;
  • delivery_time,該消息最后一次推送給 Consumer 的時(shí)間戳。
  • delivery_count,消息被推送次數(shù)。
  • *consumer,消息推送的 Consumer 客戶端。

streamConsumer

Consumer Group 中對(duì) Consumer 的抽象。

/* A specific consumer in a consumer group.  */
typedef struct streamConsumer {
    mstime_t seen_time;
    sds name;
    rax *pel;
} streamConsumer;
  • seen_time,消費(fèi)者最近一次被激活的時(shí)間戳。
  • name,消費(fèi)者名稱。
  • *pel, Radix Tree 指針,對(duì)于同一個(gè)消息而言,``streamCG -> pel與streamConsumer -> pel的streamNACK` 實(shí)例是同一個(gè)。

最后來一張圖,便于你理解。

肖材積:“Redis 你好,Stream 如何結(jié)合 Radix Tree 和 listpack 結(jié)構(gòu)來存儲(chǔ)消息?為什么不使用散列表來存儲(chǔ),消息 ID 作為散列表的 key,散列表的 value 存儲(chǔ)消息鍵值對(duì)內(nèi)容。’”

在回答之前,先插入幾條消息到 Stream,讓你對(duì) Stream 消息的存儲(chǔ)格式有個(gè)大體認(rèn)知。

該命令的語法如下。

XADD key id field value [field value ...]

Stream 中的每個(gè)消息可以包含不同數(shù)量的多個(gè)鍵值對(duì),寫入消息成功后,我會(huì)把消息的 ID 返回給客戶端。

執(zhí)行如下指令把用戶購買書籍的下單消息存放到 hotlist:books隊(duì)列,消息內(nèi)容主要由 payerID、amount 和 orderID。

> XADD hotlist:books * payerID 1 amount 69.00 orderID 9
1679218539571-0
> XADD hotlist:books * payerID 1 amount 36.00 orderID 15
1679218572182-0
> XADD hotlist:books * payerID 2 amount 99.00 orderID 88
1679218588426-0
> XADD hotlist:books * payerID 3 amount 68.00 orderID 80
1679218604492-0

hotlist:books 是 Stream 的名稱,后面的 “*” 表示讓 Redis 為插入的消息自動(dòng)生成一個(gè)唯一 ID,你也可以自定義。

消息 ID 由兩部分組成。

  • 當(dāng)前毫秒內(nèi)的時(shí)間戳。
  • 順序編號(hào)。從 0 為起始值,用于區(qū)分同一時(shí)間內(nèi)產(chǎn)生的多個(gè)命令。

肖材積:“如何理解 Stream 是一種只執(zhí)行追加操作(append only)的數(shù)據(jù)結(jié)構(gòu)?”

通過將元素 ID 與時(shí)間進(jìn)行關(guān)聯(lián),并強(qiáng)制要求新元素的 ID 必須大于舊元素的 ID, Redis 從邏輯上將 Stream 變成了一種只執(zhí)行追加操作(append only)的數(shù)據(jù)結(jié)構(gòu)。

用戶可以確信,新的消息和事件只會(huì)出現(xiàn)在已有消息和事件之后,就像現(xiàn)實(shí)世界里新事件總是發(fā)生在已有事件之后一樣,一切都是有序進(jìn)行的。

?

肖材積:“插入的消息 ID 大部分相同,比如這四條消息的 ID 都是 1679218 前綴。另外,每條消息鍵值對(duì)的鍵通常都是一樣的,比如這四條消息的鍵都是 payerID、amount 和 orderID。使用散列表存儲(chǔ)的話會(huì)很多冗余數(shù)據(jù),你這么摳門,所以不使用散列表對(duì)不對(duì)?”

沒毛病,小老弟很聰明。為了節(jié)省內(nèi)存,我使用了 Radix Tree 和 listpack。Radix Tree 的 key 存儲(chǔ)消息 ID,value 使用 listpack 數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)多個(gè)消息, listapck 中的消息 ID 都大于等于 key 存儲(chǔ)的消息 ID。

我在前面已經(jīng)講過 listpack,這是一個(gè)緊湊型列表,非常節(jié)省內(nèi)存。而 Radix Tree 數(shù)據(jù)結(jié)構(gòu)的最大特點(diǎn)是適合保存具有相同前綴的數(shù)據(jù),從而達(dá)到節(jié)省內(nèi)存。

到底 Radix Tree 是怎樣的數(shù)據(jù)結(jié)構(gòu),繼續(xù)往下看。

Radix Tree

Radix Tree,也被稱為 Radix Trie,或者 Compact Prefix Tree),用于高效地存儲(chǔ)和查找字符串集合。它將字符串按照前綴拆分成一個(gè)個(gè)字符,并將每個(gè)字符作為一個(gè)節(jié)點(diǎn)存儲(chǔ)在樹中。

當(dāng)插入一個(gè)鍵值對(duì)時(shí),Redis 會(huì)將鍵按照字符拆分成一個(gè)個(gè)字符,并根據(jù)字符在 Radix tree 中的位置找到合適的節(jié)點(diǎn),如果該節(jié)點(diǎn)不存在,則創(chuàng)建新節(jié)點(diǎn)并添加到 Radix tree 中。

當(dāng)所有字符都添加完畢后,將值對(duì)象指針保存到最后一個(gè)節(jié)點(diǎn)中。當(dāng)查詢一個(gè)鍵時(shí),Redis 按照字符順序遍歷 Radix tree,如果發(fā)現(xiàn)某個(gè)字符不存在于樹中,則鍵不存在;否則,如果最后一個(gè)節(jié)點(diǎn)表示一個(gè)完整的鍵,則返回對(duì)應(yīng)的值對(duì)象。

如下圖展示一個(gè)簡單的前綴樹,將根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑對(duì)應(yīng)字符拼接起來,就得到了兩個(gè) key(“他說碉堡了”、“他說碉炸了”)。

你應(yīng)該發(fā)現(xiàn)了,這兩個(gè) key 擁有公共前綴(他說碉),前綴樹實(shí)現(xiàn)了共享使用,這樣就可以避免相同字符串重復(fù)存儲(chǔ)。如果采用散列表的保存方式,那個(gè) key 的相同前綴就會(huì)被多次存儲(chǔ),導(dǎo)致內(nèi)存浪費(fèi)。

Radix Tree 改進(jìn)

每個(gè)節(jié)點(diǎn)只保存一個(gè)字符,一是會(huì)浪費(fèi)內(nèi)存空間,二是在進(jìn)行查詢時(shí),還需要逐一匹配每個(gè)節(jié)點(diǎn)表示的字符,對(duì)查詢性能也會(huì)造成影響。

所以,Redis 并沒有直接使用標(biāo)準(zhǔn)前綴樹,而是做了一次變種——Compact Prefix Tree(壓縮前綴樹)。通俗來說,當(dāng)多個(gè) key 具有相同的前綴時(shí),那就將相同前綴的字符串合并在一個(gè)共享節(jié)點(diǎn)中,從而減少存儲(chǔ)空間。

如下幾個(gè) key(test、toaster、toasting、slow、slowly)在 Radix Tree 上的布局。

由于 Compact Prefix Tree 可以共享相同前綴的節(jié)點(diǎn),所以在存儲(chǔ)一組具有相同前綴的鍵時(shí),Redis 的 Radix tree 比其他數(shù)據(jù)結(jié)構(gòu)(如哈希表)具有更低的空間消耗和更快的查詢速度。

Radix Tree 節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)由 rax.h文件中的 raxNode 定義。

typedef struct raxNode {
    uint32_t iskey:1;
    uint32_t isnull:1;
    uint32_t iscompr:1;
    uint32_t size:29;
    unsigned char data[];
} raxNode;
  • iskey:從 Radix Tree 根節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)組成的字符串是否是一個(gè)完整的 key。是的話 iskey 的值為 1。
  • isnull:當(dāng)前節(jié)點(diǎn)是否為空節(jié)點(diǎn),如果當(dāng)前節(jié)點(diǎn)是空節(jié)點(diǎn)的話,就不需要為該節(jié)點(diǎn)分配指向 value 的指針內(nèi)存。
  • iscompr,是否為壓縮節(jié)點(diǎn)。
  • size,當(dāng)前節(jié)點(diǎn)的大小,具體指會(huì)根據(jù)節(jié)點(diǎn)類型而改變。如果是壓縮節(jié)點(diǎn),該值表示壓縮數(shù)據(jù)的長度;如果是非壓縮節(jié)點(diǎn),該值表示節(jié)點(diǎn)的子節(jié)點(diǎn)個(gè)數(shù)。
  • data[],實(shí)際存儲(chǔ)的數(shù)據(jù),根據(jù)節(jié)點(diǎn)類型不同而有所不同。
  • 壓縮節(jié)點(diǎn),data 數(shù)據(jù)包括子節(jié)點(diǎn)對(duì)應(yīng)的字符、指向子節(jié)點(diǎn)的指針,節(jié)點(diǎn)為最終 key 對(duì)應(yīng)的 value 指針。
  • 壓縮節(jié)點(diǎn),data 數(shù)據(jù)包含子節(jié)點(diǎn)對(duì)應(yīng)的合并字符串、指向子節(jié)點(diǎn)的指針,以及節(jié)點(diǎn)為最終 key 的 value 指針。
  • value 指針指向一個(gè) listpack 實(shí)例,里面保存了消息實(shí)際內(nèi)容。

Radix Tree 最大的特點(diǎn)就是適合保存具有相同前綴的數(shù)據(jù),實(shí)現(xiàn)節(jié)省內(nèi)存的目標(biāo),以及支持范圍查找。而這個(gè)就是 Stream 采用 Radix Tree 作為底層數(shù)據(jù)結(jié)構(gòu)的原因。

責(zé)任編輯:姜華 來源: 碼哥字節(jié)
相關(guān)推薦

2023-04-11 08:00:56

Redis類型編碼

2012-05-25 10:40:58

Win7操作系統(tǒng)

2025-08-26 04:25:00

千問編圖文字編輯字體

2021-08-29 07:41:48

數(shù)據(jù)HashMap底層

2023-11-12 21:49:10

Redis數(shù)據(jù)庫

2021-08-31 07:36:22

LinkedListAndroid數(shù)據(jù)結(jié)構(gòu)

2017-05-11 11:59:12

MySQL數(shù)據(jù)結(jié)構(gòu)算法原理

2023-03-06 08:40:43

RedisListJava

2020-06-29 07:44:36

Redis

2024-01-26 06:42:05

Redis數(shù)據(jù)結(jié)構(gòu)

2022-05-02 17:43:23

Java編程語言

2019-06-12 22:51:57

Redis軟件開發(fā)

2020-06-09 08:13:15

PHP數(shù)據(jù)結(jié)構(gòu)

2019-11-05 09:20:06

SQLiteLinux

2019-01-08 11:57:10

Redis存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)

2012-05-16 17:05:33

Java數(shù)據(jù)結(jié)構(gòu)

2019-06-21 15:20:05

Redis數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)庫

2020-03-20 10:47:51

Redis數(shù)據(jù)庫字符串

2019-09-02 09:48:39

Redis數(shù)據(jù)結(jié)構(gòu)對(duì)象

2019-04-17 15:35:37

Redis數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)
點(diǎn)贊
收藏

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

国产精品123| 蜜桃精品wwwmitaows| 亚洲欧洲国产专区| wwwxx欧美| 91在线看视频| 成人精品视频| 日韩你懂的在线播放| 妞干网在线视频观看| 成人不用播放器| 国产精品77777竹菊影视小说| 午夜免费在线观看精品视频| 亚洲av成人无码久久精品 | 日本韩国欧美精品大片卡二| 精品视频第一页| 大陆极品少妇内射aaaaa| 国产av精国产传媒| 香蕉视频成人在线观看| 久久亚洲电影天堂| 三上悠亚影音先锋| 国产精品99久久免费观看| 欧美日韩视频第一区| 日韩欧美视频网站| 青青在线视频| 中文字幕字幕中文在线中不卡视频| 国产一区二区三区高清| 国产麻豆一精品一男同| 秋霞电影网一区二区| 久久久噜久噜久久综合| 四虎884aa成人精品| 国产成人一区二区三区影院| 精品国产sm最大网站免费看| 原创真实夫妻啪啪av| 国产成人精品123区免费视频| 亚洲午夜久久久久久久久久久| 亚洲国产精品视频一区| 免费在线黄色影片| 99视频精品免费视频| 成人免费在线一区二区三区| 一级片在线观看视频| 丝袜亚洲精品中文字幕一区| 欧美亚洲国产日本| 日韩污视频在线观看| 狠狠噜噜久久| 欧美高清自拍一区| 日韩欧美中文字幕视频| 一区二区三区毛片免费| 色噜噜久久综合伊人一本| 国精产品一区一区三区免费视频| 综合成人在线| 日韩欧美你懂的| 免费高清视频在线观看| 国产精品久久久久久av公交车| 欧美精品自拍偷拍| 亚洲精品午夜在线观看| 欧美成人免费全部网站| 欧美日韩亚洲国产综合| 久久久久xxxx| 精品中文字幕一区二区三区| 欧美一区午夜精品| 国产一区二区免费电影| 黑人糟蹋人妻hd中文字幕| 黄色在线看片| 亚洲国产精品自拍| 日韩亚洲欧美视频| 国产一二三在线| 欧美视频一二三| 国产亚洲天堂网| 欧美电影免费观看| 欧美日韩中文国产| 亚洲国产午夜精品| 中文字幕一区二区三区四区久久| 精品三级在线观看| av网页在线观看| 亚洲区小说区图片区qvod| 亚洲人精品午夜在线观看| 欧美性受xxxx黑人| 亚洲精品99| 97在线免费视频| 无码人妻丰满熟妇奶水区码| 日本欧美一区二区| 91免费综合在线| 人妻一区二区三区免费| 久久久午夜精品理论片中文字幕| 日本精品二区| 91麻豆免费在线视频| 亚洲国产aⅴ天堂久久| 成人免费观看毛片| 日本精品久久| 亚洲精品久久久一区二区三区 | 国产精品亚洲成人| 91亚洲精品丁香在线观看| 欧美自拍第一页| 久久噜噜亚洲综合| www.-级毛片线天内射视视| 欧美人动性xxxxz0oz| 疯狂蹂躏欧美一区二区精品| 美女网站色免费| 91精品啪在线观看国产手机| 亚洲女在线观看| 三上悠亚作品在线观看| 亚洲精品极品| 国产精品自产拍在线观| 亚洲第一色网站| 国产日韩欧美电影| 国产毛片久久久久久国产毛片| 电影一区二区三区| 欧美一区二区高清| 右手影院亚洲欧美| 欧美+亚洲+精品+三区| 国产97在线|日韩| 超碰在线观看av| 国产精品乱码久久久久久| 丁香婷婷综合激情| 精品美女一区| 日韩精品免费一线在线观看| 三级影片在线看| 久久久999久久久| 一区二区三区中文| 奇米四色中文综合久久| av一区二区三| 国产精品色婷婷久久58| 亚洲 欧美 日韩 国产综合 在线| av日韩在线免费观看| 亚洲人成在线播放| 天天操天天干视频| 国产.精品.日韩.另类.中文.在线.播放 | 日韩高清人体午夜| 美女的奶胸大爽爽大片| 日本视频一区二区| 免费中文日韩| 国产h片在线观看| 日韩欧美国产精品一区| 亚洲精品卡一卡二| 日韩电影在线免费看| 麻豆91蜜桃| av男人的天堂在线观看| 精品国产1区2区3区| 成人观看免费视频| 国产精品99久| 欧美少妇在线观看| 成人免费一区| 尤物九九久久国产精品的特点 | 久久av最新网址| 国产免费高清一区| www欧美xxxx| 精品av久久707| 久久久91视频| 成人午夜免费视频| 福利在线一区二区| 99精品中文字幕在线不卡| 欧美成人午夜激情| 国产黄色一区二区| 夜色激情一区二区| 91精品又粗又猛又爽| 激情成人综合| 狠狠色综合一区二区| 僵尸再翻生在线观看免费国语| 亚洲成av人影院在线观看| 国产一国产二国产三| 精品国产乱码久久久久久1区2匹| 久久综合一区二区| 国产九色porny| 老牛国内精品亚洲成av人片| 97国产精品视频| 欧美伦理影视网| 欧洲av一区二区嗯嗯嗯啊| 调教驯服丰满美艳麻麻在线视频| 全国精品久久少妇| 免费成人进口网站| 岛国精品一区| 欧美亚洲日本网站| 国产区在线视频| 欧美日韩你懂得| 国产精品 欧美激情| 成人丝袜视频网| 久久久久久久久久久久久国产精品 | 尤物网在线观看| 欧美一区二区啪啪| 麻豆亚洲av成人无码久久精品| 懂色av一区二区三区免费观看| 国产成人永久免费视频| 欧美日韩123| 成人黄色片在线| 国产第一页在线视频| 国产偷国产偷亚洲清高网站| 中国精品一区二区| 一区二区三区四区蜜桃| 泷泽萝拉在线播放| 韩国欧美国产一区| 亚洲中文字幕无码av永久| 精品大片一区二区| 91视频免费进入| 中文字幕一区久| 久久婷婷国产麻豆91天堂| 日韩在线观看视频一区二区三区| 91成人免费在线| 欧美激情精品久久| 国产三级精品三级在线专区| 日韩欧美中文视频| 可以免费看不卡的av网站| 无码人妻精品一区二区三区99v| 日韩欧美天堂| 亚洲a中文字幕| 欧美gv在线| 精品国产一区二区三区在线观看| 免费av一级片| 3751色影院一区二区三区| 99精品在线播放| 亚洲精品第1页| 日本乱子伦xxxx| 成人深夜视频在线观看| 手机av在线免费| caoporn免费在线视频| 国产伦精品一区二区三区在线观看| 香港三级韩国三级日本三级| 无需播放器亚洲| 欧美精品一区二区三区在线四季 | 国产98在线|日韩| 国产毛片精品久久| 青草成人免费视频| 俺来俺也去www色在线观看| 日韩中文字幕国产精品| 邻家有女韩剧在线观看国语| 精品久久久久久久久久久久久久久| 中文字幕一区二区在线视频 | 欧美日韩国产精品激情在线播放| 欧美国产91| 永久免费精品视频网站| 狠狠色丁香婷婷综合影院| 九色91在线视频| 国产精品传媒| 鬼打鬼之黄金道士1992林正英| 伊人亚洲精品| 国产精品一区二区久久精品| 日韩大尺度黄色| 啪一啪鲁一鲁2019在线视频| 色是在线视频| 午夜精品在线视频| 国产伦理精品| 69久久夜色精品国产69乱青草| 免费在线看电影| 欧美激情欧美激情在线五月| 影音先锋在线视频| 久久成人亚洲精品| www.久久ai| 欧美老妇交乱视频| 国产一二三区在线观看| 日韩少妇与小伙激情| 天堂地址在线www| 最近2019中文字幕mv免费看| 国产小视频在线| 亚洲社区在线观看| h视频在线免费| 色偷偷av亚洲男人的天堂| 天堂аⅴ在线地址8| 精品国产一区二区三区久久狼黑人 | 东方aⅴ免费观看久久av| 美女流白浆视频| 成人黄色av电影| 2一3sex性hd| 久久女同精品一区二区| 日本乱子伦xxxx| 国产精品伦理一区二区| 一区二区成人免费视频| 亚洲午夜精品在线| 5g国产欧美日韩视频| 成人教育av| 国产精品久久久久高潮| 韩国理伦片久久电影网| 91免费高清视频| 成人性生交大片免费看96| 久久精品aaaaaa毛片| 国产精品亚洲片在线播放| 亚洲精品欧美精品| 亚洲精品一二三区区别| 日本一本中文字幕| 视频一区二区欧美| aaa一级黄色片| 国产精品影视在线| 捆绑凌虐一区二区三区| 亚洲国产成人一区二区三区| 日本 欧美 国产| 亚洲成人综合视频| 久久久精品毛片| 91精品国产欧美一区二区18| 色窝窝无码一区二区三区成人网站 | 精品一区二区三区的国产在线观看| 亚洲国产精品综合| 黄色成人av网站| 国产精品拍拍拍| 国产999精品久久久久久| 四虎影成人精品a片| 国产精品久99| 亚洲一区欧美在线| 欧美高清www午色夜在线视频| 亚洲成人av综合| 国产亚洲精品综合一区91| 青春草视频在线| 国产成人精品一区二区在线| www999久久| 成人激情直播| 日韩在线精品| 欧美一级在线看| 国产精品 欧美精品| 老头老太做爰xxx视频| 亚洲一二三区视频在线观看| 中文字幕人妻精品一区| 亚洲精品久久久久久久久| 毛片在线看片| 26uuu精品一区二区| 亚洲人成无码网站久久99热国产| 免费观看一级特黄欧美大片| 一级特级黄色片| 自拍偷拍亚洲激情| 中文精品久久久久人妻不卡| 亚洲激情国产精品| 性欧美猛交videos| 成人黄色在线观看| 国产乱码精品一区二区三区四区| 亚洲精品蜜桃久久久久久| 国产一区二区不卡在线| 女人黄色一级片| 色综合久久久久久久久| 日批视频免费播放| 欧美寡妇偷汉性猛交| 久久精品免视看国产成人| 亚洲在线欧美| 日韩黄色小视频| 中国美女乱淫免费看视频| 性感美女极品91精品| 国产刺激高潮av| 欧美成人精品激情在线观看| 视频欧美精品| 亚洲精品国产系列| 日韩电影免费在线| 男人舔女人下部高潮全视频| 精品动漫一区二区三区| 欧美自拍第一页| 久久全球大尺度高清视频| 亚洲一二三区视频| 欧美 国产 精品| 国产成人av一区| 久久久精品国产sm调教| 日韩精品中文字幕一区二区三区| 成人在线观看亚洲| 91欧美激情另类亚洲| 欧美在线网址| 折磨小男生性器羞耻的故事| 亚洲一区二区三区影院| 日韩中文字幕免费观看| 国内精品视频在线| 国产乱子伦精品无码码专区| 国产欧美日本一区二区三区| 天天操天天摸天天干| 日韩电视剧在线观看免费网站| 国产社区精品视频| 欧美人与性禽动交精品| 日韩中文字幕区一区有砖一区| 亚洲性猛交xxxx乱大交| 欧美亚州韩日在线看免费版国语版| 超碰免费在线观看| 成人在线国产精品| 国产精品啊啊啊| 最近中文字幕无免费| 色综合久久综合| 91欧美在线视频| 91美女高潮出水| 亚洲精品看片| 少妇人妻好深好紧精品无码| 欧美色偷偷大香| 在线xxxx| 久久伊人一区| 免费xxxx性欧美18vr| 国产高潮流白浆| 亚洲爱爱爱爱爱| 日韩高清在线| 精品国产一区二区三区在线| jizz一区二区| 自拍偷拍精品视频| 久热99视频在线观看| 精品国产乱子伦一区二区| 国产第一页视频| 自拍偷拍亚洲激情| 天天爱天天干天天操| 国产精品中文久久久久久久| 欧美va天堂在线| 最新中文字幕视频| 91麻豆精品国产91久久久 | 91精品国产高清久久久久久久久| 精品美女视频| 国产91在线免费观看| 一本久道久久综合中文字幕| 黄色网页在线免费看| 精品国产一区二区三| 麻豆精品国产传媒mv男同| 日本一级淫片免费放| 日韩在线观看免费网站 | 国产性xxxx高清| 中文字幕在线成人| jlzzjlzzjlzz亚洲人|