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

硬核 | Redis Pub/Sub 發(fā)布訂閱與宅男有什么關(guān)系?

數(shù)據(jù)庫 Redis
Redis 通過 SUBSCRIBE,UNSUBSCRIBE和PUBLISH 實現(xiàn)發(fā)布訂閱消息傳遞模式,Redis 提供了兩種模式實現(xiàn),分別是「發(fā)布/訂閱到頻道」和「發(fā)布\訂閱到模式」。

今天不聊小姐姐,深入了解下 「Redis 發(fā)布/訂閱機制」的原理與實戰(zhàn)運用。

Redis 通過 SUBSCRIBE,UNSUBSCRIBE和PUBLISH 實現(xiàn)發(fā)布訂閱消息傳遞模式,Redis 提供了兩種模式實現(xiàn),分別是「發(fā)布/訂閱到頻道」和「發(fā)布\訂閱到模式」。

Redis 發(fā)布訂閱簡介

Redis 發(fā)布訂閱(Pus/Sub)是一種消息通信模式:發(fā)送者通過 PUBLISH發(fā)布消息,訂閱者通過 SUBSCRIBE 訂閱接收消息或通過UNSUBSCRIBE 取消訂閱。

主要包含三個部分組成:「發(fā)布者」、「訂閱者」、「Channel」。

發(fā)布者和訂閱者屬于客戶端,Channel 是 Redis 服務(wù)端,發(fā)布者將消息發(fā)布到頻道,訂閱這個頻道的訂閱者則收到消息。

如下圖所示,三個「訂閱者」訂閱「ChannelA」頻道:

圖片

訂閱

這時候,小組長往「ChannelA」發(fā)布消息,這個消息的訂閱者就會收到消息「關(guān)注碼哥字節(jié),提升技術(shù)」:

圖片

發(fā)布/訂閱

Pub/Sub 實戰(zhàn)

廢話不多說,知道基本概念以后,學(xué)習(xí)一個技術(shù)第一步先把它跑起來,接著才是探索原理,從而達到「知其然,知其所以然」的境界 。

一共有兩種模式實現(xiàn)「發(fā)布\訂閱」:

  • 使用頻道(Channel)的發(fā)布訂閱;
  • 使用模式(Pattern)的發(fā)布訂閱。

需要注意的是,發(fā)布訂閱機制與 db 空間無關(guān),比如在 db 10 發(fā)布, db0 的訂閱者也會收到消息。

通過頻道(Channel)實現(xiàn)

三步走:

  • 訂閱者訂閱頻道;
  • 發(fā)布者向「頻道」發(fā)布消息;
  • 所有訂閱「頻道」的訂閱者收到消息。

訂閱者訂閱頻道

使用 SUBSCRIBE channel [channel ...]訂閱一個或者多個頻道,O(n) 時間復(fù)雜度,n = 訂閱的 Channel 數(shù)量。

SUBSCRIBE develop
Reading messages... (press Ctrl-C to quit)
1) "subscribe" // 消息類型
2) "develop" // 頻道
3) (integer) 1 // 消息內(nèi)容

執(zhí)行該指令后,客戶端進入訂閱狀態(tài),訂閱者只能使用subscribe、unsubscribe、psubscribe和punsubscribe這四個屬于"發(fā)布/訂閱" 的指令。

客戶端「肖菜雞」訂閱了 「develop」頻道接受組長的消息,消息響應(yīng)體分別表示:

  • 消息類型:subscribe、message、unsubscribe
  • 頻道
  • 消息內(nèi)容:隨著消息類型不同代表不同含義。

進入訂閱后的客戶端可以收到 3 種類型的消息回復(fù):

  • subscribe:訂閱成功的反饋消息,第二個值是訂閱成功的頻道名稱,第三個是當(dāng)前客戶端訂閱的頻道數(shù)量。
  • message:客戶端接收到消息,第二個值表示產(chǎn)生消息的頻道名稱,第三個值是消息的內(nèi)容。
  • unsubscribe:表示成功取消訂閱某個頻道。第二個值是對應(yīng)的頻道名稱,第三個值是當(dāng)前客戶端訂閱的頻道數(shù)量,當(dāng)此值為 0 時客戶端會退出訂閱狀態(tài),之后就可以執(zhí)行其他非"發(fā)布/訂閱"模式的命令了。

發(fā)布者發(fā)布消息

小組長使用 PUBLISH channel message 向指定 「develop」頻道發(fā)布消息。

PUBLISH develop 'do job'
(integer) 1

需要注意的是,發(fā)布的消息并不會持久化,消息發(fā)布之后還有新「開發(fā)」靚仔訂閱的話,只能接收后續(xù)發(fā)布到該頻道的消息。

好一個「不問過往,只爭當(dāng)下」。

訂閱者接收消息

關(guān)注了「develop」頻道的訂閱者將會收到「do job」消息。

// 訂閱 develop 頻道
SUBSCRIBE develop
Reading messages... (press Ctrl-C to quit)
1) "subscribe" // 訂閱頻道成功
2) "develop" // 頻道
3) (integer) 1
// 當(dāng)發(fā)布者發(fā)布消息,訂閱者讀取到的消息如下
1) "message" // 接受到消息
2) "develop" // 頻道名稱
3) "do job" // 消息內(nèi)容

退訂頻道

訂閱的反向操作,「65 哥」天天在朋友圈秀恩愛,受不了了,取消訂閱他的朋友圈。

使用 UNSUBSCRIBE 命令可以退訂指定的「模式」不會影響通過 `subscribe 命令訂閱的頻道。

同樣 unsubscribe命令也不會影響通過psubscribe命令訂閱的規(guī)則。

通過模式(Pattern)實現(xiàn)

接下來看另一種方式實現(xiàn)發(fā)布訂閱,如下圖表示當(dāng)「匹配模式」與這個頻道匹配的話,當(dāng)消息向頻道發(fā)布消息,該消息還會發(fā)布到與這個頻道匹配的「模式」上,訂閱這個模式的客戶端也會收到消息。

smile.girl.* 模式表示「你微笑時好美」pattern,與這個模式匹配的兩個頻道是 smile.girls.Tina、smile.girls.maggi ,分別表示喜歡「微笑的 Tina」 和喜歡「微笑的 maggi」的粉絲。

如下圖:

圖片

模式匹配

現(xiàn)在 Tina 發(fā)布動態(tài)將消息發(fā)送到 smile.girls.Tina頻道的時候,除了訂閱了 smile.girls.Tina 這個頻道的粉絲收到消息以外,這 個消息還會發(fā)送給訂閱 smile.girl.* 模式的粉絲(因為頻道與模式匹配)。

這些粉絲比較貪心,所有「微笑時好美的 girls」都關(guān)注了,LSP~~,碼哥可不是這樣的人。

圖片

模式匹配發(fā)布

使用匹配模式,用 PUBLISH 將消息發(fā)布到訂閱 smile.girls.Tina 客戶端之外,還會將該「頻道」與「pub/sub pattern」中的模式進行對比,如果 Channel 與某個模式匹配的話,也將這個消息發(fā)布到訂閱這個模式的客戶端。

訂閱模式

訂閱模式的指令是PSUBSCRIBE,如下表示 LSP 訂閱「smile.girl.*」模式:

PSUBSCRIBE smile.girls.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe" // 消息類型
2) "smile.girls.*"// 模式
3) (integer) 1 //訂閱數(shù)

對應(yīng)的反向取消模式訂閱的指令是PUNSUBSCRIBE smile.girl.*。

訂閱 「smile.girls.Tina」頻道:

SUBSCRIBE smile.girls.Tina
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "smile.girls.Tina"
3) (integer) 1

訂閱「smile.girls.maggi」頻道:

SUBSCRIBE smile.girls.maggi
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "smile.girls.maggi"
3) (integer) 1

Tina 發(fā)布消息,關(guān)注「smile.girls.Tina」的粉絲和訂閱了與該頻道匹配的「smile.girls.*」模式的粉絲收到消息。

關(guān)注 「smile.girls.*」模式的粉絲收到消息:

PSUBSCRIBE smile.girls.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "smile.girls.*"
3) (integer) 1
//進入訂閱狀態(tài),接收到消息
1) "pmessage" 消息類型
2) "smile.girls.*"
3) "smile.girls.Tina"
4) "love u" // 消息內(nèi)容

關(guān)注「smile.girls.Tina」的粉絲收到消息:

127.0.0.1:6379> SUBSCRIBE smile.girls.Tina
Reading messages... (press Ctrl-C to quit)
// 訂閱成功
1) "subscribe"
2) "smile.girls.Tina"
3) (integer) 1
// 接收消息
1) "message"
2) "smile.girls.Tina"
3) "love u"

需要注意的是,如果一個客戶端訂閱了與模式匹配的模式和頻道,那么客戶端會收到多次消息。

比如,65 哥 訂閱了「smile.girls.Tina」頻道和「smile.girls.*」模式,那么當(dāng) Tina 發(fā)布動態(tài)到頻道的時候,65 哥會收到兩條票消息,一條消息類型是message,一條類型是pmessage。

Redisson 與 SpringBoot 實戰(zhàn)

官方文檔:https://github.com/redisson/redisson/wiki/6.-distributed-objects/#67-topic

生產(chǎn)者代碼

/**
* 發(fā)布消息到 Topic
* @param message 消息
* @return 接收消息的客戶端數(shù)量
*/
public long sendMessage(String message) {
RTopic topic = redissonClient.getTopic(CHANNEL);
long publish = topic.publish(message);
log.info("生產(chǎn)者發(fā)送消息成功,msg = {}", message);
return publish;
}

消費者代碼

public void onMessage() {
// in other thread or JVM
RTopic topic = redissonClient.getTopic(CHANNEL);
topic.addListener(String.class, (channel, msg) -> {
log.info("channel: {} 收到消息 {}.", channel, msg);
});
}

需要注意的是,發(fā)布消息與監(jiān)聽消息要運行在不同的 JVM,如果使用同一個 redissonClient 發(fā)布的話,不會監(jiān)聽到自己的消息。

原理分析

我們通過上文知道了發(fā)布訂閱的概念,一共兩種模式實現(xiàn)發(fā)布訂閱。并且運用原生指令和 Redisson 進行實戰(zhàn)。

接下來,我們要深入理解 Redis 如何實現(xiàn)發(fā)布訂閱機制,做到知其然知其所以然。

頻道(Channel)的發(fā)布/訂閱如何實現(xiàn)的?

65 哥,如果是你會使用什么數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)基于頻道來定位對應(yīng)客戶端?

碼哥,我覺得可以字典來實現(xiàn),字典的 key 對應(yīng)被訂閱的頻道,而字典的值可以使用一個鏈表,鏈表里面保存著訂閱這個頻道的所有客戶端。

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

聰明,Redis 使用 redis.h中有一個 redisServer 結(jié)構(gòu)體維護每個服務(wù)器進程表示服務(wù)器狀態(tài),pubsub_channels 屬性是一個字典,用于保存訂閱頻道的信息。

struct redisServer {
...
/* Pubsub */
dict *pubsub_channels;
...
}

如下圖所示,「碼哥」、「靚仔」訂閱了「redis-channel」,「宅男」「LSP」訂閱了「枝~藤¥由*香-里」:

圖片

頻道訂閱發(fā)布原理

發(fā)送消息到頻道

生產(chǎn)者調(diào)用 PUBLISH channel messsage 發(fā)送消息,程序先根據(jù) channel 從 pubsub_channels 定位到字典的 key 所在的桶,接著把消息發(fā)送給這個 key 對應(yīng)的 value 鏈表的所有客戶端。

退訂頻道

UNSUBSCRIBE命令可以退訂指定的頻道:對于字典操作來說,根據(jù) key 找到關(guān)注鏈表,遍歷鏈表,刪除這個客戶端,這樣消息就不會發(fā)送給這個客戶端了。

模式(Pattern)的發(fā)布/訂閱如何實現(xiàn)的?

接下來,我們繼續(xù)看基于模式實現(xiàn)的發(fā)布訂閱原理……

當(dāng)使用 PUBLISH發(fā)布消息到某個頻道的時候,不僅訂閱這個頻道的所有客戶端會收到消息,與這個模式匹配的客戶端也會收到消息。

源碼在 server.h 文件中的redisServer.pubsub_patterns 屬性定義。

struct redisServer {
...
/* A dict of pubsub_patterns */
dict *pubsub_patterns;
...
}

也是 dict 字典類型, key 對應(yīng)「pattern」模式,value 是一個 鏈表類型的結(jié)構(gòu):list *clients里面包含匹配這個模式的客戶端列表。

當(dāng)執(zhí)行 PSUBSCRIBE smile.girls.*命令的時候,會執(zhí)行pubsubSubscribePattern方法。

在這里我分享下如何定位關(guān)鍵源碼,發(fā)布訂閱我們根據(jù)經(jīng)驗搜索pubsub便能檢索到 pubsub.c:

圖片

pubsub.c

碼哥使用 CLion 調(diào)試的 Redis 源碼,跟我們 Java 開發(fā)用的 IDEA 出自于一家,所以快捷鍵都是一樣的,接著使用 Command + F12 彈出方法搜索,找到 pubsubSubscribePattern 訂閱模式的方法。

方法參數(shù)別分表示關(guān)注該模式的客戶端 client *c,和客戶端想要關(guān)注的 *pattern,方法主要邏輯如下:

  • listSearchKey(c->pubsub_patterns,pattern):根據(jù) pattern 從 redisServer.pubsub_patterns 字典查找是否已經(jīng)存在該模式的 key,存在則調(diào)用addReplyPubsubPatSubscribed 通知客戶端已經(jīng)訂閱過了,否則繼續(xù)執(zhí)行以下邏輯。
  • dictFind(server.pubsub_patterns,pattern):根據(jù)模式pattern從字典server.pubsub_patterns找到 dictEntry 哈希桶,為空就調(diào)用listCreate()創(chuàng)建客戶端鏈表list *clients,并放到字典中,key = pattern,value = list *clients 鏈表。

哈希桶不為空,那么把當(dāng)前客戶端client *c 添加到list *clients鏈表尾節(jié)點。

圖片

訂閱模式源碼

所以模式實現(xiàn)的發(fā)布訂閱也是通過字典來保存模式與客戶端的關(guān)系,如下圖所示:

圖片

基于模式實現(xiàn)的發(fā)布訂閱原理

當(dāng)使用 PUBLISH 發(fā)布消息的時候,除了發(fā)布到訂閱channel的客戶端以外,還會將該 channel 與 pubsub_patterns 字典中查找匹配模式 key 對應(yīng)的 value 中的客戶端鏈表,并執(zhí)行消息發(fā)送。

退訂模式

使用 PUNSUBSCRIBE命令可以退訂指定的模式, 這個命令執(zhí)行的是訂閱模式的反操作:根據(jù)模式從 pubsub_patterns字典中找到客戶端鏈表,遍歷鏈表將當(dāng)前客戶端刪除。

總結(jié)

Redis 發(fā)布訂閱功能,主要通過如下命令實現(xiàn):

  • subscribe channel [channel ...]:訂閱一個或者多個頻道;
  • unsubscribe channel 退訂指定頻道;
  • publish channel message 向指定頻道發(fā)送消息;
  • psubscribe pattern 訂閱指定模式;
  • punsubscribe pattern 退訂指定模式。

Pub/Sub 與數(shù)據(jù)庫無關(guān),比如在 DB0 上發(fā)布, DB1的訂閱者也將接收到。

基于頻道實現(xiàn)的發(fā)布訂閱信息是由服務(wù)器進程的 redisServer.pubsub_channels 字典保存,key = 被訂閱的頻道,value 是訂閱頻道的所有客戶端鏈表。

當(dāng)消息發(fā)布到頻道的時候,遍歷字典獲取所有客戶端并把消息發(fā)送到頻道的客戶端。

基于模式實現(xiàn)的發(fā)布訂閱的信息保存在字典 pubsub_patterns中,key = pattern,value 是客戶端鏈表。

當(dāng)消息發(fā)布到頻道的時候,除了訂閱該頻道的客戶端收到消息以外,所有訂閱了與頻道匹配的模式的客戶端也會收到消息。

使用場景

說了這么多,Redis 發(fā)布訂閱能在什么場景發(fā)揮作用呢?

哨兵間通信

哨兵集群中,每個哨兵節(jié)點利用 Pub/Sub 發(fā)布訂閱實現(xiàn)哨兵之間的相互發(fā)現(xiàn)彼此和找到 Slave。

哨兵與 Master 建立通信后,利用 master 提供發(fā)布/訂閱機制在__sentinel__:hello發(fā)布自己的信息,比如身高體重、是否單身、IP、端口……,同時訂閱這個頻道來獲取其他哨兵的信息,就這樣實現(xiàn)哨兵間通信。

消息隊列

之前「碼哥」跟大家分享過如何利用 Redis List 與 Stream 實現(xiàn)消息隊列。

我們也可以利用 Redis 發(fā)布訂閱實現(xiàn)輕量級簡單的 MQ 功能,實現(xiàn)上下游解耦,需要注意點是 Redis 發(fā)布訂閱的消息不會被持久化,所以新訂閱的客戶端將收不到歷史消息。

也不支持 ACK 機制,所以當(dāng)前業(yè)務(wù)不能容忍這些缺點,那就使用專業(yè)的消息隊列,如果能容忍那就能享受 Redis 唯快不破的優(yōu)勢。

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

2025-05-07 08:03:10

2023-11-02 09:59:53

C++設(shè)計模式

2021-07-20 08:12:55

CPU核數(shù)線程數(shù)

2021-10-18 10:17:07

Go Golang語言

2023-07-10 10:53:22

2022-11-01 15:02:11

2019-09-29 19:28:13

區(qū)塊鏈比特幣加密貨幣

2015-08-27 14:05:01

大數(shù)據(jù)創(chuàng)業(yè)

2021-04-27 10:14:28

大數(shù)據(jù)物聯(lián)網(wǎng)IOT

2022-02-14 11:28:51

區(qū)塊鏈元宇宙代幣

2018-09-30 15:55:56

2015-09-24 10:40:31

NFVSDN

2017-10-23 14:40:01

2015-08-03 10:20:39

大數(shù)據(jù)Hadoop

2020-02-27 08:52:51

NFVSDN網(wǎng)絡(luò)

2021-02-02 12:46:36

Spring異步循環(huán)

2025-02-25 09:29:34

2021-01-12 08:43:29

Redis ListStreams

2023-04-06 11:54:55

2024-03-10 21:00:33

點贊
收藏

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

日韩成人一区二区三区| 国产在线a视频| 午夜毛片在线| 六月丁香婷婷久久| 久久精品成人欧美大片古装| 九九九九九九九九| 后进极品白嫩翘臀在线播放| av午夜精品一区二区三区| 4388成人网| 又嫩又硬又黄又爽的视频| 亚洲**毛片| 日韩欧美一区视频| 色狠狠久久av五月综合| 99国产精品一区二区三区| 亚洲天堂成人| 中文字幕在线国产精品| 免费啪视频在线观看| 精品91久久| 一级特黄大欧美久久久| 日产精品高清视频免费| 丰满人妻av一区二区三区| 久久综合狠狠| 久久久久国产精品免费网站| 老头老太做爰xxx视频| 一区二区三区欧洲区| 欧美在线免费播放| 国产黄色激情视频| h视频在线免费| 不卡的av中国片| 国产精品专区第二| 久久艹免费视频| 在线免费观看日本欧美爱情大片| 亚洲人成欧美中文字幕| 蜜桃视频无码区在线观看| 深夜视频一区二区| 天涯成人国产亚洲精品一区av| 精品久久免费观看| 欧美zozo| 91视频免费观看| 岛国视频一区| 91在线你懂的| 蜜臂av日日欢夜夜爽一区| 97超视频免费观看| 久久精品无码人妻| 1024精品久久久久久久久| 国产亚洲视频中文字幕视频| 黄色录像a级片| 97se亚洲国产一区二区三区| 欧美精品一卡二卡| 国产三级日本三级在线播放| 亚洲美女尤物影院| 亚洲成精国产精品女| 影音先锋男人的网站| 1024国产在线| 国产欧美精品一区| 日韩精品一区二区三区丰满 | 欧美美女激情18p| 91看片在线免费观看| 欧美羞羞视频| 日本韩国欧美在线| 欧美 国产 小说 另类| 日韩在线伦理| 日韩欧美在线中文字幕| av免费中文字幕| gay欧美网站| 色噜噜久久综合| 色一情一乱一伦一区二区三区日本| 性感女国产在线| 欧美日韩亚洲一区二区| 狠狠97人人婷婷五月| 咪咪网在线视频| 欧美日韩美女在线观看| 凹凸国产熟女精品视频| 伊人色综合一区二区三区影院视频| 精品久久久久久亚洲国产300| 你懂的av在线| 欧美精品总汇| 欧美午夜寂寞影院| 中文字幕日韩综合| 欧美黄色一级| 亚洲白虎美女被爆操| 人妻换人妻a片爽麻豆| 开心激情综合| 国产亚洲视频中文字幕视频| 五月天色婷婷丁香| 国产精品多人| 奇米四色中文综合久久| 中文字幕精品一区二区精| 精品在线亚洲视频| 成人羞羞视频免费| 污污网站免费在线观看| 国产亚洲精品福利| 伊人av成人| 黄色污污视频在线观看| 色先锋aa成人| 91网址在线观看精品| 国内精品麻豆美女在线播放视频 | 日韩欧美一区视频| 中文字幕1234区| 九九热播视频在线精品6| 亚洲男人的天堂网站| 最新av电影网站| 一区二区日韩免费看| 国产精品一区二区三区久久| www.日本在线观看| 久久精品在这里| 黄色影视在线观看| 日韩电影毛片| 欧美美女一区二区三区| 一本加勒比波多野结衣| 色乱码一区二区三区网站| 欧美黄色成人网| 最新黄色网址在线观看| 成人国产免费视频| 一区二区三区四区视频在线观看| 久久亚洲导航| 欧美日韩亚洲综合一区| 呦呦视频在线观看| 影音先锋日韩在线| 国产精品com| 蜜桃av噜噜一区二区三区麻豆| 国产欧美视频一区二区| 欧美日韩福利在线| 亚洲人成777| 亚洲欧美日韩高清| 久久精品国产av一区二区三区| 免费观看成人鲁鲁鲁鲁鲁视频| www.久久草| 在线观看美女网站大全免费| 第一福利永久视频精品| 欧美高清精品一区二区| 青草国产精品| 日本韩国欧美精品大片卡二| 亚洲欧美另类综合| 自拍偷拍欧美精品| 国产免费又粗又猛又爽| 婷婷综合福利| 久久久久久久久久国产精品| 国产精选久久久| 国产精品乱人伦中文| 午夜精品久久久内射近拍高清| 91国内精品白嫩初高生| 久久影视电视剧免费网站| 中文字幕天堂在线| 久久综合色天天久久综合图片| 日韩一级片免费视频| 国内精品视频| 另类少妇人与禽zozz0性伦| 黄色一区二区视频| 国产欧美一区二区精品性色超碰| 黄色片一级视频| 一本久久青青| 欧美综合国产精品久久丁香| 亚洲欧美丝袜中文综合| 亚洲成人综合视频| 2一3sex性hd| 1024日韩| 久久天天狠狠| 欧美magnet| 亚洲欧美日韩在线高清直播| 在线精品免费视| 2020国产精品| 国产成人无码一二三区视频| 自拍自偷一区二区三区| 国产91精品在线播放| 暖暖视频在线免费观看| 欧美自拍偷拍午夜视频| 亚洲一级理论片| 国产在线国偷精品免费看| 黄色免费高清视频| 日韩精品三级| 性色av一区二区三区在线观看| 人妻少妇精品无码专区| 精品国产成人av| 中文字幕高清视频| 日本怡春院一区二区| 在线视频不卡一区二区三区| av在线国产精品| 国a精品视频大全| 日本午夜在线视频| 欧美视频在线一区| 午夜爽爽爽男女免费观看| 国产福利精品导航| 六月丁香激情网| 精品视频网站| 97超碰人人看人人 | 色乱码一区二区三区网站| 91色精品视频在线| 国产丝袜在线播放| 亚洲精品视频网上网址在线观看| 最新在线中文字幕| 一区二区三区在线观看欧美| 91av在线免费| 久久99精品一区二区三区三区| 国产精品三级一区二区| 亚洲图区在线| 91亚洲国产成人精品性色| 草美女在线观看| 国产一区二区三区在线视频| 国产福利小视频| 欧美午夜激情在线| 免费国产羞羞网站美图| 99精品桃花视频在线观看| 奇米影音第四色| 在线看片日韩| 亚洲视频sss| 加勒比中文字幕精品| 国产一区私人高清影院| 涩涩视频在线播放| 久久精品国产91精品亚洲| 五月天婷婷在线播放| 777a∨成人精品桃花网| 精品国产一区二区三区四| 亚洲精品成人天堂一二三| 久久久亚洲av波多野结衣| 国产毛片一区二区| 狠狠热免费视频| 亚洲美女色禁图| 可以在线看黄的网站| heyzo久久| 国产在线一区二区三区四区| 午夜精品久久久久久毛片| 青青草99啪国产免费| 色婷婷av在线| 久久精品成人欧美大片| 国产免费a∨片在线观看不卡| 精品国产91乱码一区二区三区| 中文字幕在线观看第二页| 精品福利视频导航| 久久99久久98精品免观看软件 | 亚洲人成人77777线观看| 美女av一区| 97人摸人人澡人人人超一碰| 色综合.com| 国产成人精品午夜| 在线黄色的网站 | 午夜无码国产理论在线| 97国产成人精品视频| 性网站在线观看| 久久韩剧网电视剧| 久久五月精品| www日韩中文字幕在线看| 国产九九在线| 亚洲天堂免费观看| 日av在线播放| 亚洲精品自在久久| 三级在线观看| 亚洲欧美日韩成人| 美女做暖暖视频免费在线观看全部网址91 | 国产不卡一区二区视频| 黄色日韩在线| 国产肉体ⅹxxx137大胆| 欧美三级网页| 日韩在线视频在线| 欧美国产91| 九九久久九九久久| 午夜电影亚洲| 日本阿v视频在线观看| 黄色成人在线网址| 男女私大尺度视频| 99在线观看免费视频精品观看| 日韩 欧美 视频| 国产精品视频| 成人在线免费播放视频| 免费成人在线观看| 亚洲欧美aaa| 国产麻豆一精品一av一免费| 超碰中文字幕在线观看| 国产99一区视频免费| 动漫美女无遮挡免费| 91蜜桃在线观看| 国产三级av在线播放| 国产欧美精品一区| 91视频青青草| 亚洲成人7777| 波多野结衣在线观看视频| 欧美日韩国产综合视频在线观看| 国产一区二区三区在线观看| 日韩一区二区在线观看视频| 丰满人妻妇伦又伦精品国产| 亚洲欧美综合精品久久成人| av免费在线一区二区三区| 久久亚洲国产成人| av电影在线免费| 国产99在线|中文| 一区在线不卡| 91九色对白| 猛男gaygay欧美视频| 尤物一区二区三区| 亚洲性感美女99在线| 欧美日韩亚洲一| 精品综合久久久久久8888| www.啪啪.com| 国产精品沙发午睡系列990531| 九九久久免费视频| 在线观看三级视频欧美| www.热久久| 中日韩美女免费视频网站在线观看| 日韩欧美一起| 国产精品久久久久久久久免费| 欧美高清一级片| 日韩中文字幕一区二区| 亚洲私人影院| 中文字幕永久有效| 91美女蜜桃在线| 欧美国产在线看| 欧美在线小视频| 亚洲 小说区 图片区 都市| 日韩网站在线观看| 原纱央莉成人av片| 操人视频欧美| 欧美大片aaaa| 免费日韩中文字幕| 成人免费毛片app| 三级全黄做爰视频| 色综合久久久网| 亚洲免费成人在线| 色久欧美在线视频观看| 中文在线中文资源| 懂色中文一区二区三区在线视频 | 亚洲美女中文字幕| 在线免费观看a视频| 国产欧洲精品视频| 色综合中文网| 人妻精品无码一区二区三区| 国产成人av一区二区三区在线观看| 欧美色图17p| 在线免费不卡电影| 男生女生差差差的视频在线观看| 欧美极品少妇全裸体| 国产亚洲高清一区| 香蕉视频在线网址| 久久精品国产精品青草| 亚洲av熟女国产一区二区性色| 黄网站色欧美视频| 黄色aaa大片| 欧美华人在线视频| 7m精品国产导航在线| 日本一级黄视频| 风间由美一区二区三区在线观看| 顶级黑人搡bbw搡bbbb搡| 欧美日韩综合在线| 777电影在线观看| 国产精品久在线观看| 国内精品久久久久久久影视简单| 久久婷婷国产精品| 国产午夜精品一区二区三区视频| 福利网址在线观看| 亚洲免费伊人电影在线观看av| 超碰一区二区| 欧洲久久久久久| 三级影片在线观看欧美日韩一区二区 | 国产91国语对白在线| 亚洲精品综合久久中文字幕| 亚洲私拍视频| 欧美精品一区二区三区久久| 久久性色av| 一本在线免费视频| 777色狠狠一区二区三区| av在线影院| 成人资源av| 影音先锋亚洲精品| 中国极品少妇xxxx| 亚洲成av人片在www色猫咪| 无码精品在线观看| 欧美一级电影久久| 成人aaaa| 日本特黄a级片| 亚洲视频在线观看三级| 97在线视频人妻无码| 亚洲天堂免费在线| 欧美日韩精品免费观看视欧美高清免费大片 | 天天爽天天狠久久久| 免费人成网站在线观看欧美高清| 91在线无精精品白丝| 欧美日精品一区视频| 青草视频在线免费直播| 成人在线看片| 久久一日本道色综合久久| 日本一区二区视频在线播放| 51精品国自产在线| 在线你懂的视频| 欧美理论一区二区| 日韩专区欧美专区| 亚洲人做受高潮| 精品剧情v国产在线观看在线| 538在线观看| 午夜一区二区三区| 精品一区二区三区蜜桃| 国产一级在线视频| 精品亚洲精品福利线在观看| 日本黄色成人| 男人天堂a在线| 中文字幕欧美日韩一区| 99视频在线观看免费| 欧美怡春院一区二区三区| 久久高清免费| 亚洲在线观看网站| 精品国产乱码久久久久久虫虫漫画 | 免费av在线网站|