精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美xnxx| 老熟妇仑乱一区二区av| 成人在线日韩| 亚洲h精品动漫在线观看| 国产精品久久久久久久久久直播 | 一级黄色录像大片| 欧美 日韩 国产精品免费观看| 日韩精品中午字幕| 999精品网站| 亚洲按摩av| 久久久久久9999| 147欧美人体大胆444| 日韩三级av在线| 99久久激情| 亚洲精品视频免费在线观看| 精品国产乱码久久久久久1区二区 91网址在线观看精品 | 成人在线爆射| 亚洲国产色一区| 午夜视频久久久| 亚洲精品国产suv一区| 男人的天堂亚洲| 九九热精品视频在线播放| 中文字幕第20页| 国产日韩三级| 日韩午夜在线播放| 色婷婷成人在线| 在线观看涩涩| 婷婷国产v国产偷v亚洲高清| 波多野结衣三级在线| 黄色大片在线免费观看| 成人免费毛片片v| 91精品啪在线观看麻豆免费| 自拍偷拍校园春色| 欧美一级久久| 欧美日韩ab片| 国产一区二区视频在线观看免费| 成人激情视频| 亚洲天堂av在线免费观看| 欧美激情一区二区三区p站| 亚洲精品成人一区| 欧美三级电影网站| 一区二区三区免费| 欧美lavv| 熟妇人妻中文av无码| 国内不卡的二区三区中文字幕| 国产成人啪精品视频免费网| 国产成人在线免费观看视频| 欧美视频四区| 久久97精品久久久久久久不卡| 成年在线观看视频| 久久精品美女| 国产一区二区三区视频免费观看| 日韩精品1区2区3区| 国产suv精品一区二区三区88区| 国产成人精品a视频一区| 在线国产精品一区| 午夜精品久久久久久久99热| 99免费在线观看| 一区二区福利| 日本久久亚洲电影| 成人a v视频| 日本中文一区二区三区| 国产精品美女久久久久久免费| 波多野结衣影片| 奇米色777欧美一区二区| 国产欧美精品一区二区三区介绍| 免费在线不卡av| 麻豆91在线看| 亚洲最大的av网站| 午夜精品久久久久久久99| 国产**成人网毛片九色| 极品日韩久久| 国产永久av在线| 国产精品久久久爽爽爽麻豆色哟哟| 一区二区三区四区欧美日韩| 污污影院在线观看| 欧美日韩国产综合视频在线观看中文 | 国产永久免费视频| 国产成人精品一区二区三区网站观看| 99国产超薄丝袜足j在线观看 | 中文字幕成人在线| 老湿机69福利| 在线视频亚洲| 国产精品视频精品| 亚洲av无码乱码国产精品久久| 成人av网站免费| 牛人盗摄一区二区三区视频| 97在线观看免费观看高清| 亚洲精品成人在线| 青青草原av在线播放| 日韩精品第二页| 精品福利一区二区三区免费视频| 亚洲最大成人网站| 91精品秘密在线观看| 69av在线视频| 曰批又黄又爽免费视频| 国产精品一区二区在线观看不卡| 精品人伦一区二区三区| 日本免费中文字幕在线| 亚洲成人av中文| 一级黄色特级片| 免费日韩一区二区三区| www国产精品视频| 亚洲男人的天堂在线视频| 久久福利视频一区二区| 久久av一区二区三区亚洲| 免费不卡视频| 欧美午夜精品在线| 国产一精品一aⅴ一免费| 欧美日韩第一| 98精品国产自产在线观看| 国产精品欧美亚洲| 久久久久久亚洲综合影院红桃| 欧美少妇一级片| 日韩国产激情| 亚洲精品91美女久久久久久久| 成人欧美一区二区三区黑人一 | 色爱综合网欧美| 98精品国产自产在线观看| 国产黄色片网站| 国产精品久久久久久福利一牛影视| 男女激情无遮挡| 日韩精品三级| 精品精品国产国产自在线| 日日夜夜狠狠操| 99re在线精品| 99er在线视频| 日本99精品| 久久久成人的性感天堂| av首页在线观看| 久久久综合激的五月天| 男的插女的下面视频| 激情五月综合婷婷| 久久精品99国产精品酒店日本| 97人妻一区二区精品视频| 99re这里只有精品首页| 少妇人妻在线视频| 成人免费直播在线| 久久久久久成人| www.国产麻豆| 一区二区三区不卡在线观看 | 国产精品视频中文字幕91| 性做久久久久久久| 亚洲天堂成人网| www.涩涩涩| 欧美在线电影| 国产精品久久久久久久久久免费 | 国产人成一区二区三区影院| 久久精品视频16| 亚洲综合视频在线播放| 91精品国产66| 日韩精品视频在线免费观看| 国产无套在线观看| eeuss鲁片一区二区三区在线观看| 久久综合久久久久| 国产乱论精品| 97不卡在线视频| 日韩国产福利| 欧洲国内综合视频| 麻豆视频免费在线播放| 美女视频黄a大片欧美| 亚洲高清视频一区二区| 国产一区二区三区四区五区3d| 中文字幕久热精品视频在线| 一级aaaa毛片| 亚洲欧美日韩国产中文在线| 伊人久久久久久久久| 亚洲激情午夜| 欧美连裤袜在线视频| 日韩av超清在线观看| 中文字幕亚洲欧美一区二区三区| 国产绿帽一区二区三区| 亚洲精品视频观看| 中文字幕一区二区人妻电影丶| 亚洲欧美日韩综合国产aⅴ| 欧美久久在线| 国产日本亚洲| 91av视频在线| 日本视频在线免费观看| 亚洲成**性毛茸茸| 最新中文字幕一区| 中文字幕一区在线观看视频| 丰满人妻一区二区三区大胸| 亚洲综合日韩| 免费看啪啪网站| 国产在线播放精品| 国产精品久久久精品| 黄色的视频在线观看| 亚洲日本欧美日韩高观看| 国产精品久久婷婷| 亚洲国产综合色| 国产探花视频在线播放| 国产69精品久久久久毛片| 午夜免费一区二区| 韩国在线视频一区| 亚洲春色在线视频| 久久a爱视频| 国产中文欧美精品| 亚洲精品中文字幕| 欧美大奶子在线| 撸视在线观看免费视频| 欧美办公室脚交xxxx| 日韩精品一区二区三区三区免费| 成年人免费高清视频| 18欧美亚洲精品| 9.1成人看片| 国产成a人亚洲精v品无码| 成人av免费在线播放| 亚洲精品一二三四五区| 亚洲国产免费看| av不卡在线免费观看| 精品国产一区二区三区香蕉沈先生| 亚洲一区和二区| 精品极品在线| 久久久国产精品免费| 亚洲aaaaaaa| 欧美成人aa大片| 亚洲在线视频播放| 欧美性猛交xxxx偷拍洗澡| 久草视频免费在线| 中文字幕日韩一区二区| 91视频在线网站| 成年人网站91| 无码人妻一区二区三区一| 麻豆国产精品官网| 日本成人在线免费视频| 亚洲三级免费| 国产www免费| 欧美高清一区| 黑人巨茎大战欧美白妇| 欧美韩日高清| 五码日韩精品一区二区三区视频| 欧美美女黄色| 国产日韩一区二区| av在线亚洲色图| 肥熟一91porny丨九色丨| 国产日韩一区二区三免费高清| 国产欧美亚洲精品| 国产精品亚洲成在人线| 国产精品三级在线| 日韩av免费| 国产成人精品久久二区二区| 伊人久久精品一区二区三区| 国产91成人在在线播放| 欧美办公室脚交xxxx| 91精品国产99久久久久久| 免费av不卡在线观看| 欧美精品www| 都市激情久久综合| 97久久久久久| 天天综合av| 日本电影亚洲天堂| 亚洲精品.com| 国产精品一区二区三区久久久| 亚瑟国产精品| 91最新国产视频| 伊人久久亚洲| 加勒比在线一区二区三区观看| 日韩av系列| 日韩精品不卡| 国产精品国产三级国产在线观看| 最近免费观看高清韩国日本大全| 中出一区二区| 99视频在线免费播放| 久久国产毛片| 中文字幕亚洲欧洲| 国产传媒日韩欧美成人| 亚洲精品国产成人av在线| www日韩大片| 内射毛片内射国产夫妻| 亚洲欧美日韩电影| 亚洲免费激情视频| 欧洲精品一区二区| 国产哺乳奶水91在线播放| 欧美精品一区二区三区蜜桃| 精品推荐蜜桃传媒| 久久久成人av| 在线观看涩涩| 91综合免费在线| 伊人春色之综合网| 欧美 日韩 国产 在线观看 | 国产视频精品在线| av大全在线免费看| 欧美黑人巨大xxx极品| 超级碰碰久久| 亚洲999一在线观看www| 日韩欧美在线精品| www亚洲国产| 性娇小13――14欧美| 91亚洲精品久久久蜜桃借种| 成人av高清在线| 欧美人与性囗牲恔配| 亚洲一区二区不卡免费| 丰满熟女人妻一区二区三| 欧美成人一区二区三区片免费| 日韩电影在线观看完整版| 久久精品国产99国产精品澳门| 蜜桃av.网站在线观看| 91精品久久久久久久久久久久久久 | 欧美三级视频在线观看| 日韩在线观看视频网站| 日韩亚洲国产中文字幕| 韩日精品一区二区| 成人影片在线播放| 欧美高清视频手机在在线| www.亚洲天堂网| 国产a级毛片一区| av资源在线免费观看| 午夜精品成人在线视频| 国产乱淫a∨片免费视频| 日韩成人激情视频| 黄色精品免费看| 国产精品久久久久久久9999| 你懂的在线观看一区二区| 一二三在线视频| 久久精品72免费观看| 亚洲黄色免费视频| 精品日韩中文字幕| 亚洲精品一级片| 久久躁日日躁aaaaxxxx| 国产精品伦一区二区| 欧美精品一区二区三区四区五区| 在线精品亚洲| 日韩精品――色哟哟| 综合久久久久久| 伊人网站在线观看| 一区二区三区动漫| 久久久久久久| 鲁丝片一区二区三区| 99热免费精品| 奇米777第四色| 亚洲国产视频一区| 欧美 日韩 国产 在线| 久久97久久97精品免视看| 日本综合精品一区| 无颜之月在线看| 国产成人精品免费网站| 国产一二三区精品| 4438x成人网最大色成网站| 在线免费观看黄色| 国产日产久久高清欧美一区| 成人在线免费观看网站| 免费看黄色一级大片| 国产女人18毛片水真多成人如厕| 无码人妻精品一区二区三区不卡 | 日韩一卡二卡三卡四卡| 超碰在线观看免费版| 91在线视频导航| 欧美福利视频| 精品一区二区三区四区五区六区| 午夜伦欧美伦电影理论片| 亚洲欧美黄色片| 亚洲91精品在线| 清纯唯美亚洲经典中文字幕| 欧美v在线观看| 国产人成一区二区三区影院| 中文字幕视频在线播放| 日韩在线播放一区| 日韩一区二区三区在线看| 欧美乱做爰xxxⅹ久久久| av在线综合网| 久久精品偷拍视频| 久久久精品久久久久| 日韩中文字幕| xxxx18hd亚洲hd捆绑| 久久久久久久综合| 中文有码在线播放| 久久九九免费视频| 免费看成人人体视频| 国产小视频精品| 亚洲免费色视频| 人妻无码中文字幕| 国产精品久久久久久影视| 一区二区三区四区在线观看国产日韩 | 欧美gay囗交囗交| 亚洲国产精品www| 国产成人在线视频网站| 日韩精品在线观看免费| 丝袜一区二区三区| 国产成人精品亚洲线观看| 999精品网站| 有坂深雪av一区二区精品| 图片区 小说区 区 亚洲五月| 国产精品444| 欧美精品二区| 久久久久久久久久久久| 欧美一级黄色大片| 免费电影日韩网站| 丰满人妻一区二区三区53号| 久久精品夜夜夜夜久久| 99久久国产热无码精品免费| 国产91精品不卡视频| 在线电影一区二区| 一卡二卡三卡四卡| 日韩欧美aaaaaa| 成人h在线观看| 青青青青草视频| 亚洲天堂av一区| 国产在线黄色| 国内精品视频在线播放|