青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數(shù)據(jù)加載中……

嵌入式數(shù)據(jù)庫系統(tǒng)Berkeley DB(+)

http://www.360doc.com/content/06/0116/11/2459_59098.shtml

 

 

級別: 初級

施聰, 高級程序員、網(wǎng)絡(luò)設(shè)計師

2005 4 01

Berkeley DB是歷史悠久的嵌入式數(shù)據(jù)庫系統(tǒng),主要應(yīng)用在UNIX/LINUX操作系統(tǒng)上,其設(shè)計思想是簡單、小巧、可靠、高性能。本文是對DB開發(fā)的一個入門級指南,重點討論了DB的核心數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)訪問算法,并通過實際的代碼演示如何使用DB。最后有一個對DB的簡單總結(jié),并提出作者對工具選擇的一些感想。

前言

UNIX/LINUX平臺下的數(shù)據(jù)庫種類非常多,參考資料1中列舉了其中的大部分。通常,我們在設(shè)計UNIX/LINUX平臺下的應(yīng)用軟件時,如果數(shù)據(jù)種類繁多,數(shù)據(jù)與數(shù)據(jù)之間關(guān)系比較復(fù)雜,就會選用一些大型的企業(yè)級數(shù)據(jù)庫系統(tǒng),如DB2ORACLESYBASE等,如果軟件規(guī)模不大,就傾向選用如MYSQLPOSTGRESQL等中小型數(shù)據(jù)庫。例如使用PHP/PERL + MYSQL/POSTGRESQL設(shè)計網(wǎng)站基本上是一個很常規(guī)的做法。但是,當(dāng)應(yīng)用軟件管理的數(shù)據(jù)類型較少(特別注意:這并不是說需要管理的數(shù)據(jù)量小),數(shù)據(jù)管理本身不復(fù)雜,且對數(shù)據(jù)操作要求高效率,則由大名鼎鼎的Berkeley(美國加州大學(xué)伯克利分校)開發(fā)的 Berkeley DB可能是一個很明智的選擇。

DB綜述

DB最初開發(fā)的目的是以新的HASH訪問算法來代替舊的hsearch函數(shù)和大量的dbm實現(xiàn)(如AT&TdbmBerkeleyndbmGNU項目的gdbm,DB的第一個發(fā)行版在1991年出現(xiàn),當(dāng)時還包含了B+樹數(shù)據(jù)訪問算法。在1992年,BSD UNIX4.4發(fā)行版中包含了DB1.85版。基本上認(rèn)為這是DB的第一個正式版。在1996年中期,Sleepycat軟件公司成立,提供對DB的商業(yè)支持。在這以后,DB得到了廣泛的應(yīng)用,當(dāng)前最新版本是4.3.27

DB支持幾乎所有的現(xiàn)代操作系統(tǒng),如LINUXUNIXWINDOWS等,也提供了豐富的應(yīng)用程序接口,支持CC++JAVAPERLTCLPYTHONPHP等。DB的應(yīng)用十分廣泛,在很多知名的軟件中都能看到其身影。例如參考資料2中作者談到利用DBLINUX下實現(xiàn)內(nèi)核級文件系統(tǒng);參考資料3中通過實際測試數(shù)據(jù)說明DB提高了OPENLDAP的效率。LINUX下的軟件包管理器RPM也使用DB管理軟件包相關(guān)數(shù)據(jù),可以使用命令file查看RPM數(shù)據(jù)目錄/var/lib/rpm下的文件,則有形式如下的輸出:

Dirnames: Berkeley DB (Btree, version 9, native byte-order)
Filemd5s: Berkeley DB (Hash, version 8, native byte-order)

值得注意的是DB是嵌入式數(shù)據(jù)庫系統(tǒng),而不是常見的關(guān)系/對象型數(shù)據(jù)庫,對SQL語言不支持,也不提供數(shù)據(jù)庫常見的高級功能,如存儲過程,觸發(fā)器等。

 

 

 

DB的設(shè)計思想

DB的設(shè)計思想是簡單、小巧、可靠、高性能。如果說一些主流數(shù)據(jù)庫系統(tǒng)是大而全的話,那么DB就可稱為小而精。DB提供了一系列應(yīng)用程序接口(API),調(diào)用本身很簡單,應(yīng)用程序和DB所提供的庫在一起編譯成為可執(zhí)行程序。這種方式從兩方面極大提高了DB的效率。第一:DB庫和應(yīng)用程序運行在同一個地址空間,沒有客戶端程序和數(shù)據(jù)庫服務(wù)器之間昂貴的網(wǎng)絡(luò)通訊開銷,也沒有本地主機(jī)進(jìn)程之間的通訊;第二:不需要對SQL代碼解碼,對數(shù)據(jù)的訪問直截了當(dāng)。

DB對需要管理的數(shù)據(jù)看法很簡單,DB數(shù)據(jù)庫包含若干條記錄,每一個記錄由關(guān)鍵字和數(shù)據(jù)(KEY/VALUE)構(gòu)成。數(shù)據(jù)可以是簡單的數(shù)據(jù)類型,也可以是復(fù)雜的數(shù)據(jù)類型,例如C語言中結(jié)構(gòu)。DB對數(shù)據(jù)類型不做任何解釋, 完全由程序員自行處理,典型的C語言指針的"自由"風(fēng)格。如果把記錄看成一個有n個字段的表,那么第1個字段為表的主鍵,第2--n個字段對應(yīng)了其它數(shù)據(jù)。DB應(yīng)用程序通常使用多個DB數(shù)據(jù)庫,從某種意義上看,也就是關(guān)系數(shù)據(jù)庫中的多個表。DB庫非常緊湊,不超過500K,但可以管理大至256T的數(shù)據(jù)量。

DB的設(shè)計充分體現(xiàn)了UNIX的基于工具的哲學(xué),即若干簡單工具的組合可以實現(xiàn)強(qiáng)大的功能。DB的每一個基礎(chǔ)功能模塊都被設(shè)計為獨立的,也即意味著其使用領(lǐng)域并不局限于DB本身。例如加鎖子系統(tǒng)可以用于非DB應(yīng)用程序的通用操作,內(nèi)存共享緩沖池子系統(tǒng)可以用于在內(nèi)存中基于頁面的文件緩沖。

 

 

 

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

數(shù)據(jù)庫句柄結(jié)構(gòu)DB:包含了若干描述數(shù)據(jù)庫屬性的參數(shù),如數(shù)據(jù)庫訪問方法類型、邏輯頁面大小、數(shù)據(jù)庫名稱等;同時,DB結(jié)構(gòu)中包含了大量的數(shù)據(jù)庫處理函數(shù)指針,大多數(shù)形式為 (*dosomething(DB *, arg1, arg2, …)。其中最重要的有open,close,put,get等函數(shù)。

數(shù)據(jù)庫記錄結(jié)構(gòu)DBTDB中的記錄由關(guān)鍵字和數(shù)據(jù)構(gòu)成,關(guān)鍵字和數(shù)據(jù)都用結(jié)構(gòu)DBT表示。實際上完全可以把關(guān)鍵字看成特殊的數(shù)據(jù)。結(jié)構(gòu)中最重要的兩個字段是 void * datau_int32_t size,分別對應(yīng)數(shù)據(jù)本身和數(shù)據(jù)的長度。

數(shù)據(jù)庫游標(biāo)結(jié)構(gòu)DBC:游標(biāo)(cursor)是數(shù)據(jù)庫應(yīng)用中常見概念,其本質(zhì)上就是一個關(guān)于特定記錄的遍歷器。注意到DB支持多重記錄(duplicate records),即多條記錄有相同關(guān)鍵字,在對多重記錄的處理中,使用游標(biāo)是最容易的方式。

數(shù)據(jù)庫環(huán)境句柄結(jié)構(gòu)DB_ENV:環(huán)境在DB中屬于高級特性,本質(zhì)上看,環(huán)境是多個數(shù)據(jù)庫的包裝器。當(dāng)一個或多個數(shù)據(jù)庫在環(huán)境中打開后,環(huán)境可以為這些數(shù)據(jù)庫提供多種子系統(tǒng)服務(wù),例如多線/進(jìn)程處理支持、事務(wù)處理支持、高性能支持、日志恢復(fù)支持等。

DB中核心數(shù)據(jù)結(jié)構(gòu)在使用前都要初始化,隨后可以調(diào)用結(jié)構(gòu)中的函數(shù)(指針)完成各種操作,最后必須關(guān)閉數(shù)據(jù)結(jié)構(gòu)。從設(shè)計思想的層面上看,這種設(shè)計方法是利用面向過程語言實現(xiàn)面對對象編程的一個典范。

 

 

 

DB數(shù)據(jù)訪問算法

在數(shù)據(jù)庫領(lǐng)域中,數(shù)據(jù)訪問算法對應(yīng)了數(shù)據(jù)在硬盤上的存儲格式和操作方法。在編寫應(yīng)用程序時,選擇合適的算法可能會在運算速度上提高1個甚至多個數(shù)量級。大多數(shù)數(shù)據(jù)庫都選用B+樹算法,DB也不例外,同時還支持HASH算法、Recno算法和Queue算法。接下來,我們將討論這些算法的特點以及如何根據(jù)需要存儲數(shù)據(jù)的特點進(jìn)行選擇。

B+樹算法:B+樹是一個平衡樹,關(guān)鍵字有序存儲,并且其結(jié)構(gòu)能隨數(shù)據(jù)的插入和刪除進(jìn)行動態(tài)調(diào)整。為了代碼的簡單,DB沒有實現(xiàn)對關(guān)鍵字的前綴碼壓縮。B+樹支持對數(shù)據(jù)查詢、插入、刪除的常數(shù)級速度。關(guān)鍵字可以為任意的數(shù)據(jù)結(jié)構(gòu)。

HASH算法:DB中實際使用的是擴(kuò)展線性HASH算法(extended linear hashing),可以根據(jù)HASH表的增長進(jìn)行適當(dāng)?shù)恼{(diào)整。關(guān)鍵字可以為任意的數(shù)據(jù)結(jié)構(gòu)。

Recno算法: 要求每一個記錄都有一個邏輯紀(jì)錄號,邏輯紀(jì)錄號由算法本身生成。實際上,這和關(guān)系型數(shù)據(jù)庫中邏輯主鍵通常定義為int AUTO型是同一個概念。Recho建立在B+樹算法之上,提供了一個存儲有序數(shù)據(jù)的接口。記錄的長度可以為定長或不定長。

Queue算法:和Recno方式接近, 只不過記錄的長度為定長。數(shù)據(jù)以定長記錄方式存儲在隊列中,插入操作把記錄插入到隊列的尾部,相比之下插入速度是最快的。

對算法的選擇首先要看關(guān)鍵字的類型,如果為復(fù)雜類型,則只能選擇B+樹或HASH算法,如果關(guān)鍵字為邏輯記錄號,則應(yīng)該選擇RecnoQueue算法。當(dāng)工作集關(guān)鍵字有序時,B+樹算法比較合適;如果工作集比較大且基本上關(guān)鍵字為隨機(jī)分布時,選擇HASH算法。Queue算法只能存儲定長的記錄,在高的并發(fā)處理情況下,Queue算法效率較高;如果是其它情況,則選擇Recno算法,Recno算法把數(shù)據(jù)存儲為平面文件格式。

 

 

 

 

DB常用函數(shù)使用范例

 
#include <db.h> 
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
 
/* DB的函數(shù)執(zhí)行完成后,返回0代表成功,否則失敗 */
void print_error(int ret)
{
        if(ret != 0)
               printf("ERROR: %s\n",db_strerror(ret));
}
 
/* 數(shù)據(jù)結(jié)構(gòu)DBT在使用前,應(yīng)首先初始化,否則編譯可通過但運行時報參數(shù)錯誤  */
void init_DBT(DBT * key, DBT * data)
{
        memset(key, 0, sizeof(DBT));
        memset(data, 0, sizeof(DBT));
}
 
void main(void)
{
        DB *dbp;           
        DBT key, data;
        u_int32_t flags;  
        int ret;
 
        char *fruit = "apple";
        int number = 15;
        
        typedef struct customer
        {
               int  c_id;
               char name[10];
               char address[20];
               int  age;
        } CUSTOMER;
        CUSTOMER cust; 
        int key_cust_c_id = 1;
 
        cust.c_id = 1;
        strncpy(cust.name, "javer", 9);
        strncpy(cust.address, "chengdu", 19);
        cust.age = 32;
 
        /* 首先創(chuàng)建數(shù)據(jù)庫句柄 */
        ret = db_create(&dbp, NULL, 0);
        print_error(ret);
        
        /* 創(chuàng)建數(shù)據(jù)庫標(biāo)志 */
        flags = DB_CREATE;    
 
        /* 創(chuàng)建一個名為single.db的數(shù)據(jù)庫,使用B+樹訪問算法,本段代碼演示對簡單數(shù)據(jù)類型的處理 */
        ret = dbp->open(dbp, NULL, "single.db", NULL, DB_BTREE, flags, 0); 
        print_error(ret);
 
        init_DBT(&key, &data);
        
        /* 分別對關(guān)鍵字和數(shù)據(jù)賦值和規(guī)定長度 */
        key.data = fruit;
        key.size = strlen(fruit) + 1;
        data.data = &number;
        data.size = sizeof(int);
 
        /* 把記錄寫入數(shù)據(jù)庫中,不允許覆蓋關(guān)鍵字相同的記錄 */
        ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE); 
        print_error(ret);
        
/* 手動把緩存中的數(shù)據(jù)刷新到硬盤文件中,實際上在關(guān)閉數(shù)據(jù)庫時,數(shù)據(jù)會被自動刷新 */
dbp->sync()
        
init_DBT(&key, &data);
 
        key.data = fruit;
        key.size = strlen(fruit) + 1;
        
        /* 從數(shù)據(jù)庫中查詢關(guān)鍵字為apple的記錄 */
        ret = dbp->get(dbp, NULL, &key, &data, 0);
        print_error(ret);
 
        /* 特別要注意數(shù)據(jù)結(jié)構(gòu)DBT的字段datavoid *型,所以在對data賦值和取值時,要做必要的類型轉(zhuǎn)換。 */
        printf("The number = %d\n", *(int*)(data.data));
        
        if(dbp != NULL)
               dbp->close(dbp, 0); 
 
        ret = db_create(&dbp, NULL, 0);
        print_error(ret);
 
        flags = DB_CREATE;    
 
        /* 創(chuàng)建一個名為complex.db的數(shù)據(jù)庫,使用HASH訪問算法,本段代碼演示對復(fù)雜數(shù)據(jù)結(jié)構(gòu)的處理 */
        ret = dbp->open(dbp, NULL, "complex.db", NULL, DB_HASH, flags, 0); 
        print_error(ret);
 
        init_DBT(&key, &data);
 
        key.size = sizeof(int);
        key.data = &(cust.c_id);
 
        data.size = sizeof(CUSTOMER);
        data.data = &cust;
 
        ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE);
        print_error(ret);
        
        memset(&cust, 0, sizeof(CUSTOMER));
        
        key.size = sizeof(int);
        key.data = &key_cust_c_id;
 
        data.data = &cust;
        data.ulen = sizeof(CUSTOMER); 
        data.flags = DB_DBT_USERMEM;
 
        dbp->get(dbp, NULL, &key, &data, 0);
        print_error(ret);
        
        printf("c_id = %d name = %s address = %s age = %d\n", 
               cust.c_id, cust.name, cust.address, cust.age);
        
        if(dbp != NULL)
               dbp->close(dbp, 0); 
}
 

 

 

 

DB游標(biāo)使用范例

游標(biāo)是依賴于數(shù)據(jù)庫句柄的,應(yīng)用程序代碼框架如下:

 
        /* 定義一個游標(biāo)變量 */
        DBC * cur;
        /* 首先打開數(shù)據(jù)庫,再打開游標(biāo) */
        dbp->open(dbp, ……);
        dbp->cursor(dbp, NULL, &cur, 0);
        
        /* do something with cursor */
 
        /* 首先關(guān)閉,在關(guān)閉數(shù)據(jù)庫 */
        cur->c_close(cur);
        dbp->close(dbp, 0);
        

 

在游標(biāo)打開后,可以以多種方式遍歷特定記錄。

 
               Memset(&key, 0, sizeof(DBT));
        Memset(&data, 0, sizeof(DBT));
 
        /* 因為KEYDATA為空,則游標(biāo)遍歷整個數(shù)據(jù)庫記錄 */
        While((ret = cur->c_get(cur, &key, &data, DB_NEXT)) == 0)
        {
               /* do something with key and data */
        }
        

 

當(dāng)想查詢特定關(guān)鍵字對應(yīng)的記錄,則應(yīng)對關(guān)鍵字賦值,并把cur->c_get()函數(shù)中標(biāo)志位設(shè)置為DB_SET。例如:

 
               key.data = "xxxxx";
        key.size =  XXX;
        While((ret = cur->c_get(cur, &key, &data, DB_SET)) == 0)
        {
               /* do something with key and data */
        }
        

 

游標(biāo)的作用還有很多,如查詢多重記錄,插入/修改/刪除記錄等。

 

 

 

DB環(huán)境使用范例

本文前面已說明環(huán)境是DB數(shù)據(jù)庫的包裝器,提供多種高級功能。應(yīng)用程序代碼框架如下:

 
               /* 定義一個環(huán)境變量,并創(chuàng)建 */
        DB_ENV *dbenv;
        db_env_create(&dbenv, 0);
        
/* 在環(huán)境打開之前,可調(diào)用形式為dbenv->set_XXX()的若干函數(shù)設(shè)置環(huán)境 */
        /* 通知DB使用Rijndael加密算法(參考資料4)對數(shù)據(jù)進(jìn)行處理 */
dbenv->set_encrypt(dbenv, "encrypt_string", DB_ENCRYPT_AES);
        /* 設(shè)置DB的緩存為5M */
dbenv->set_cachesize(dbenv, 0, 5 * 1024 * 1024, 0);
/* 設(shè)置DB查找數(shù)據(jù)庫文件的目錄 */
        dbenv->set_data_dir(dbenv, "/usr/javer/work_db");
 
        /* 打開數(shù)據(jù)庫環(huán)境,注意后四個標(biāo)志分別指示DB啟動日志、加鎖、緩存、事務(wù)處理子系統(tǒng) */
        dbenv->open(dbenv,home,DB_CREATE|DB_INIT_LOG|DB_INIT_LOCK| DB_INIT_MPOOL|DB_INIT_TXN, 0)
        
        /* 在環(huán)境打開后,則可以打開若干個數(shù)據(jù)庫,所有數(shù)據(jù)庫的處理都在環(huán)境的控制和保護(hù)中。注意db_create函數(shù)的第二個參數(shù)是環(huán)境變量 */
 
db_create(&dbp1, dbenv, 0)
dbp1->open(dbp1, ……);
 
db_create(&dbp2, dbenv, 0)
dbp1->open(dbp2, ……);
 
        /* do something with the database */
 
        /* 最后首先關(guān)閉打開的數(shù)據(jù)庫,再關(guān)閉環(huán)境 */
        dbp2->close(dbp2, 0);
        dbp1->close(dbp1, 0);
        dbenv->close(dbenv, 0);
        

 

 

 

DB軟件的安裝和編譯

DB的官方站點http://www.sleepycat.com/下載最新的軟件包db-4.3.27.tar.gz,解壓到工作目錄,進(jìn)入該目錄,依次執(zhí)行下列三條命令即可。

 
../dist/configure
make
make install

 

執(zhí)行make uninstall,則可卸載已安裝的DB軟件。

DB缺省把庫和頭文件安裝在目錄/usr/local/BerkeleyDB.4.3/下,使用gcc test.c -ggdb -I/usr/local/BerkeleyDB.4.3/include/ -L/usr/local/BerkeleyDB.4.3/lib/ -ldb -lpthread就可正確編譯程序。如果讀者的測試主機(jī)操作系統(tǒng)為RED HAT9,則安裝的DB版本可能是4.0。特別要注意到這兩個版本的庫是不兼容的。例如打開數(shù)據(jù)庫函數(shù)DB->open(),4.0版本中入?yún)?span lang="EN-US">6個,而在4.3版中則為7個(可自行比較兩個庫的頭文件db.hDB->open函數(shù)的定義)。因為在DB相關(guān)的應(yīng)用程序中,open函數(shù)基本上都是要執(zhí)行的,所以如果函數(shù)和版本不匹配,編譯肯定會出錯。當(dāng)然,編譯完成后,可以使用命令ldd查看庫的依賴關(guān)系。

 

 

 

總結(jié)

DB是一個具有工業(yè)強(qiáng)度的嵌入式數(shù)據(jù)庫系統(tǒng),數(shù)據(jù)處理的效率很高。DB功能的穩(wěn)定性歷經(jīng)時間的考驗,在大量應(yīng)用程序中使用便是明證。可以想見,在同等代碼質(zhì)量的條件下,軟件的BUG數(shù)和代碼的長度是成正比的,相對幾十兆、幾百兆大型數(shù)據(jù)庫軟件,DB的只有不到500K的大小!

從實現(xiàn)功能上看,DB是輕量級數(shù)據(jù)庫系統(tǒng),或可稱為"" 輕量級數(shù)據(jù)庫系統(tǒng)。但是,我認(rèn)為不能因此而心存輕視之意,所謂"尺有所短,寸有所長",以絕對角度比較工具之間的好壞是沒有什么意義的,關(guān)鍵在于對工具的選擇和運用(似乎可以參考一下極限編程的思想)。也許,正確的"表達(dá)范式"應(yīng)該是:在當(dāng)前應(yīng)用背景下,選擇這種工具是最合適的。

 

 

 

參考資料

·                                 Linux SQL Databases and Tools

·                                 Implementing a File System with the Berkeley DB

·                                 Performance Improvement of OpenLDAP Transactional Backend

·                                 Rijndael加密算法官方站點

 

 

 

關(guān)于作者

clip_image002

 

施聰,成都人,高級程序員、網(wǎng)絡(luò)設(shè)計師。從事基于UNIX/LINUX下的c/c++程序設(shè)計和數(shù)據(jù)庫建模工作已10年。可通過javer@163.commemncmp@yahoo.com.cn和他聯(lián)系。

 

posted on 2011-08-28 20:27 肥仔 閱讀(503) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美视频专区一二在线观看| 一区二区三区www| 一本色道88久久加勒比精品| 国产一区欧美| 激情综合在线| 亚洲人成高清| 亚洲欧美一级二级三级| 久久乐国产精品| 亚洲国产精品一区二区久| 欧美国产高潮xxxx1819| 亚洲精品久久在线| 性久久久久久久久久久久| 欧美专区亚洲专区| 男人的天堂亚洲| 欧美午夜片欧美片在线观看| 国产视频在线观看一区| 亚洲黑丝一区二区| 亚洲欧美日韩精品在线| 老司机精品福利视频| 日韩视频永久免费| 久久aⅴ乱码一区二区三区| 欧美激情精品久久久久| 国产精品中文字幕欧美| 最新日韩在线| 欧美专区福利在线| 国精产品99永久一区一区| 亚洲大片一区二区三区| 亚洲女同性videos| 亚洲丰满少妇videoshd| 亚洲欧美日韩国产成人| 欧美xart系列高清| 国产一区二区久久精品| 在线亚洲精品| 亚洲高清视频的网址| 亚洲制服少妇| 欧美日韩性视频在线| 影音先锋日韩资源| 久久国产乱子精品免费女| 亚洲伦理在线| 免费人成网站在线观看欧美高清| 国产精品爽爽爽| 日韩视频免费在线| 欧美/亚洲一区| 欧美一区日本一区韩国一区| 国产精品久久久久久久7电影 | 欧美成人精精品一区二区频| 一区二区三区四区蜜桃| 欧美国产日韩免费| 亚洲国产欧美不卡在线观看| 久久精品一区二区| 一区二区三区日韩精品视频| 欧美成人激情视频免费观看| 韩国一区二区三区在线观看| 欧美亚洲三级| 亚洲视频播放| 欧美性理论片在线观看片免费| 日韩一级大片在线| 亚洲免费大片| 国产精品www| 午夜一区二区三区不卡视频| 亚洲天堂激情| 国产婷婷色一区二区三区四区| 欧美一站二站| 欧美尤物一区| 亚洲高清资源| 亚洲人成艺术| 国产精品www994| 欧美一区二区精美| 久久激情综合| 亚洲欧洲视频在线| 日韩一级片网址| 国产精品一二| 久热爱精品视频线路一| 六月婷婷一区| 在线亚洲欧美视频| 亚洲女性裸体视频| 国户精品久久久久久久久久久不卡| 久久天天躁夜夜躁狠狠躁2022 | 久久电影一区| 久久久久久久综合日本| 亚洲激情校园春色| 亚洲图片在线观看| 亚洲欧美日韩在线| 伊人久久婷婷色综合98网| 欧美国产欧美亚州国产日韩mv天天看完整| 久久综合狠狠| 亚洲男人第一网站| 久久久久久网址| 亚洲美女在线观看| 亚洲欧美综合国产精品一区| 亚洲国产精品99久久久久久久久| 亚洲精品一二三区| 国内成+人亚洲+欧美+综合在线| 欧美成人小视频| 国产精品久久久久久久久久免费看| 久久久国产精品一区二区三区| 欧美.www| 久久精品人人做人人综合| 欧美激情欧美激情在线五月| 久久不射2019中文字幕| 欧美大片一区| 久久亚洲高清| 国产精品视频一二| 亚洲精选在线| 亚洲国产成人精品女人久久久 | 欧美国产欧美亚洲国产日韩mv天天看完整 | 巨乳诱惑日韩免费av| 欧美日韩1080p| 久久天天躁狠狠躁夜夜av| 欧美日韩国产综合网| 免费高清在线视频一区·| 欧美午夜免费电影| 亚洲国产日韩一区| 在线观看亚洲精品视频| 亚洲视频久久| 夜夜嗨av一区二区三区| 久久中文字幕一区| 久久综合激情| 国产资源精品在线观看| 中日韩高清电影网| 日韩一级不卡| 欧美大学生性色视频| 欧美 日韩 国产精品免费观看| 国产日韩精品入口| 亚洲你懂的在线视频| 亚洲一级二级| 欧美视频成人| 亚洲视频一区| 亚洲欧美日韩直播| 国产精品成人在线观看| 一区二区欧美视频| 亚洲欧美日韩国产成人| 欧美先锋影音| 一本久久综合| 亚洲欧美日本伦理| 国产精品久久久久久av下载红粉 | 欧美区高清在线| 亚洲电影免费观看高清完整版在线| 国产主播在线一区| 久久综合国产精品| 免费影视亚洲| 亚洲欧洲综合| 欧美精品一区二区三区四区| 亚洲精品国精品久久99热| 夜夜爽av福利精品导航 | 国产精品久久久久久久久久直播| 99精品欧美| 午夜国产不卡在线观看视频| 国产精品羞羞答答xxdd| 欧美一区二区免费| 久久综合狠狠综合久久综合88| 原创国产精品91| 欧美多人爱爱视频网站| 亚洲理伦电影| 欧美在现视频| 亚洲国产老妈| 欧美视频一区二区三区| 欧美一区二区三区在线看 | 国产精品区免费视频| 亚洲欧美日韩另类| 欧美 日韩 国产 一区| 99成人在线| 国产欧美日韩视频| 奶水喷射视频一区| 亚洲一区二区在线播放| 久热国产精品| 亚洲影院在线| 亚洲国产精品久久91精品| 欧美调教vk| 久久婷婷国产综合精品青草 | 久久久国产一区二区| 亚洲国产小视频| 国产精品美女久久久久久免费| 久久激情五月丁香伊人| 日韩图片一区| 免费一区二区三区| 欧美一区二区在线看| 亚洲精品色图| 国产视频在线一区二区 | 久久婷婷综合激情| 亚洲天堂av图片| 91久久黄色| 免费一级欧美在线大片| 午夜精品一区二区三区在线 | 久久久噜噜噜久久中文字免| 日韩一区二区久久| 亚洲高清自拍| 激情另类综合| 国产欧美日韩麻豆91| 欧美日韩久久| 你懂的视频欧美| 欧美在线观看天堂一区二区三区| 最新国产成人av网站网址麻豆| 久久国产精品久久久| 亚洲一区免费观看| 久久久青草婷婷精品综合日韩| 在线亚洲美日韩| 国产欧美日韩视频在线观看| 久色婷婷小香蕉久久| 午夜一区在线|