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

淺析Mongodb源碼之游標Cursor

運維 數據庫運維 其他數據庫 MongoDB
在Mongodb中,其提供了類似關系型數據中cursor對象來遍歷數據集合,同時mongodb并要根據不同的場景生成不同的游標對象(cursor),比如順序遍歷游標(basicCursor),反向游標(reverseCursor), B樹索引游標(btreeCursor)等。

在Mongodb中,其提供了類似關系型數據中cursor對象來遍歷數據集合,同時mongodb并要根據不同的場景生成不同的游標對象(cursor),比如順序遍歷游標(basicCursor)反向游標(reverseCursor) B樹索引游標(btreeCursor)等。

下面是其游標體系架構類圖(位于cursor.cpp, cursor.h, clientcursor.cpp, clientcursor.h):

從該圖中,可以看到除了(ClientCursor)之外,其余游標均繼承自Cursor這個類(基類),下面我們看一下其具體實現:

  1. class Cursor : boost::noncopyable//使類和派生類不可復制  
  2. {  
  3.    virtual bool ok() = 0;//游標當前指向的對象是否有效  
  4.    bool eof() { return !ok(); }//是否已到尾部  
  5.    virtual Record* _current() = 0;//游標當前指向的記錄(記錄是組成數據文件的最基本單位)  
  6.    virtual BSONObj current() = 0;//游標當前指向的BSONObj對象  
  7.    virtual DiskLoc currLoc() = 0;//游標當前指向的DiskLoc  
  8.    virtual bool advance() = 0; /*true=ok,將游標指向到下一條記錄所在位置*/ 
  9.    virtual BSONObj currKey() const { return BSONObj(); }  
  10.      
  11.   /* 標識游標是否為Tailable類型,該類型支持獲取最后一條記錄后,不馬上關閉游標,以便持續獲取后面新添加的記錄*/ 
  12.    virtual bool tailable()   
  13.    {  
  14.       return false;  
  15.    }  
  16.    //設置游標為Tailable類型  
  17.    virtual void setTailable() {}  
  18.    .....  
  19. }   

在mongodb中,提供了兩種遍歷數據集合的方向,分別是“向前”和“倒轉”方式,其聲明如下:

  1. class AdvanceStrategy   
  2. {  
  3.    public:  
  4.       virtual ~AdvanceStrategy() { }  
  5.       virtual DiskLoc next( const DiskLoc &prev ) const = 0;  
  6. };  
  7.  
  8. const AdvanceStrategy *forward(); //向前  
  9. const AdvanceStrategy *reverse(); //倒轉 

下面是其實現方式如下:

  1. class Forward : public AdvanceStrategy {  
  2.    virtual DiskLoc next( const DiskLoc &prev ) const {  
  3.    return prev.rec()->getNext( prev );  
  4.    }  
  5. } _forward;  
  6.  
  7. class Reverse : public AdvanceStrategy {  
  8.    virtual DiskLoc next( const DiskLoc &prev ) const {  
  9.    return prev.rec()->getPrev( prev );  
  10.    }  
  11. } _reverse;  
  12.  
  13. const AdvanceStrategy *forward() {  
  14.    return &_forward;  
  15. }  
  16. const AdvanceStrategy *reverse() {  
  17.    return &_reverse;  

 

看到這里,我們有必須簡要說明一下mongofile文件的結構,見下面說明:

  1. /*  a datafile - i.e. the "dbname.<#>" files :  
  2.  
  3. ----------------------  
  4. DataFileHeader  :數據頭文件信息,包括版本,文件長度,使用情況等  
  5. ----------------------  
  6. Extent (for a particular namespace) 特定namespace下的extent,可理解為數據集合  
  7.   Record : 單條數據記錄  
  8.   ...  
  9.   Record (some chained for unused space)  
  10. ----------------------  
  11. more Extents... 其它extent  
  12. ----------------------  
  13. */ 

在一個數據庫文件中,同一個namespace的extent可以有多個,每一個extent都有一些記錄(record)組成,如果訪問record,可以使用diskloc加上文件偏移(getOfs:位于diskloc中)獲取。
同時每個extent中包括還包括兩個重要屬性:

  1. DiskLoc xnext, xprev; /* next/prev extent for this namespace */ 

它們分別記錄了同一namespace下,在extent鏈表中,當前extent的前或后一個extent的位置信息,上面AdvanceStrategy中的next方法即實現了在兩種遍歷方向(上面已提到)上,在extent鏈接中跳轉的方式,比如在forward方向:

  1. inline DiskLoc Record::getNext(const DiskLoc& myLoc) {  
  2.    //如果當前 Record的nextOfs偏移不為空,表示在當前extent中還有后續記錄可訪問  
  3.    if ( nextOfs != DiskLoc::NullOfs ) {  
  4.       /* defensive */ 
  5.       if ( nextOfs >= 0 && nextOfs < 10 ) {//是否為已刪除的記錄  
  6.          sayDbContext("Assertion failure - Record::getNext() referencing a deleted record?");  
  7.          return DiskLoc();  
  8.       }  
  9.    return DiskLoc(myLoc.a(), nextOfs);//獲取下一條記錄  
  10.    }  
  11.    Extent *e = myExtent(myLoc);//獲取當前記錄所屬的Extent  
  12.    while ( 1 ) {  
  13.       if ( e->xnext.isNull() )  
  14.          return DiskLoc(); //已到表尾.  
  15.       e = e->xnext.ext();//跳轉到下一個extent(以便進行next遍歷)  
  16.       if ( !e->firstRecord.isNull() )  
  17.       break;  
  18.       // entire extent could be empty, keep looking  
  19.    }  
  20.    return e->firstRecord;//獲取下一個extent中的第一條記錄  
  21. }  
  22.  

在每個extent對象中,其還包括另外兩個屬性 firstRecord,lastRecord,兩者皆為DiskLoc類型,顧名思義,它們分別指向當前extent的第一條和最后一條記錄所在位置,這種定義它們是為了后者在extent中進行跳轉時使用,當前如果在更加復雜的capped collection情況下,其值在會刪除記錄等操作時不斷更新,比如下面代碼:

  1. //namespace.cpp 文件912行,該方法在刪除記錄時調用  
  2. void DataFileMgr::_deleteRecord(NamespaceDetails *d, const char *ns, Record *todelete, const DiskLoc& dl)   
  3. {  
  4.    ......  
  5.    //extents是一個數據文件區域,該區域有所有記錄(records)均屬于同一個名空間namespace  
  6.    /* remove ourself from extent pointers */ 
  7.    {  
  8.       Extent *e = getDur().writing( todelete->myExtent(dl) );  
  9.       if ( e->firstRecord == dl )   
  10.       {//如果要刪除記錄為該extents區域第一條記錄時  
  11.          if ( todelete->nextOfs == DiskLoc::NullOfs )//且為唯一記錄時  
  12.             e->firstRecord.Null();//則該空間第一元素為空  
  13.          else //將當前空間第一條(有效)記錄后移一位  
  14.             e->firstRecord.set(dl.a(), todelete->nextOfs);  
  15.       }  
  16.       if ( e->lastRecord == dl )   
  17.       {//如果要刪除記錄為該extents區域最后一條記錄時  
  18.          if ( todelete->prevOfs == DiskLoc::NullOfs )//如果要刪除記錄的前一條信息位置為空時  
  19.             e->lastRecord.Null();//該空間最后一條記錄清空  
  20.          else //設置該空間最后一條(有效)記錄位置前移一位  
  21.             e->lastRecord.set(dl.a(), todelete->prevOfs);  
  22.       }  
  23.    }  
  24.    ......  
  25. }  
  26.  

介紹了cursor基類的定義和遍歷方向這兩個基本概念后,下面介紹一下在mongodb中,廣泛使用的是basicCursor,其定義如下:

  1. class BasicCursor : public Cursor   
  2. {  
  3.    public:  
  4.       BasicCursor(DiskLoc dl, const AdvanceStrategy *_s = forward()) : curr(dl), s( _s ), _nscanned()   
  5.       {  
  6.          incNscanned();  
  7.          init();  
  8.       }  
  9.       BasicCursor(const AdvanceStrategy *_s = forward()) : s( _s ), _nscanned()   
  10.       {  
  11.          init();  
  12.       }  
  13.       bool ok() { return !curr.isNull(); }  
  14.       Record* _current()   
  15.       {  
  16.          assert( ok() );  
  17.          return curr.rec();  
  18.       }  
  19.       BSONObj current()   
  20.       {  
  21.          Record *r = _current();  
  22.          BSONObj j(r);  
  23.          return j;  
  24.       }  
  25.       virtual DiskLoc currLoc() { return curr; }  
  26.       virtual DiskLoc refLoc()  { return curr.isNull() ? last : curr; }  
  27.       bool advance();  
  28.       virtual string toString() { return "BasicCursor"; }  
  29.       virtual void setTailable()   
  30.       {  
  31.          if ( !curr.isNull() || !last.isNull() )  
  32.          tailable_ = true;  
  33.       }  
  34.       virtual bool tailable() { return tailable_; }  
  35.   ......  
  36. };  
  37.  

可認看到在其構造函數時,使用了forward方向的遍歷方式, 即然定義了Forward方向的游標,mongodb接下來定義了Reverse方向的游標:  

  1. /* 用于排序 { $natural: -1 } */ 
  2. class ReverseCursor : public BasicCursor   
  3. {  
  4.    public:  
  5.       ReverseCursor(DiskLoc dl) : BasicCursor( dl, reverse() ) { }  
  6.       ReverseCursor() : BasicCursor( reverse() ) { }  
  7.       virtual string toString() { return "ReverseCursor"; }  
  8. };  

 另外為了支持capped collection集合類型(有關capped collection,參見這篇鏈接),mongodb分別定義了ForwardCappedCursor和ReverseCappedCursor:  

  1. class ForwardCappedCursor : public BasicCursor, public AdvanceStrategy   
  2. {  
  3.    public:  
  4.  
  5.       ForwardCappedCursor( NamespaceDetails *nsd = 0, const DiskLoc &startLoc = DiskLoc() );  
  6.       virtual string toString() {  
  7.          return "ForwardCappedCursor";  
  8.       }  
  9.       virtual DiskLoc next( const DiskLoc &prev ) const;  
  10.       virtual bool capped() const { return true; }  
  11.    private:  
  12.       NamespaceDetails *nsd;  
  13. };  
  14.  
  1. class ReverseCappedCursor : public BasicCursor, public AdvanceStrategy   
  2. {  
  3.    public:  
  4.       ReverseCappedCursor( NamespaceDetails *nsd = 0, const DiskLoc &startLoc = DiskLoc() );  
  5.       virtual string toString() {  
  6.          return "ReverseCappedCursor";  
  7.       }  
  8.       virtual DiskLoc next( const DiskLoc &prev ) const;  
  9.       virtual bool capped() const { return true; }  
  10.    private:  
  11.       NamespaceDetails *nsd;  
  12. };  
  13.  

 只不過在ForwardCappedCursor和ReverseCappedCursor中,實現next方法會更復雜一下,因為其要考慮刪除的記錄不在遍歷結果中的情況。相當內容詳見cursor.cpp的實現代碼:)

介紹游標和mongofile結構之后,我們大體知道了mongodb如果遍歷數據文件,另外mongodb使用了b樹索引來加快查詢效率,因此mongodb也提供了相應的btreeCursor,其主要用于遍歷內存中的b樹索引。

除此以外,為了方便client端使用cursor訪問數據庫,mongodb提供了ClientCursor,其對Cursor進一步封裝(詳見clientcursor.h)。

下面我們看一下mongodb如果要據查詢方式來確定使用那種類型游標的:  

  1.  //pdfile.cpp 文件639行,查詢從指定記錄位置startLoc開始的記錄,這里要據不同的條件使用不同的注季  
  2. shared_ptr<Cursor> DataFileMgr::findAll(const char *ns, const DiskLoc &startLoc)   
  3. {  
  4.    NamespaceDetails * d = nsdetails( ns );  
  5.    if ( ! d )  
  6.       return shared_ptr<Cursor>(new BasicCursor(DiskLoc()));  
  7.  
  8.    DiskLoc loc = d->firstExtent;  
  9.    Extent *e = getExtent(loc);  
  10.  
  11.    ......  
  12.  
  13.    if ( d->capped )  
  14.       return shared_ptr<Cursor>( new ForwardCappedCursor( d , startLoc ) );  
  15.  
  16.    if ( !startLoc.isNull() )  
  17.       return shared_ptr<Cursor>(new BasicCursor( startLoc ));  
  18.  
  19.    ......  
  20.    return shared_ptr<Cursor>(new BasicCursor( e->firstRecord ));  
  21. }  
  22.  

到這里,可以看了,mongodb在cursor的設計和使用方式上是基于“策略模式”(strategy pattern)的,如下圖:

 

其中cursor就是各種遍歷數據集合的策略,而pdfile.cpp就是持有相應cursor的上下文(context)  ,該模式也是使用比較廣泛的一種設置模式,好處這里就不多說了。
  
好了,今天的內容到這里就告一段落了,在接下來的文章中,將會介紹mongodb中mmap的使用場景。

原文鏈接:http://www.cnblogs.com/daizhj/archive/2011/04/15/mongodb_cursor_source_code.html

【編輯推薦】

  1. 走進MongoDB的世界 展開MongoDB的學習之旅
  2. 野心勃勃的NoSQL新貴 MongoDB應用實戰
  3. MongoDB與CouchDB全方位對比
  4. MongoDB1.8發布,分布式文檔數據庫
責任編輯:艾婧 來源: 博客園
相關推薦

2011-12-02 13:04:06

Java

2011-05-26 10:05:48

MongoDB

2021-10-26 10:22:27

ArrayList阿里云

2011-05-26 16:18:51

Mongodb

2017-02-27 09:03:37

Mesos架構源碼

2011-04-06 09:30:29

游標腳本性能問題

2009-07-08 14:06:22

ClassLoaderJDK源碼

2022-01-12 18:35:54

MongoDB數據查詢

2018-11-13 09:49:11

存儲云存儲云備份

2023-12-17 14:43:17

2011-09-14 15:30:00

MongoDB

2009-10-27 16:26:58

2009-07-08 12:53:29

JDK源碼Java.lang.B

2021-05-26 05:22:09

Virtual DOMSnabbdom虛擬DOM

2025-01-03 08:50:23

2010-07-16 09:30:42

C#MongoDB

2009-07-07 15:53:02

JDK日志

2023-11-23 19:07:33

2009-08-20 10:25:37

C#操作內存

2009-09-17 13:30:32

LINQ to XML
點贊
收藏

51CTO技術棧公眾號

绿色成人影院| 日本视频免费在线| 51一区二区三区| 久久久天堂av| 国产精品影院在线观看| 国产一二三av| 久久视频免费| 午夜亚洲国产au精品一区二区| 久久青青草原| 中文字幕av在线免费观看| 99久久视频| 精品福利av导航| 亚洲中文字幕无码不卡电影| 日韩伦理在线电影| 国产成人一区在线| 欧美综合在线第二页| 女人十八毛片嫩草av| 玖玖玖视频精品| 欧美日韩国产精品一区二区三区四区| 少妇特黄a一区二区三区| 国产又粗又猛又爽又黄的视频一| 欧美日韩亚洲一区| 国产香蕉精品视频一区二区三区| 污视频在线观看免费网站| 涩涩在线视频| 亚洲视频一区二区在线| 久久福利电影| 国产欧美日韩成人| 国产免费成人| 久久精品视频在线播放| 亚洲精品女人久久久| 九九热这里有精品| 天天综合网天天综合色| 日本黄色a视频| 青青草视频在线观看| 国产精品资源在线观看| 国产精品99蜜臀久久不卡二区| 九九九免费视频| 加勒比久久综合| 日韩欧美一区二区三区在线| 亚洲三级视频网站| 激情黄产视频在线免费观看| 中文字幕一区二区视频| 欧美福利一区二区三区| 丁香六月天婷婷| 久久精品免费观看| 日本午夜在线亚洲.国产| 久久视频免费看| 91成人精品视频| 国产亚洲欧洲黄色| 日本一区二区在线免费观看| 欧美2区3区4区| 欧美日韩一二三区| 国产真实乱子伦| aa级大片免费在线观看| 亚洲精品综合在线| 中文字幕av日韩精品| h视频网站在线观看| 久久欧美一区二区| 国精产品一区二区| 成人精品在线播放| 国产激情91久久精品导航| 国产欧美精品在线播放| 久久久国产免费| 久久婷婷丁香| 日本精品免费观看| 黄色片中文字幕| 亚洲综合不卡| 欧洲亚洲妇女av| 91视频免费网址| 亚洲激情另类| 777777777亚洲妇女| 日韩免费一二三区| 在线精品亚洲| 午夜剧场成人观在线视频免费观看| 精品欧美一区二区久久久久| 韩日精品视频| 韩国精品久久久999| 久久国产精品系列| 亚洲免费婷婷| 日韩av男人的天堂| 在线观看你懂的网站| 麻豆国产欧美一区二区三区| 国产这里只有精品| av在线亚洲天堂| 懂色av一区二区夜夜嗨| 国产亚洲精品久久飘花| 欧美美女色图| 国产精品免费久久| 潘金莲一级淫片aaaaa免费看| 国产区在线观看| 亚洲综合激情另类小说区| 亚洲熟妇无码一区二区三区导航| 狼人综合视频| 欧美亚洲一区二区三区四区| 中文字幕资源在线观看| 亚洲超碰在线观看| 精品亚洲一区二区三区在线播放| 卡一卡二卡三在线观看| 亚洲破处大片| 91精品国产电影| 99re热视频| 国产成人三级在线观看| 蜜桃91精品入口| a天堂中文在线88| 怡红院av一区二区三区| 国产白丝袜美女久久久久| av在线不卡精品| 日韩女优毛片在线| 小早川怜子久久精品中文字幕| 999国产精品永久免费视频app| 欧美精品电影在线| 无码人妻丰满熟妇精品区| 国内精品免费在线观看| 久久精品日产第一区二区三区| 婷婷五月在线视频| 午夜av一区二区三区| 在线观看日本一区二区| 懂色av一区二区| 这里只有精品视频| 日本三级2019| 国产一区二区中文字幕| 麻豆亚洲一区| av片在线观看| 欧美日韩在线播放三区| 99久久人妻精品免费二区| 91麻豆国产自产在线观看亚洲| 韩国v欧美v日本v亚洲| 国产女人高潮时对白| 国产偷国产偷精品高清尤物| 国产精品成人久久电影| 性欧美video另类hd尤物| 亚洲乱码一区av黑人高潮| 成人免费视频国产免费观看| 日韩精品亚洲专区| 国产精品区二区三区日本| 麻豆网站在线看| 欧美性猛交xxxx免费看久久久| 中文字幕人妻熟女人妻a片| 成人在线免费观看视频| 欧美中文字幕第一页| 成人毛片视频免费看| 亚洲欧美乱综合| 国产三级国产精品国产专区50| 中文精品一区二区| 97av在线视频| 黄色av网址在线| 亚洲人成电影网站色mp4| 亚洲欧洲日本精品| 黑人操亚洲人| 日韩免费精品视频| 色就是色亚洲色图| 偷拍与自拍一区| 风韵丰满熟妇啪啪区老熟熟女| 91精品国产自产拍在线观看蜜| 国产精品女主播视频| 国产精品免费播放| 色综合av在线| 国产交换配乱淫视频免费| 在线视频日韩| 久久久一本精品99久久精品66| 182在线播放| 精品国产免费久久| 久久久一区二区三区四区| 国产69精品久久久久777| 国产精品免费看久久久无码| 欧美电影在线观看一区| 欧美老少配视频| 午夜精品久久久久久久99老熟妇 | 成人免费观看网址| 在线播放麻豆| 777久久久精品| 成人高潮免费视频| 国产高清成人在线| 霍思燕三级露全乳照| 天堂成人娱乐在线视频免费播放网站| 57pao精品| 国产午夜视频在线观看| 欧美体内she精视频| 疯狂撞击丝袜人妻| 国产成人福利片| 久久精品国产sm调教网站演员| 精品丝袜久久| 国产精品扒开腿做| 麻豆tv入口在线看| 日韩你懂的在线播放| 精品91久久久| 国产精品乱人伦中文| 中文字幕剧情在线观看| 精久久久久久| 欧洲亚洲一区二区三区四区五区| 国产综合色激情| 九九热最新视频//这里只有精品| 亚洲乱码在线观看| 欧美性猛交xxxx| 91香蕉视频网| 成人av在线影院| 成人精品视频一区二区| 久久影院100000精品| 国产精品乱子乱xxxx| 中文在线免费二区三区| 精品国偷自产在线| 三级在线观看网站| 欧美日精品一区视频| 久久高清无码视频| 久久久综合视频| 中文字幕第一页在线视频| 亚洲网址在线| 亚洲精品视频一区二区三区| 99精品在免费线中文字幕网站一区| 日本a级片电影一区二区| 国产秀色在线www免费观看| 精品亚洲一区二区三区在线播放| 国产又粗又猛又黄又爽| 色综合久久中文字幕综合网| 动漫性做爰视频| 国产日韩亚洲欧美综合| 97中文字幕在线观看| 日本91福利区| 精品无码一区二区三区在线| 亚洲澳门在线| 欧美一级二级三级| 亚洲精品在线a| 国产精品欧美激情| 精品丝袜在线| 欧美麻豆久久久久久中文| 成人午夜影视| 亚洲黄色片网站| av高清一区二区| 欧美日韩中文国产| 黄色在线免费观看| 一区二区激情小说| 四虎影院中文字幕| 欧美激情一区二区三区| 亚洲色图14p| 粉嫩嫩av羞羞动漫久久久| 小明看看成人免费视频| 可以免费看不卡的av网站| 免费一级特黄特色毛片久久看| 亚洲欧美偷拍自拍| 亚洲精品在线免费看| 国产欧美日韩在线一区二区| 韩国精品一区二区三区六区色诱| 九九九九九九精品任你躁| 国产精品自产拍在线观看| 国产超碰精品| 欧美一区二三区| 国产网站在线| 久久免费高清视频| 欧美人体视频xxxxx| 久热国产精品视频| 快射视频在线观看| www.亚洲一区| 成人高清免费在线| 久久视频免费观看| 岛国成人毛片| 久久成人18免费网站| 欧美午夜电影一区二区三区| 在线观看欧美成人| 91精彩视频在线播放| 在线一区二区日韩| 在线观看免费网站黄| 日韩一区视频在线| 国产三级在线播放| 欧美高清第一页| cao在线视频| 51精品国产黑色丝袜高跟鞋| 伊人久久视频| 国产福利成人在线| 国产亚洲精彩久久| 91免费版网站入口| 一区三区自拍| 国产日韩在线一区二区三区| 五月天亚洲色图| 日产精品高清视频免费| 99久久视频| 日韩精品综合在线| av成人天堂| 国产精品无码av无码| 热久久一区二区| 成人不卡免费视频| 福利电影一区二区三区| 一起草在线视频| 久久精品日产第一区二区三区高清版| 91视频免费在观看| 亚洲青青青在线视频| 国产无遮挡免费视频| 色婷婷精品久久二区二区蜜臀av| 亚洲综合免费视频| 日韩精品一区二区三区在线观看 | 久久久综合香蕉尹人综合网| 欧美日韩精品在线一区| 在线观看18视频网站| 亚洲毛片在线| 在线观看av网页| 丁香婷婷深情五月亚洲| 亚洲国产av一区| 亚洲精选一二三| 中文人妻av久久人妻18| 正在播放亚洲一区| 日日夜夜精品免费| 中日韩美女免费视频网址在线观看 | 成人免费一区二区三区视频| 欧美精品久久久久久久久46p| 亚洲18女电影在线观看| 最近中文字幕av| 亚洲黄色av女优在线观看| lutube成人福利在线观看| 欧美精品videos另类日本| 日韩伦理三区| av一本久道久久波多野结衣| 欧美交a欧美精品喷水| 国产美女视频免费| 欧美中文日韩| 中文字幕永久免费| 国产精品国产三级国产| 在线观看亚洲欧美| 6080国产精品一区二区| 每日更新av在线播放| 欧美大胆在线视频| 色婷婷综合久久久中字幕精品久久| 91在线免费看网站| 精品国产a一区二区三区v免费| 特色特色大片在线| 免费国产亚洲视频| 800av在线播放| 亚洲精品视频免费看| 中文字幕一区二区三区四区免费看| 亚洲国产免费av| 搞黄网站在线观看| 国产精品自产拍在线观| 欧洲杯什么时候开赛| 亚洲熟妇国产熟妇肥婆| 成人自拍视频在线| 天天操天天操天天操天天操天天操| 欧美性猛交xxxx乱大交蜜桃| 天天干视频在线| 久久免费高清视频| 91精品导航| 精品久久久无码人妻字幂| 久久99久久久久久久久久久| 三年中国中文观看免费播放| 欧美午夜影院在线视频| 五月婷婷丁香网| 久久久久在线观看| 97品白浆高清久久久久久| 最新中文字幕久久| 激情综合五月婷婷| 亚洲精品自拍视频在线观看| 欧美亚洲一区二区三区四区| 成人欧美一区| 国产精品男人爽免费视频1| 一道在线中文一区二区三区| 日日碰狠狠添天天爽超碰97| av日韩在线网站| 亚洲精品www久久久久久| 亚洲护士老师的毛茸茸最新章节| sm捆绑调教国产免费网站在线观看| 99电影网电视剧在线观看| 欧美激情在线| 91人人澡人人爽| 亚洲一二三区在线观看| 蜜臀久久久久久999| 国语自产在线不卡| 欧美色资源站| 亚洲熟妇av一区二区三区| 久久综合色一综合色88| 国产精品100| 亚洲偷欧美偷国内偷| 久久99久久久精品欧美| 亚洲精品成人三区| 国内精品久久久久影院色| 中文字幕影音先锋| 亚洲成人亚洲激情| 天堂av在线网| 神马影院午夜我不卡影院| 麻豆成人91精品二区三区| 国产黄色小视频网站| 日韩免费一区二区三区在线播放| 成年人国产在线观看| 久久国产精品一区二区三区| 三级欧美在线一区| 成人一级黄色大片| 日韩女优av电影| 樱桃视频成人在线观看| 亚洲一区三区在线观看| 国产精品1区二区.| 中文字幕亚洲精品一区| 中文字幕免费国产精品| 亚洲国产aⅴ精品一区二区| 5月婷婷6月丁香| 国产精品国产三级国产普通话99| 国产精品丝袜黑色高跟鞋| 性色av一区二区咪爱| 成人在线国产| 一级少妇精品久久久久久久| 在线观看视频欧美| а√资源新版在线天堂| 六十路精品视频| 激情图片小说一区|