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

用Python寫一個NoSQL數據庫

開發 后端 其他數據庫
在本文, 我們將會通過純 Python (我比較喜歡叫它, “輕結構化的偽代碼”) 寫一個 NoSQL 數據庫來回答這些問題。

 NoSQL 這個詞在近些年正變得隨處可見. 但是到底 “NoSQL” 指的是什么? 它是如何并且為什么這么有用? 在本文, 我們將會通過純 Python (我比較喜歡叫它, “輕結構化的偽代碼”) 寫一個 NoSQL 數據庫來回答這些問題.

[[399458]]

OldSQL

很多情況下, SQL 已經成為 “數據庫” (database) 的一個同義詞. 實際上, SQL 是 Strctured Query Language 的首字母縮寫, 而并非指數據庫技術本身. 更確切地說, 它所指的是從 RDBMS (關系型數據庫管理系統, Relational Database Management System ) 中檢索數據的一門語言. MySQL, MS SQL Server 和 Oracle 都屬于 RDBMS 的其中一員.

RDBMS 中的 R, 即 “Relational” (有關系,關聯的), 是其中內容最豐富的部分. 數據通過 表 (table) 進行組織, 每張表都是一些由 類型 (type) 相關聯的列 (column) 構成. 所有表, 列及其類的類型被稱為數據庫的 schema (架構或模式). schema 通過每張表的描述信息完整刻畫了數據庫的結構. 比如, 一張叫做 Car 的表可能有以下一些列:

  •  Make: a string
  •  Model: a string
  •  Year: a four-digit number; alternatively, a date
  •  Color: a string
  •  VIN(Vehicle Identification Number): a string

在一張表中, 每個單一的條目叫做一 行 (row), 或者一條 記錄 (record). 為了區分每條記錄, 通常會定義一個 主鍵 (primary key). 表中的 主鍵 是其中一列 , 它能夠唯一標識每一行. 在表 Car 中, VIN 是一個天然的主鍵選擇, 因為它能夠保證每輛車具有唯一的標識. 兩個不同的行可能會在 Make, Model, Year 和 Color 列上有相同的值, 但是對于不同的車而言, 肯定會有不同的 VIN. 反之, 只要兩行擁有同一個 VIN, 我們不必去檢查其他列就可以認為這兩行指的的就是同一輛車.

Querying

SQL 能夠讓我們通過對數據庫進行 query (查詢) 來獲取有用的信息. 查詢 簡單來說, 查詢就是用一個結構化語言向 RDBMS 提問, 并將其返回的行解釋為問題的答案. 假設數據庫表示了美國所有的注冊車輛, 為了獲取 所有的 記錄, 我們可以通過在數據庫上進行如下的 SQL 查詢 :

將 SQL 大致翻譯成中文:

  •  “SELECT”: “向我展示”
  •  “Make, Model”: “Make 和 Model 的值”
  •  “FROM Car”: “對表 Car 中的每一行”

也就是, “向我展示表 Car 每一行中 Make 和 Model 的值”. 執行查詢后, 我們將會得到一些查詢的結果, 其中每個都是 Make 和 Model. 如果我們僅關心在 1994 年注冊的車的顏色, 那么可以:

此時, 我們會得到一個類似如下的列表:

最后, 我們可以通過使用表的 (primary key) 主鍵 , 這里就是 VIN 來指定查詢一輛車:

上面這條查詢語句會返回所指定車輛的屬性信息.

主鍵被定義為唯一不可重復的. 也就是說, 帶有某一指定 VIN 的車輛在表中至多只能出現一次. 這一點非常重要,為什么? 來看一個例子:

Relations

假設我們正在經營一個汽車修理的業務. 除了其他一些必要的事情, 我們還需要追蹤一輛車的服務歷史, 即在該輛車上所有的修整記錄. 那么我們可能會創建包含以下一些列的 ServiceHistory 表:

VIN | Make | Model | Year | Color | Service Performed | Mechanic | Price | Date

這樣, 每次當車輛維修以后, 我們就在表中添加新的一行, 并寫入該次服務我們做了一些什么事情, 是哪位維修工, 花費多少和服務時間等.

但是等一下, 我們都知道,對于同一輛車而言,所有車輛自身信息有關的列是不變的。也就是說,如果把我的 Black 2014 Lexus RX 350 修整 10 次的話, 那么即使 Make, Model, Year 和 Color 這些信息并不會改變,每一次仍然重復記錄了這些信息. 與無效的重復記錄相比, 一個更合理的做法是對此類信息只存儲一次, 并在有需要的時候進行查詢。

那么該怎么做呢?我們可以創建第二張表:Vehicle , 它有如下一些列:

VIN | Make | Model | Year | Color

這樣一來, 對于 ServiceHistory 表, 我們可以精簡為如下一些列:

VIN | Service Performed | Mechanic | Price | Date

你可能會問,為什么 VIN 會在兩張表中同時出現?因為我們需要有一個方式來確認在 ServiceHistory 表的 這 輛車指的就是 Vehicle 表中的 那 輛車, 也就是需要確認兩張表中的兩條記錄所表示的是同一輛車。這樣的話,我們僅需要為每輛車的自身信息存儲一次即可. 每次當車輛過來維修的時候, 我們就在 ServiceHistory 表中創建新的一行, 而不必在 Vehicle 表中添加新的記錄。畢竟, 它們指的是同一輛車。

我們可以通過 SQL 查詢語句來展開 Vehicle 與 ServiceHistory 兩張表中包含的隱式關系:

該查詢旨在查找維修費用大于 $75.00 的所有車輛的 Model 和 Year. 注意到我們是通過匹配 Vehicle 與 ServiceHistory 表中的 VIN 值來篩選滿足條件的記錄. 返回的將是兩張表中符合條件的一些記錄, 而 “Vehicle.Model” 與 “Vehicle.Year” , 表示我們只想要 Vehicle 表中的這兩列.

如果我們的數據庫沒有 索引 (indexes) (正確的應該是 indices), 上面的查詢就需要執行 表掃描 (table scan) 來定位匹配查詢要求的行。table scan 是按照順序對表中的每一行進行依次檢查, 而這通常會非常的慢。實際上, table scan 實際上是所有查詢中最慢的。

可以通過對列加索引來避免掃描表。我們可以把索引看做一種數據結構, 它能夠通過預排序讓我們在被索引的列上快速地找到一個指定的值 (或指定范圍內的一些值). 也就是說, 如果我們在 Price 列上有一個索引, 那么就不需要一行一行地對整個表進行掃描來判斷其價格是否大于 75.00, 而是只需要使用包含在索引中的信息 “跳” 到第一個價格高于 75.00 的那一行, 并返回隨后的每一行(由于索引是有序的, 因此這些行的價格至少是 75.00)。

當應對大量的數據時, 索引是提高查詢速度不可或缺的一個工具。當然, 跟所有的事情一樣,有得必有失, 使用索引會導致一些額外的消耗:索引的數據結構會消耗內存,而這些內存本可用于數據庫中存儲數據。這就需要我們權衡其利弊,尋求一個折中的辦法, 但是為經常查詢的列加索引是 非常 常見的做法。

The Clear Box

得益于數據庫能夠檢查一張表的 schema (描述了每列包含了什么類型的數據), 像索引這樣的高級特性才能夠實現, 并且能夠基于數據做出一個合理的決策。也就是說, 對于一個數據庫而言, 一張表其實是一個 “黑盒” (或者說透明的盒子) 的反義詞?

當我們談到 NoSQL 數據庫的時候要牢牢記住這一點。當涉及 query 不同類型數據庫引擎的能力時, 這也是其中非常重要的一部分。

Schemas

我們已經知道, 一張表的 schema , 描述了列的名字及其所包含數據的類型。它還包括了其他一些信息, 比如哪些列可以為空, 哪些列不允許有重復值, 以及其他對表中列的所有限制信息。在任意時刻一張表只能有一個 schema, 并且 表中的所有行必須遵守 schema 的規定 。

這是一個非常重要的約束條件。假設你有一張數據庫的表, 里面有數以百萬計的消費者信息。你的銷售團隊想要添加額外的一些信息 (比如, 用戶的年齡), 以期提高他們郵件營銷算法的準確度。這就需要來 alter (更改) 現有的表 – 添加新的一列。我們還需要決定是否表中的每一行都要求該列必須有一個值。通常情況下, 讓一個列有值是十分有道理的, 但是這么做的話可能會需要一些我們無法輕易獲得的信息(比如數據庫中每個用戶的年齡)。因此在這個層面上,也需要有些權衡之策。

此外,對一個大型數據庫做一些改變通常并不是一件小事。為了以防出現錯誤,有一個回滾方案非常重要。但即使是如此,一旦當 schema 做出改變后,我們也并不總是能夠撤銷這些變動。schema 的維護可能是 DBA 工作中最困難的部分之一。

Key/Value Stores

在 “NoSQL” 這個詞存在前, 像 memcached 這樣的 鍵/值 數據存儲 (Key/Value Data Stores) 無須 table schema 也可提供數據存儲的功能。實際上, 在 K/V 存儲時, 根本沒有 “表 (table)” 的概念。只有 鍵 (keys) 與 值 (values) . 如果鍵值存儲聽起來比較熟悉的話, 那可能是因為這個概念的構建原則與 Python 的 dict 與 set 相一致: 使用 hash table (哈希表) 來提供基于鍵的快速數據查詢。一個基于 Python 的最原始的 NoSQL 數據庫, 簡單來說就是一個大的字典 (dictionary) .

為了理解它的工作原理,親自動手寫一個吧!首先來看一下一些簡單的設計想法:

  •  一個 Python 的 dict 作為主要的數據存儲
  •  僅支持 string 類型作為鍵 (key)
  •  支持存儲 integer, string 和 list
  •  一個使用 ASCLL string 的簡單 TCP/IP 服務器用來傳遞消息
  •  一些像 INCREMENT, DELETE , APPEND 和 STATS 這樣的高級命令 (command)

有一個基于 ASCII 的 TCP/IP 接口的數據存儲有一個好處, 那就是我們使用簡單的 telnet 程序即可與服務器進行交互, 并不需要特殊的客戶端 (盡管這是一個非常好的練習并且只需要 15 行代碼即可完成)。

對于我們發送到服務器及其它的返回信息,我們需要一個 “有線格式”。下面是一個簡單的說明:

Commands Supported

  •  PUT

參數:Key, Value

目的:向數據庫中插入一條新的條目 (entry)

  •  GET

參數:Key

目的:從數據庫中檢索一個已存儲的值

  •  PUTLIST

參數:Key, Value

目的:向數據庫中插入一個新的列表條目

  •  APPEND

參數:Key, Value

目的:向數據庫中一個已有的列表添加一個新的元素

  •  INCREMENT

參數:key

目的:增長數據庫的中一個整型值

  • DELETE

參數:Key

目的:從數據庫中刪除一個條目

  •  STATS

參數:無 (N/A)

目的:請求每個執行命令的 成功/失敗 的統計信息

現在我們來定義消息的自身結構。

Message Structure

1.Request Messages

一條 請求消息 (Request Message) 包含了一個命令(command),一個鍵 (key), 一個值 (value), 一個值的類型(type). 后三個取決于消息類型,是可選項, 非必須。; 被用作是分隔符。即使并沒有包含上述可選項, 但是在消息中仍然必須有三個 ; 字符。

  •  COMMAND 是上面列表中的命令之一
  •  KEY 是一個可以用作數據庫 key 的 string (可選)
  • VALUE 是數據庫中的一個 integer, list 或 string (可選) 

          list 可以被表示為一個用逗號分隔的一串 string, 比如說, “red, green, blue”

  •  VALUE TYPE 描述了 VALUE 應該被解釋為什么類型 

           可能的類型值有:INT, STRING, LIST

Examples

2.Reponse Messages

一個 響應消息 (Reponse Message) 包含了兩個部分, 通過 ; 進行分隔。第一個部分總是 True|False , 它取決于所執行的命令是否成功。 

第二個部分是命令消息 (command message), 當出現錯誤時,便會顯示錯誤信息。對于那些執行成功的命令,如果我們不想要默認的返回值(比如 PUT), 就會出現成功的信息。如果我們返回成功命令的值 (比如 GET), 那么第二個部分就會是自身值。

Examples

Show Me The Code!

我將會以塊狀摘要的形式來展示全部代碼。整個代碼不過 180 行,讀起來也不會花費很長時間。

Set Up

下面是我們服務器所需的一些樣板代碼:

很容易看到, 上面的只是一個包的導入和一些數據的初始化。

Set up(Cont’d)

接下來我會跳過一些代碼, 以便能夠繼續展示上面準備部分剩余的代碼。注意它涉及到了一些尚不存在的一些函數, 不過沒關系, 我們會在后面涉及。在完整版(將會呈現在最后)中, 所有內容都會被有序編排。這里是剩余的安裝代碼:

 

我們創建了 COMMAND_HANDLERS, 它常被稱為是一個 查找表 (look-up table) . COMMAND_HANDLERS 的工作是將命令與用于處理該命令的函數進行關聯起來。比如說, 如果我們收到一個 GET 命令, COMMAND_HANDLERS[command](key) 就等同于說 handle_get(key) . 記住,在 Python 中, 函數可以被認為是一個值,并且可以像其他任何值一樣被存儲在一個 dict 中。

在上面的代碼中, 雖然有些命令請求的參數相同,但是我仍決定分開處理每個命令。盡管可以簡單粗暴地強制所有的 handle_ 函數接受一個 key 和一個 value , 但是我希望這些處理函數條理能夠更加有條理, 更加容易測試,同時減少出現錯誤的可能性。

注意 socket 相關的代碼已是十分極簡。雖然整個服務器基于 TCP/IP 通信, 但是并沒有太多底層的網絡交互代碼。

最后還需要注意的一小點: DATA 字典, 因為這個點并不十分重要, 因而你很可能會遺漏它。DATA 就是實際用來存儲的 key-value pair, 正是它們實際構成了我們的數據庫。

Command Parser

下面來看一些 命令解析器 (command parser) , 它負責解釋接收到的消息:

這里我們可以看到發生了類型轉換 (type conversion). 如果希望值是一個 list, 我們可以通過對 string 調用 str.split(',') 來得到我們想要的值。對于int, 我們可以簡單地使用參數為 string 的 int() 即可。對于字符串與 str() 也是同樣的道理。

Command Handlers

下面是命令處理器 (command handler) 的代碼. 它們都十分直觀,易于理解。注意到雖然有很多的錯誤檢查, 但是也并不是面面俱到, 十分龐雜。在你閱讀的過程中,如果發現有任何錯誤請移步 這里 進行討論.

有兩點需要注意: 多重賦值 (multiple assignment) 和代碼重用. 有些函數僅僅是為了更加有邏輯性而對已有函數的簡單包裝而已, 比如 handle_get 和handle_getlist . 由于我們有時僅僅是需要一個已有函數的返回值,而其他時候卻需要檢查該函數到底返回了什么內容, 這時候就會使用 多重賦值 。

來看一下 handle_append . 如果我們嘗試調用 handle_get 但是 key 并不存在時, 那么我們簡單地返回 handle_get 所返回的內容。此外, 我們還希望能夠將 handle_get 返回的 tuple 作為一個單獨的返回值進行引用。那么當 key 不存在的時候, 我們就可以簡單地使用 return return_value .

如果它 確實存在 , 那么我們需要檢查該返回值。并且, 我們也希望能夠將 handle_get 的返回值作為單獨的變量進行引用。為了能夠處理上述兩種情況,同時考慮需要分開處理結果的情形,我們使用了多重賦值。如此一來, 就不必書寫多行代碼, 同時能夠保持代碼清晰。return_value = exists, list_value = handle_get(key) 能夠顯式地表明我們將要以至少兩種不同的方式引用 handle_get 的返回值。

How Is This a Database?

上面的程序顯然并非一個 RDBMS, 但卻絕對稱得上是一個 NoSQL 數據庫。它如此易于創建的原因是我們并沒有任何與 數據 (data) 的實際交互。我們只是做了極簡的類型檢查,存儲用戶所發送的任何內容。如果需要存儲更加結構化的數據, 我們可能需要針對數據庫創建一個 schema 用于存儲和檢索數據。

既然 NoSQL 數據庫更容易寫, 更容易維護,更容易實現, 那么我們為什么不是只使用 MongoDB 就好了?當然是有原因的, 還是那句話,有得必有失, 我們需要在 NoSQL 數據庫所提供的數據靈活性 (data flexibility) 基礎上權衡數據庫的可搜索性 (searchability).

Querying Data

假如我們上面的 NoSQL 數據庫來存儲早前的 Car 數據。那么我們可能會使用 VIN 作為 key, 使用一個列表作為每列的值, 也就是說,2134AFGER245267 = ['Lexus', 'RX350', 2013, Black] . 當然了, 我們已經丟掉了列表中每個索引的 涵義 (meaning) . 我們只需要知道在某個地方索引 1 存儲了汽車的 Model , 索引 2 存儲了 Year.

糟糕的事情來了, 當我們想要執行先前的查詢語句時會發生什么?找到 1994 年所有車的顏色將會變得噩夢一般。我們必須遍歷 DATA 中的 每一個值 來確認這個值是否存儲了 car 數據亦或根本是其他不相關的數據, 比如說檢查索引 2, 看索引 2 的值是否等于 1994,接著再繼續取索引 3 的值. 這比 table scan 還要糟糕,因為它不僅要掃描每一行數據,還需要應用一些復雜的規則來回答查詢。

NoSQL 數據庫的作者當然也意識到了這些問題,(鑒于查詢是一個非常有用的 feature) 他們也想出了一些方法來使得查詢變得不那么 “遙不可及”。一個方法是結構化所使用的數據,比如 JSON, 允許引用其他行來表示關系。同時, 大部分 NoSQL 數據庫都有名字空間 (namespace) 的概念, 單一類型的數據可以被存儲在數據庫中該類型所獨有的 “section” 中,這使得查詢引擎能夠利用所要查詢數據的 “shape” 信息。

當然了,盡管為了增強可查詢性已經存在 (并且實現了)了一些更加復雜的方法, 但是在存儲更少量的 schema 與增強可查詢性之間做出妥協始終是一個不可逃避的問題。本例中我們的數據庫僅支持通過 key 進行查詢。如果我們需要支持更加豐富的查詢, 那么事情就會變得復雜的多了。

Summary

至此, 希望 “NoSQL” 這個概念已然十分清晰。我們學習了一點 SQL, 并且了解了 RDBMS 是如何工作的。我們看到了如何從一個 RDBMS 中檢索數據 (使用 SQL 查詢 (query)). 通過搭建了一個玩具級別的 NoSQL 數據庫, 了解了在可查詢性與簡潔性之間面臨的一些問題, 還討論了一些數據庫作者應對這些問題時所采用的一些方法。

即便是簡單的 key-value 存儲, 關于數據庫的知識也是浩瀚無窮。雖然我們僅僅是探討了其中的星星點點, 但是仍然希望你已經了解了 NoSQL 到底指的是什么, 它是如何工作的, 什么時候用比較好。如果您想要分享一些不錯的想法, 歡迎討論. 

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2017-05-18 12:16:03

LinuxPythonNoSql

2020-10-31 22:01:40

NoSQL數據庫

2019-06-12 08:23:21

數據庫時間序列開源

2024-02-02 10:51:53

2018-10-31 10:11:24

Python編程語言語音播放

2022-03-24 14:42:19

Python編程語言

2021-09-28 09:25:05

NoSQL數據庫列式數據庫

2011-10-09 09:38:03

OracleNoSQL

2017-06-08 15:53:38

PythonWeb框架

2021-06-10 13:50:55

代碼開發數據庫

2013-02-27 10:23:55

NoSQL數據庫

2015-10-22 15:09:12

NoSQL數據庫應用場景

2023-04-10 14:20:47

ChatGPTRESTAPI

2022-10-12 23:02:49

Calcite異構數據框架

2019-03-20 15:59:11

NoSQLRedis數據庫

2019-07-08 10:36:34

數據庫WebNoSQL

2011-07-19 09:08:50

JavaNoSQL

2010-04-01 09:45:38

NoSQL

2024-03-28 09:00:00

NoSQL數據庫

2021-02-03 11:44:15

NoSQL關系數據庫
點贊
收藏

51CTO技術棧公眾號

亚洲欧美经典视频| 视频一区在线视频| 欧美mv日韩mv国产网站app| 免费人成自慰网站| 青青草视频在线观看| 日韩影院精彩在线| 欧美日韩ab片| 国产人妻大战黑人20p| 91成人在线网站| 午夜精品久久久久久久99水蜜桃| 欧美在线视频二区| 99热这里只有精品1| 久久狠狠一本精品综合网| 日韩一区二区福利| 色噜噜在线观看| 91精品视频一区二区| 天天综合色天天综合| 尤物一区二区三区| 每日更新在线观看av| 国产.欧美.日韩| 国产日本欧美视频| 丰满少妇xoxoxo视频| 欧美三级小说| www.精品av.com| 亚洲精品国产91| 精品人人人人| 欧美一区二区三区公司| 人妻内射一区二区在线视频| h片在线观看网站| 国产亚洲午夜高清国产拍精品 | 久一视频在线观看| 欧美综合一区| 亚洲欧洲视频在线| 亚州av综合色区无码一区| 国产95亚洲| 精品视频资源站| 凹凸国产熟女精品视频| 丰满大乳少妇在线观看网站| 亚洲男女毛片无遮挡| 亚洲精品一区二区三| 肉丝一区二区| 91在线porny国产在线看| 成人欧美一区二区| 亚洲乱熟女一区二区| 国产乱子伦一区二区三区国色天香| 国产精品草莓在线免费观看 | 欧美三区免费完整视频在线观看| 2022亚洲天堂| 女人高潮被爽到呻吟在线观看| 亚洲综合成人在线| 日韩最新中文字幕| a级在线观看| 亚洲精品欧美专区| 中国老女人av| 女同视频在线观看| 亚洲在线一区二区三区| 亚洲乱码日产精品bd在线观看| 久久bbxx| 亚洲精品少妇30p| 久草免费福利在线| 三妻四妾完整版在线观看电视剧| 亚洲成av人片观看| 免费毛片网站在线观看| 91黄页在线观看| 天天影视网天天综合色在线播放| 欧美日韩成人免费视频| av成人福利| 欧美性xxxxx极品娇小| 色欲av无码一区二区人妻| 日韩成人影音| 欧美精品九九99久久| 久久6免费视频| 亚洲3区在线| 亚洲成人av在线播放| 91av在线免费| 成人在线一区| 美女性感视频久久久| 精品小视频在线观看| 亚洲看片免费| 日韩免费观看av| 一级片在线免费观看视频| 国产乱人伦偷精品视频不卡| 成人性色av| 免费毛片在线| 亚洲视频一区二区免费在线观看| 国产一区二区片| 白浆视频在线观看| 欧美日韩免费在线视频| 台湾佬美性中文| 神马日本精品| 久久艳片www.17c.com| 日韩激情一区二区三区| 日韩精品1区2区3区| 91亚洲午夜在线| 水莓100在线视频| 国产精品免费视频网站| 国产一线二线三线女| 中文字幕一区久| 欧美一级免费观看| 少妇按摩一区二区三区| 亚洲一区二区| 国产成人精品午夜| 成人福利小视频| 国产日韩欧美一区二区三区综合| 国产亚洲精品久久久久久久| 欧美成人黑人| 亚洲精品一区二区三区四区高清| 日韩毛片无码永久免费看| 欧美日本中文| 国产一区视频在线播放| 天堂中文字幕在线| 亚洲综合图片区| 孩娇小videos精品| 婷婷综合一区| 久久久久久久久久久免费精品| 色婷婷久久综合中文久久蜜桃av| 成人丝袜高跟foot| 黄色高清视频网站| 午夜精品成人av| 亚洲成人久久一区| 在线免费日韩av| 久久成人综合网| 欧美日本国产精品| xxxx视频在线| 欧美一区二区三区色| 亚洲图片第一页| 亚洲欧美激情诱惑| 国产伦精品一区二区三区视频免费 | 中文字幕欧美日韩精品| 日本网站在线播放| 国产河南妇女毛片精品久久久| 亚洲精品成人自拍| 一区二区视频免费完整版观看| 亚洲精品一区二区三区四区高清| 欧美三级 欧美一级| 精彩视频一区二区三区| 少妇精品久久久久久久久久| 日韩高清中文字幕一区二区| 日韩精品视频在线播放| 日韩精品一区二区av| 成人听书哪个软件好| 国产精品久久久久久久乖乖| 97se亚洲国产一区二区三区| 欧美日韩999| 亚洲精品国偷拍自产在线观看蜜桃| 成人免费在线播放视频| 伊人影院综合在线| 欧美黄色大片在线观看| 成人性生交xxxxx网站| 精品孕妇一区二区三区| 3atv一区二区三区| 乱h高h女3p含苞待放| 国产一区二区三区在线观看免费视频| 中文字幕一区二区三区有限公司| 成人在线观看免费播放| 日韩中文在线中文网三级| 亚洲性在线观看| 亚洲欧洲另类国产综合| 国产乱叫456| 欧美日韩一区二区国产| 国产精品久久久久久久久婷婷 | 亚洲国产午夜| 国内视频一区二区| 校园春色亚洲色图| 色噜噜狠狠狠综合曰曰曰| 国产精品污视频| 伊人夜夜躁av伊人久久| 天天躁日日躁狠狠躁av麻豆男男 | 成人免费av| 国产日韩精品综合网站| gogo在线高清视频| 亚洲第一区在线| 日本黄色一级视频| 国产精品二区一区二区aⅴ污介绍| 91视频这里只有精品| 亚洲视频中文| 日本不卡一二三区| 96视频在线观看欧美| 欧美精品video| 成人亚洲综合天堂| 欧美一区二区三区在线观看| 黄色小说在线观看视频| 久久久久久99精品| 激情五月婷婷基地| 亚洲激情亚洲| 一区二区91美女张开腿让人桶| 亚洲不卡在线| 日韩免费中文字幕| 国内精品久久久久久野外| 亚洲国产天堂久久综合| 中文字幕一区二区三区免费看| 亚洲综合一二区| 一区二区三区在线观看免费视频| 国产一区视频导航| 日韩av在线综合| 欧美激情一级片一区二区| 欧美日韩在线精品一区二区三区| 96视频在线观看欧美| 热久久免费国产视频| 成人免费网站在线观看视频| 日韩精品视频在线播放| 精品国产无码AV| 在线视频一区二区三区| 久久影院一区二区| 欧美激情一区二区三区全黄| 美女伦理水蜜桃4| 蜜桃精品在线观看| 国产精品宾馆在线精品酒店| 你懂的国产精品| 亚洲乱码一区二区三区三上悠亚| 久久97精品| 91在线精品视频| 国产一区一一区高清不卡| 国内精久久久久久久久久人| 黄网址在线观看| 亚洲人成网站免费播放| 日本高清视频在线| 91精品国产色综合久久久蜜香臀| 天天射天天干天天| 五月婷婷久久丁香| 久久综合亚洲色hezyo国产| 中文字幕一区二区三区视频| 美女爆乳18禁www久久久久久 | 成人黄色a级片| 久久你懂得1024| 亚洲天堂美女视频| 国产成人精品一区二区三区网站观看| 中文字幕 91| 日韩成人一区二区| 熟妇人妻va精品中文字幕| 亚洲国产高清视频| 欧日韩免费视频| 欧美日韩影院| 国产精品视频网站在线观看| 51精产品一区一区三区| 中日韩在线视频| 秋霞欧美视频| 亚洲国产高清国产精品| 精品日韩一区| 色之综合天天综合色天天棕色| 欧美巨大xxxx| 精品一区二区三区免费毛片| 国产伦精品一区二区三区在线播放| 91欧美日韩一区| 国产精品久久久久久久久久久久久久久 | 少妇免费毛片久久久久久久久 | 欧美成人精品午夜一区二区| 国产一区二中文字幕在线看| 亚洲一区二区三区久久久| 国产欧美久久久久久| 欧美性aaa| 91免费国产视频| 日韩欧美中文在线观看| 99中文字幕| 黄色美女久久久| 欧美aaaaa喷水| 欧美日韩水蜜桃| 中文字幕一区综合| 欧美国产91| 福利视频一区二区三区四区| 国产精品日韩| 日韩视频免费在线播放| 久久国产精品99久久人人澡| 911福利视频| 国产 欧美在线| 欧美图片一区二区| 97精品资源在线观看| 亚洲高清视频的网址| 久草视频免费在线| 婷婷综合五月天| 奴色虐av一区二区三区| 欧美日韩第一区日日骚| 国产激情无套内精对白视频| 精品毛片乱码1区2区3区| 香蕉视频免费在线看| 中文字幕欧美国内| 人交獸av完整版在线观看| 91av网站在线播放| xxxxx.日韩| 国产精品国产三级国产专区53| 天堂在线精品| 中文字幕中文字幕在线中一区高清| 午夜精品剧场| 国产精品人人妻人人爽人人牛| 精品一区二区三区免费毛片爱| 涩视频在线观看| 国产欧美日韩亚州综合| 欧美三级日本三级| 色婷婷av一区二区三区gif| 国产又大又长又粗| 亚洲国产精品久久久| 成年人视频在线免费观看| 欧美精品在线观看| 性欧美gay| 国产精品一区二区在线观看| 日韩欧美不卡| 777777av| 国产乱码字幕精品高清av| 一级黄色片大全| 亚洲一区二区三区视频在线 | 亚洲国产二区| 亚洲午夜激情影院| 91小视频在线免费看| 农村妇女精品一区二区| 色老汉av一区二区三区| 亚洲经典一区二区三区| 色爱av美腿丝袜综合粉嫩av| 午夜影院一区| 91超碰在线电影| 日韩电影免费网站| av免费观看网| 久久不见久久见国语| 色噜噜国产精品视频一区二区| 欧美xxxxhdvideosex| 国产精品免费视频xxxx| 欧美成人基地| 999久久欧美人妻一区二区| 日本不卡的三区四区五区| 久久人妻一区二区| 亚洲综合色丁香婷婷六月图片| 夜夜爽8888| 在线看欧美日韩| 亚洲mmav| 欧美国产综合视频| 亚洲美女一区| 农村末发育av片一区二区| 亚洲人妖av一区二区| 自拍偷拍色综合| 亚洲人成网在线播放| 69久成人做爰电影| 精品无码久久久久国产| 精品1区2区3区4区| 樱花草www在线| 中文字幕中文乱码欧美一区二区| 亚洲精品毛片一区二区三区| 亚洲欧美激情一区| 午夜欧美激情| 美乳视频一区二区| 亚洲视频播放| 大又大又粗又硬又爽少妇毛片| 偷窥国产亚洲免费视频| 手机在线不卡av| 久久久久久久久网站| 亚洲2区在线| 精品一区二区三区无码视频| 国产999精品久久久久久绿帽| 欧美老熟妇一区二区三区| 日韩三级免费观看| 一二三四区在线观看| 99精品国产高清一区二区| 亚洲视频精品| 亚洲av无码一区二区三区观看| 五月综合激情网| 日本天堂影院在线视频| 日本不卡高字幕在线2019| 久久爱www成人| 天天干天天玩天天操| 中文字幕一区二区三区色视频| 国产成人三级在线播放| 欧美高清视频免费观看| 韩国精品福利一区二区三区| 国产一区二区视频播放| 久久先锋影音av鲁色资源网| www.日韩一区| 久久久999精品视频| 91精品啪在线观看国产手机| 欧美深夜福利视频| 久久精品视频免费| 中文字幕在线视频免费| 美女啪啪无遮挡免费久久网站| 高清欧美性猛交xxxx黑人猛| 欧美视频在线播放一区| 国产精品美女久久久久高潮| 国产精品久久久久久久久毛片 | 精品国产一区二区三区在线| 国产99久久久久久免费看农村| 日本中文字幕免费| 国产亚洲精品日韩| 欧美日本三级| 自慰无码一区二区三区| 国产精品美女久久福利网站| www.色亚洲| 国产精品27p| 欧美 日韩 国产 一区| 极品粉嫩小仙女高潮喷水久久| 欧美日韩一区二区三区四区五区| 影音先锋在线视频| 麻豆成人在线播放| 国产美女视频91| 欧美a视频在线观看| 欧美成人中文字幕| 国产欧美日韩在线观看视频| 先锋资源在线视频| 色哟哟精品一区| 羞羞视频在线观看免费| 欧美日韩三区四区| 国产精品白丝av| 这里只有精品国产| 91精品国产乱码久久久久久久久| 久久一区91|