精品欧美一区二区三区在线观看 _久久久久国色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)

日韩成人伦理电影在线观看| 日韩av黄色在线| 亚洲视频精选在线| 国产亚洲精品自在久久| aaaaaa毛片| 久久综合99| 亚洲第一页在线| 另类小说第一页| 欧美伦理免费在线| 国产欧美一区二区三区在线老狼| 91久久在线播放| 精品国产一区二区三区四| 99久久影视| 日韩精品视频免费专区在线播放| 亚洲涩涩在线观看| xxxxx性欧美特大| 亚洲美女视频一区| 婷婷精品国产一区二区三区日韩| 日本黄色一区二区三区| 国产一区激情在线| 国产精品入口尤物| 欧美bbbbbbbbbbbb精品| 欧美激情 亚洲a∨综合| 在线观看精品国产视频| 欧美做受喷浆在线观看| 亚洲欧洲国产精品一区| 欧美老女人在线| 国产一区亚洲二区三区| 爱啪啪综合导航| 亚洲人成在线观看一区二区| 日韩欧美视频一区二区三区四区| 日日躁夜夜躁白天躁晚上躁91| 久久99精品一区二区三区三区| 日本视频久久久| 日韩在线视频免费播放| 激情自拍一区| 色综合老司机第九色激情| 国产成人av免费在线观看| 欧美色婷婷久久99精品红桃| 亚洲欧美综合精品久久成人| 特级西西人体4444xxxx| 精品少妇一区| 亚洲电影av在线| 中文字幕99页| 97人人澡人人爽91综合色| 欧美一级黄色录像| 日韩av福利在线观看| 一区在线不卡| 欧美一区国产二区| 亚洲色图偷拍视频| 精品国产第一国产综合精品| 91.com视频| 黑人性生活视频| 精品一级视频| 欧美刺激脚交jootjob| 久久久男人的天堂| 国产精品午夜av| 日韩成人久久久| 亚洲熟妇无码av| 色棕色天天综合网| 亚洲精品电影网站| 欧产日产国产精品98| 欧美黑人巨大videos精品| 亚洲精品大尺度| 永久免费成人代码| 999国产精品永久免费视频app| 色婷婷av一区二区三区久久| 黄色录像一级片| 中文字幕一区二区三区乱码图片| 欧美精品日韩www.p站| 国产一级二级毛片| 日韩一级精品| 国产精品视频成人| 国产麻豆免费视频| av一区二区三区| 日韩高清av电影| 永久免费在线观看视频| 中国av一区二区三区| 最近免费观看高清韩国日本大全| 免费影视亚洲| 欧美丝袜第一区| 久久人人爽av| 97久久亚洲| 在线成人一区二区| 精品无码久久久久| 热久久国产精品| 91成人伦理在线电影| 日韩资源在线| 18成人在线观看| 高清在线观看免费| 亚洲色图综合| 日韩精品久久久久| 日本 欧美 国产| 亚洲高清成人| 国产日韩欧美夫妻视频在线观看 | 欧美一区二区三区白人 | 国产精品欧美久久久久无广告| 女同性恋一区二区| 日韩欧美一区二区三区在线观看| 日韩欧美二区三区| 神马久久久久久久久久久| 欧美不卡高清| 国产精品你懂得| 香蕉视频国产在线| 亚洲靠逼com| 精品久久久久久久无码 | 亚洲国产精彩中文乱码av在线播放| 免费在线观看污| 亚洲视频高清| 成人深夜直播免费观看| 日韩精品视频无播放器在线看 | 不卡一区中文字幕| 亚洲一区bb| 3d性欧美动漫精品xxxx软件| 精品国产91乱码一区二区三区| 欧美性受xxxx黑人| 亚洲永久网站| 国产乱码精品一区二区三区不卡| 美女羞羞视频在线观看| 一本久久综合亚洲鲁鲁五月天 | 午夜国产在线观看| 樱桃视频在线观看一区| 一区二区在线免费看| 一区二区三区视频免费观看| 久久久亚洲福利精品午夜| 国产精品久久久久毛片| 国产欧美一区二区三区沐欲| 免费看一级大黄情大片| 成人性生交大片免费看中文视频 | 337p日本欧洲亚洲大胆精品| 手机在线免费看毛片| 久久精品国产秦先生| 午夜视频久久久| 日韩中文视频| 亚洲人成五月天| 国产成人免费看| av综合在线播放| 超碰成人免费在线| 成人av地址| 九色91av视频| 亚洲AV午夜精品| 亚洲女人小视频在线观看| 日韩在线一区视频| 无码一区二区三区视频| 国产日韩中文在线| 快射视频在线观看| 欧美福利一区二区| 国产精品老熟女一区二区| 精品中文av资源站在线观看| 杨幂一区欧美专区| 一级欧美视频| 欧美日韩国产第一页| 高h放荡受浪受bl| 亚洲成a人片在线不卡一二三区| 秋霞午夜鲁丝一区二区| 精品成人久久| 久久久99国产精品免费| 日韩精品99| 中文字幕在线看视频国产欧美| 一本一道人人妻人人妻αv| 中文字幕一区av| 交换做爰国语对白| 好看的亚洲午夜视频在线| 国产欧美日韩在线播放| 欧美片第一页| 色噜噜亚洲精品中文字幕| 国产乱子伦精品无码码专区| 亚洲精品国产无套在线观| 伊人网综合视频| 久久高清免费观看| 亚洲欧洲精品一区二区| 欧美日本三级| 538国产精品视频一区二区| 免费在线超碰| 91精品国产综合久久蜜臀| 国产一级片免费| 国产亚洲欧美日韩日本| www.日本久久| 亚洲美女网站| 亚欧洲精品在线视频免费观看| 91丨精品丨国产| 久久久久久97| 第一页在线观看| 日韩欧美亚洲另类制服综合在线| 欧美三级午夜理伦| 国产精品私房写真福利视频| 国产调教打屁股xxxx网站| 模特精品在线| 影音先锋成人资源网站| 日韩大尺度在线观看| 青青久久av北条麻妃黑人| shkd中文字幕久久在线观看| 日韩视频一区二区| 天天干天天干天天操| 亚洲图片激情小说| 日本xxx在线播放| 国产一区二区免费在线| 69堂免费视频| 欧美激情第二页| 水蜜桃一区二区| 精品视频高潮| 999热视频| 成人国产激情在线| 97视频在线观看视频免费视频 | 手机看片福利永久国产日韩| 国产主播性色av福利精品一区| 国产免费一区视频观看免费| 涩涩视频在线播放| 欧美第一黄色网| 日韩三级影院| 亚洲人成五月天| 日日躁夜夜躁白天躁晚上躁91| 欧美一区二区二区| 亚洲专区第一页| 色猫猫国产区一区二在线视频| 精品小视频在线观看| 综合自拍亚洲综合图不卡区| 一级黄色录像毛片| 久久久久99精品国产片| 无码一区二区精品| 成人免费视频播放| 91香蕉视频在线观看视频| 日韩成人一级大片| 日本三级免费网站| 一本久道久久久| 成人精品视频在线播放| 亚洲天天综合| 在线观看一区二区三区三州| 精品国产一区二区三区久久久樱花| 国产精品一区二区免费看| 中文字幕一区二区三区四区久久 | 国产精品久久久久久久久久免费| 岛国在线视频网站| 久久久久久亚洲精品| 欧美人与牲禽动交com| 欧美成人精品一区| av大大超碰在线| 成年无码av片在线| 成人免费看片| 九九九久久久久久| 秋霞在线午夜| 欧美精品久久久久久久久| 深夜国产在线播放| 欧美丰满少妇xxxxx做受| 人人超在线公开视频| 色综合天天狠天天透天天伊人| 日本动漫同人动漫在线观看| 欧美激情视频免费观看| 免费av不卡在线观看| 欧美丰满少妇xxxxx做受| 国产精品69xx| 性欧美长视频免费观看不卡| 7777kkk亚洲综合欧美网站| 91精品国产91久久久久久吃药| 不卡av免费观看| 97视频在线免费观看| 原纱央莉成人av片| 国产精品久久久久久久久免费 | 欧美三级日本三级| 亚洲免费伊人电影| 福利一区二区三区四区| 精品国产乱码久久久久久婷婷 | 日韩一区二区在线观看视频| 国产夫绿帽单男3p精品视频| 精品成人私密视频| 五月婷婷开心中文字幕| 亚洲欧洲黄色网| 午夜老司机在线观看| 久久亚洲一区二区三区四区五区高| 中文av资源在线| 午夜伦理精品一区| 99精品在免费线偷拍| 亚洲最大成人网色| 欧美人妖视频| 亚洲精品一区二区三| 国产精品xvideos88| 日韩欧美视频网站| 久久国产精品72免费观看| 苍井空张开腿实干12次| 26uuu亚洲综合色| 精品国产大片大片大片| 午夜视频一区二区| 中文字幕日本人妻久久久免费 | 欧美精品亚洲二区| 成人久久久精品国产乱码一区二区 | 人九九综合九九宗合| 国产精品99精品一区二区三区∴| 97netav| 九九久久婷婷| 女女百合国产免费网站| 久久精品一区| 无人码人妻一区二区三区免费| 91丨九色丨国产丨porny| 天天爽天天爽天天爽| 疯狂欧美牲乱大交777| 国产喷水吹潮视频www| 亚洲色图17p| 国产羞羞视频在线播放| 国产精品视频网| 日韩精品社区| a级黄色片免费| 日韩精品国产精品| 欧类av怡春院| 亚洲码国产岛国毛片在线| 国产情侣小视频| 亚洲精品白浆高清久久久久久| 成人影院www在线观看| 国产精品69久久| 欧美电影完整版在线观看| 9191国产视频| 久久精品国产精品青草| v8888av| 亚洲va天堂va国产va久| 国产麻豆免费视频| 伊人久久男人天堂| 在线天堂新版最新版在线8| 国产伦精品一区二区三区四区免费 | 好男人在线视频www| 精品国产一区二区三区久久久| 日韩精品专区| 欧美激情第一页在线观看| 国产精品日韩精品欧美精品| 中文字幕在线国产| 亚洲自拍欧美精品| 国产av精国产传媒| 久久久91精品| 99精品美女视频在线观看热舞 | 巨大荫蒂视频欧美大片| 国产精品入口免费视频一| 少妇精品久久久| 激情五月亚洲色图| 26uuu另类欧美| 天天操天天摸天天干| 亚洲国产精品久久| 波多野一区二区| 韩国精品一区二区三区六区色诱| 1024精品一区二区三区| 国产艳妇疯狂做爰视频| 夜夜爽夜夜爽精品视频| 国产黄色片av| 久久久久国产精品一区| 99热这里只有精品首页| 精品久久久久久无码中文野结衣| 国产成人啪午夜精品网站男同| 青青草原国产视频| 欧美xxxx在线观看| a级片免费在线观看| 国语精品免费视频| 欧美一级视频| 亚洲v国产v欧美v久久久久久| 在线日韩国产精品| 992tv免费直播在线观看| 国产中文欧美精品| 中文一区一区三区免费在线观看| 日本r级电影在线观看| 亚洲高清免费观看高清完整版在线观看| 亚洲乱色熟女一区二区三区| 高清欧美性猛交| 亚洲国产国产| 免费一区二区三区在线观看 | 日韩精品在线免费视频| 亚洲精品视频中文字幕| 97久久香蕉国产线看观看| 亚洲欧美国产不卡| 国产成人午夜视频| 毛片视频网站在线观看| 中文字幕欧美专区| 免费一级欧美在线大片| 99视频在线免费播放| 国产日本一区二区| 国产精品嫩草影院桃色| 国内伊人久久久久久网站视频 | 蜜臀99久久精品久久久久小说| 在线观看欧美日韩| 一区二区亚洲视频| 国产精品无码一本二本三本色| 国产精品成人在线观看| 秋霞网一区二区| 国产精品福利在线| 午夜欧美精品| 爱爱的免费视频| 666欧美在线视频| 看黄在线观看| 正在播放一区二区三区| 成人免费看黄yyy456| 日本中文字幕在线观看视频| 欧美精品在线观看| 中文字幕亚洲影视| 51自拍视频在线观看| 色婷婷av一区二区三区大白胸| 国产激情视频在线| 欧美一区二区在线视频观看| 国产精品综合av一区二区国产馆| 天天操天天操天天操天天| 久久精品美女视频网站| 欧美精品第一区| 国产免费无码一区二区| 欧美人与禽zozo性伦| 伊人久久视频| 美女黄色免费看|