国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Amazon DynamoDB 入門2:工作原理、API和數據類型介紹

baoxl / 2472人閱讀

摘要:使用此值作為其哈希函數的輸入值,從而生成可從中找到該項目的分區。在這種情況下,會根據字符串的哈希值,使用其哈希函數決定新項目的存儲位置。使用分區鍵值作為對內部哈希函數的輸入。可使用字符串數據類型表示日期或時間戳。

本節主要介紹DynamoDB 基本概念、核心組件、數據結構、Api

DynamoDB 基本概念

DynamoDB 是 AWS 獨有的完全托管的 NoSQL Database。它的思想來源于 Amazon 2007 年發表的一篇論文:Dynamo: Amazon’s Highly Available Key-value Store。在這篇論文里,Amazon 介紹了如何使用 Commodity Hardware 來打造高可用、高彈性的數據存儲。想要理解 DynamoDB,首先要理解 Consistent Hashing。Consistent Hashing 的原理如下圖所示:

它的概念是:

我有一個足夠大的Keyspace(2的160次方,比較一下:IPv6是2的128次方),我們記作X。

然后將X放在一個環形的空間里劃分成大小相等的Y個 Partition,依次循環排列(如圖),每個 Partition 由一個Vnode(Riak的概念)管理,

當你有M個Database Server(Node),Y個Vnode再平均映射到M個Node上。

當數據要插入時,將其主鍵(Hash Key)映射到K中的一個地址(Addr),對應到某個Vnode,再進一步對應到某個Node,如果這個數據需要N個Replica,則將數據寫入Addr(Vnode a),Addr + 1(Vnode b), …,Add + N(Vnode n)。

這里,M就是你的Shards,N是Replica。

以后添加新的Node時,映射發生變化,只需要把相應的變化了的Vnode遷移到新的Node上即可。在這種結構下,Sharding/Replica對程序員基本上是透明的。

DynamoDB 核心組件

基本 DynamoDB 組件包括:表、項目、屬性

表 - 類似于其他數據庫系統,DynamoDB將數據存儲在表中。表是數據的集合。(類似于關系型數據庫中的表)

項目 - 每個表包含多個項目。項目是一組屬性,具有不同于所有其他項目的唯一標識。(類似于其他數據庫系統中的行、記錄或元組。)

屬性 - 每個項目包含一個或多個屬性。屬性是基礎的數據元素,無需進一步分解。(類似于其他數據庫系統中的字段或列。)

下圖是一個名為 People 的表,其中顯示了一些示例項目和屬性:

請注意有關 People 表的以下內容:

表中的每個項目都有一個唯一的標識符或主鍵,用于將項目與表中的所有其他內容區分開來。在 People 表中,主鍵包含一個屬性 (PersonID)。

與主鍵外不同,People表是無架構的,這表示屬性及其數據類型都不需要預先定義。每個項目都能擁有其自己的獨特屬性。

大多數屬性是標量類型的,這表示它們只能具有一個值。字符串和數字是標量的常見示例。

某些項目具有嵌套屬性 (Address)。DynamoDB 支持最高 32級深度的嵌套屬性。

這里,我們將看到第一個概念:主鍵。

主鍵

創建表時,除表名稱外,您還必須指定表的主鍵。主鍵唯一標識表中的每個項目,因此,任意兩個項目的主鍵都不相同。
DynamoDB 支持兩種不同類型的主鍵:

分區鍵 - 簡單的主鍵,由一個稱為分區鍵的屬性組成。

如果表具有簡單主鍵(只有分區鍵),DynamoDB 將根據其分區鍵值存儲和檢索各個項目。同時,DynamoDB 使用分區鍵的值作為內部哈希函數的輸入值,從而將項目寫入表中。哈希函數的輸出值決定了項目將要存儲在哪個分區。

要從表中讀取某個項目,必須為該項目指定分區鍵值。DynamoDB 使用此值作為其哈希函數的輸入值,從而生成可從中找到該項目的分區。(此時,分區鍵必須是唯一的,不可重復。)

下圖顯示了名為 Pets 的表,該表跨多個分區。表的主鍵為 AnimalType(僅顯示此鍵屬性)。在這種情況下,DynamoDB 會根據字符串 Dog 的哈希值,使用其哈希函數決定新項目的存儲位置。請注意,項目并非按排序順序存儲的。每個項目的位置由其分區鍵的哈希值決定。

分區鍵和排序鍵 - 稱為復合主鍵,此類型的鍵由兩個屬性組成。第一個屬性是分區鍵,第二個屬性是排序鍵。

DynamoDB 使用分區鍵值作為對內部哈希函數的輸入。來自哈希函數的輸出決定了項目將存儲到的分區(DynamoDB 內部的物理存儲)。具有相同分區鍵的所有項目按排序鍵值的排序順序存儲在一起。兩個項目可具有相同的分區鍵值,但這兩個項目必須具有不同的排序鍵值。

為將某個項目寫入表中,DynamoDB 會計算分區鍵的哈希值以確定該項目的存儲分區。在該分區中,可能有幾個具有相同分區鍵值的項目,因此 DynamoDB 會按排序鍵的升序將該項目存儲在其他項目中。

要讀取表中的某個項目,您必須為該項目指定分區鍵值和排序鍵值。DynamoDB 會計算分區鍵的哈希值,從而生成可從中找到該項目的分區。

如果我們查詢的項目具有相同的分區鍵值,則可以通過單一操作 (Query) 讀取表中的多個項目。DynamoDB 將返回具有該分區鍵值的所有項目。或者,也可以對排序鍵應用某個條件,以便它僅返回特定值范圍內的項目。

假設 Pets 表具有由 AnimalType(分區鍵)和 Name(排序鍵)構成的復合主鍵。

下圖顯示了 DynamoDB 寫入項目的過程,分區鍵值為 Dog、排序鍵值為 Fido。

為讀取 Pets 表中的同一項目,DynamoDB 會計算 Dog 的哈希值,從而生成這些項目的存儲分區。然后,DynamoDB 會掃描這些排序鍵屬性值,直至找到 Fido。

要讀取 AnimalType 為 Dog 的所有項目,您可以執行 Query 操作,無需指定排序鍵條件。默認情況下,這些項目會按存儲順序(即按排序鍵的升序)返回。或者,您也可以請求以降序返回。

要僅查詢某些 Dog 項目,您可以對排序鍵應用條件(例如,僅限 Name 在 A 至 K 范圍內的 Dog 項目)。

Note

每個主鍵屬性必須為標量(表示它只能具有一個值)。主鍵屬性唯一允許的數據類型是字符串、數字和二進制。對于其他非鍵屬性沒有任何此類限制。

DynamoDB 會自動分配足夠的存儲,每個分區鍵值的非重復排序鍵值無數量上限。所以即使需要在 Dog 表中存儲數十億 Pets項目,DynamoDB 也能這一需求。

二級索引

DynamoDB支持在一個表上創建一個或多個二級索引。利用 secondary index,除了可對主鍵進行查詢外,還可使用替代鍵查詢表中的數據。

DynamoDB 支持兩種索引:

Global secondary index - 一種帶有可能與表中不同的分區鍵和排序鍵的索引。

Local secondary index - 一種分區鍵與表中的相同但排序鍵與表中的不同的索引。

最多可以為每個表定義 5 個全局二級索引和 5 個本地二級索引。

下圖顯示了示例 Music 表,該表包含一個名為 GenreAlbumTitle 的新索引

對于Music表,我們不僅可以按 Artist(分區鍵)或按 Artist 和 SongTitle(分區鍵和排序鍵)查詢數據項。還可以按 Genre 和 AlbumTitle 查詢數據。

Note

請注意有關 GenreAlbumTitle 索引的以下內容:

每個索引屬于一個表(稱為索引的基表)。在上述示例中,Music 是 GenreAlbumTitle 索引的基表。

DynamoDB 將自動維護索引。當添加、更新或刪除基表中的某個項目時,DynamoDB 會添加、更新或刪除屬于該表的任何索引中的對應項目。

當創建索引時,可指定哪些屬性將從基表復制或投影到索引。DynamoDB 至少會將鍵屬性從基表投影到索引中。對于 GenreAlbumTitle 也是如此,只不過此時只有 Music 表中的鍵屬性會投影到索引中。

DynamoDB 數據類型

DynamoDB 對表中的屬性支持很多不同的數據類型。可按以下方式為屬性分類:

標量類型 - 標量類型可準確地表示一個值。標量類型包括數字、字符串、二進制、布爾值和 null。

文檔類型 - 文檔類型可表示具有嵌套屬性的復雜結構。文檔類型包括列表和映射。

集類型 - 集類型可表示多個標量值。集類型包括字符串集、數字集和二進制集。

當創建表或secondary index時,必須指定每個主鍵屬性(分區鍵和排序鍵)的名稱和數據類型。此外,每個主鍵屬性必須定義為字符串、數字或二進制類型。

標量類型

標量類型包括數字、字符串、二進制、布爾值和 null。

數據類型 說明 示例
字符串 字符串是使用 UTF-8 二進制編碼的 Unicode。字符串的長度必須大于零且受限于最大 DynamoDB 項目大小 400 KB。 "Bicycle"
數字 數字可為正數、負數或零。數字最多可精確到 38 位 - 超過此位數將導致意外 300
二進制 二進制類型屬性可以存儲任意二進制數據,如壓縮文本、加密數據或圖像。DynamoDB 會在比較二進制值時將二進制數據的每個字節視為無符號。二進制屬性的長度必須大于零且受限于最大 DynamoDB 項目大小 400 KB。 這是一個采用 Base64 編碼文本的二進制屬性: dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk
布爾值 布爾類型屬性可以存儲 true 或 false。 true
空代表屬性具有未知或未定義狀態。 NULL
字符串

如果將主鍵屬性定義為字符串類型屬性,以下附加限制將適用:

對于簡單的主鍵,第一個屬性值(分區鍵)的最大長度為 2048 字節。

對于復合主鍵,第二個屬性值(排序鍵)的最大長度為 1024 字節

DynamoDB 使用基礎的 UTF-8 字符串編碼字節整理和比較字符串。例如,“a”(0x61) 大于“A”(0x41),“?”(0xC2BF) 大于“z”(0x7A)。

可使用字符串數據類型表示日期或時間戳。執行此操作的一種方法是使用 ISO 8601 字符串,如以下示例所示:

2016-02-15

2015-12-21T17:42:34Z

20150311T122706Z

也可以使用數字數據類型表示日期或時間戳

數字

數字范圍

正數范圍:1E-130 到 9.9999999999999999999999999999999999999E+125

負數范圍:-9.9999999999999999999999999999999999999E+125 到 -1E-130

在 DynamoDB 中,數字以可變長度形式表示。系統會刪減開頭和結尾的 0。

所有數字將作為字符串通過網絡發送到 DynamoDB,以最大程度地提高不同語言和庫之間的兼容性。但是,DynamoDB 會將它們視為數字類型屬性以方便數學運算。

Note

如果數字精度十分重要,則應使用從數字類型轉換的字符串將數字傳遞給 DynamoDB。

二進制

如果將主鍵屬性定義為二進制類型屬性,以下附加限制將適用:

對于簡單的主鍵,第一個屬性值(分區鍵)的最大長度為 2048 字節。

對于復合主鍵,第二個屬性值(排序鍵)的最大長度為 1024 字節。

在將二進制值發送到 DynamoDB 之前,我們必須采用 Base64 編碼格式對其進行編碼。收到這些值后,DynamoDB 會將數據解碼為無符號字節數組,將其用作二進制屬性的長度。

文檔類型

文檔類型包括列表和映射。這些數據類型可以互相嵌套,用來表示深度最多為 32 層的復雜數據結構。
只要包含值的項目大小在 DynamoDB 項目大小限制 (400 KB) 內,列表或映射中值的數量就沒有限制。

數據類型 說明 示例
列表 列表類型屬性可存儲值的有序集合。列表用方括號括起:[ ... ]。列表類似于 JSON 數組。列表元素中可以存儲的數據類型沒有限制,列表元素中的元素也不一定為相同類型。 FavoriteThings: ["Cookies", "Coffee", 3.14159]
映射 映射類型屬性可以存儲名稱/值對的無序集合。映射用大括號括起:{ ... }。映射類似于 JSON 對象。映射元素中可以存儲的數據類型沒有限制,映射中的元素也不一定為相同類型。 示例如下
{
    Day: "Monday",
    UnreadEmails: 42,
    ItemsOnMyDesk: [
        "Coffee Cup",
        "Telephone",
        {
            Pens: { Quantity : 3},
            Pencils: { Quantity : 2},
            Erasers: { Quantity : 1}
        }
    ]
}
Note

DynamoDB 讓您可以使用映射/列表中的單個元素

DynamoDB 支持表示數字、字符串或二進制值集的類型。集中的所有元素必須為相同類型(

集中的每個值必須是唯一的。集中的值的順序不會保留。不支持空集。

Example (字符串集、數字集和二進制集)

# 必須是相同的數據類型
# 字符串集
["Black", "Green" ,"Red"]
# 數字集
[42.2, -19, 7.5, 3.14]
# 二進制集
["U3Vubnk=", "UmFpbnk=", "U25vd3k="]
DynamoDB API

DynamoDB 的api操作主要用于控制層面、數據層面和DynamoDB Streams。

控制層面

控制層面 操作可讓我們可以創建和管理DynamoDB表。它們還可讓我們可以使用依賴于表的索引、流和其他對象。

CreateTable - 創建新表。或者,也可以創建一個或多個二級索引并為表啟用 DynamoDB Streams。

DescribeTable - 返回有關表的信息,例如,表的主鍵架構、吞吐量設置、索引信息等。

ListTables - 返回列表中所有表的名稱。

UpdateTable - 修改表或其索引的設置、創建或刪除表上的新索引或修改表的 DynamoDB Streams 設置。

DeleteTable - 從 DynamoDB 中刪除表及其所有依賴對象。

數據層面

數據層面操作可讓我們對表中的數據執行創建、讀取、更新和刪除(也稱為 CRUD)操作。某些數據層面操作還可讓我們可以從secondary index中讀取數據。

創建數據

PutItem - 將單個項目寫入到表中。您必須指定主鍵屬性,但不必指定其他屬性。

BatchWriteItem - 將最多 25 個項目寫入到表中。

讀取數據

GetItem - 從表中檢索單個項目。我們必須為所需的項目指定主鍵。我們可以檢索整個項目,也可以僅檢索其屬性的子集。

BatchGetItem - 從一個或多個表中檢索最多 100 個項目。

Query - 檢索具有特定分區鍵的所有項目。我們必須指定分區鍵值。

可以檢索整個項目,也可以僅檢索其屬性的子集。或者,也可以對排序鍵值應用條件,以便只檢索具有相同分區鍵的數據子集。我們可以對表使用此操作,前提是該表同時具有分區鍵和排序鍵。還可以對索引使用此操作,前提是該索引同時具有分區鍵和排序鍵。

Scan - 檢索指定表或索引中的所有項目。我們可以檢索整個項目,也可以僅檢索其屬性的子集。或者,我們也可以應用篩選條件以僅返回感興趣的值并放棄剩余的值。

更新數據

UpdateItem - 修改項目中的一個或多個屬性。必須為要修改的項目指定主鍵。

可以添加新屬性以及修改或刪除現有屬性。還可以執行有條件更新。也可以實施一個原子計數器,該計數器可在不干預其他寫入請求的情況下遞增或遞減數字屬性。

刪除數據

DeleteItem - 從表中刪除單個項目。您必須為要刪除的項目指定主鍵。

BatchWriteItem - 從一個或多個表中刪除最多 25 個項目

Note

Batch 操作比調用多次單個請求(DeleteItem, GetItem, PutItem)更有效,因為秩序一個網絡請求即可操作多個項目。

DynamoDB Streams

DynamoDB Streams 操作可對表啟用或禁用流,并能允許對包含在流中的數據修改記錄的訪問。

ListStreams - 返回所有流的列表,或僅返回特定表的流。

DescribeStream - 返回有關流的信息,例如,流的 Amazon 資源名稱 (ARN) 和您的應用程序可開始讀取前幾條流記錄的位置。

GetShardIterator - 返回一個分區迭代器,這是我們的應用程序用來從流中檢索記錄的數據結構。

GetRecords - 使用給定分區迭代器檢索一條或多條流記錄。

命名規則

DynamoDB 中的表、屬性和其他對象必須具有名稱。名稱應該簡明扼要 - 例如,Products、Books 和 Authors 之類的名稱是都是不言而喻的。

下面是 DynamoDB 的命名規則:

所有名稱都必須使用 UTF-8 進行編碼,并且區分大小寫。

表名稱和索引名稱的長度必須介于 3 到 255 個字符之間,而且只能包含以下字符:

a-z

A-Z

0-9

_(下劃線)

-(短劃線)

.(圓點)

屬性名稱的長度必須介于 1 到 255 個字符之間。

保留關鍵字和特殊字符

與很多其他數據庫管理系統相似,DynamoDB 也具有一系列保留關鍵字和特殊字符。

有關 DynamoDB 中的保留關鍵字的完整列表,請參閱 DynamoDB 中的保留關鍵字。

(哈希)和 :(冒號)在 DynamoDB 中具有特殊含義

DynamoDB允許使用這些關鍵字和特殊符號用于命名,但我們不建議這么做

有關更多信息,請參閱 為屬性名稱和值使用占位符。

讀取一致性

Amazon DynamoDB 在全世界多個 AWS 區域可用。每個區域均與其他 AWS 區域完全獨立和隔離。

例如,如果我們在 us-east-1 區域有一個名為 People 的表,并在 us-west-2 區域有另一個名為 People 的表,則這兩個表將被視為完全獨立的表。

每個 AWS 區域包含多個不同的稱為“可用區”的位置。每個可用區都被設計成不受其他可用區故障的影響,并提供低價、低延遲的網絡連接,以連接到同一區域其他可用區。此設計可保證我們可以在某個區域的多個可用區中快速復制數據。

當我們將某個數據寫入 DynamoDB 表并收到 HTTP 200 響應 (OK) 時,該數據的所有副本都會更新。但是,要將數據傳播到當前 AWS 區域內的所有存儲位置需要耗費一定的時間。該數據最終將在上述所有存儲位置中保持一致,通常只需一秒或更短時間。

為了支持各種應用程序要求,DynamoDB 同時支持最終一致性 讀取和強一致性 讀取。

最終一致性讀取

當我們從 DynamoDB 表中讀取數據時,返回的可能不是剛剛完成的寫入操作的結果。響應可能包含某些舊的數據。但是,如果我們在短時間后重復讀取請求,響應將返回最新的數據。

強一致性讀取

當我們請求強一致性讀取時,DynamoDB 會返回具有最新數據的響應,從而反映來自所有已成功的之前寫入操作的更新。但是,如果網絡延遲或中斷,可能會無法執行強一致性讀取

Note

DynamoDB 默認使用最終一致性讀取。讀取操作(例如 GetItem、Query 和 Scan)提供了一個 ConsistentRead 參數:此參數設置為 true,DynamoDB 將在操作過程中使用強一致性讀取。

示例:

{
    TableName: "Music",
    Key: {
        "Artist": "No One You Know",
        "SongTitle": "Call Me Today"
    },
    ConsistentRead: true
}
python 示例
table = db3.Table("Music")
response = table.get_item(
    Key={
        "Artist": "The Acme Band",
        "SongTitle": "Still In Love"
    },
    ConsistentRead=True
)

下一篇主要介紹DynamoDB表的基本操作

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38358.html

相關文章

  • Amazon DynamoDB 入門2工作原理API數據類型介紹

    摘要:使用此值作為其哈希函數的輸入值,從而生成可從中找到該項目的分區。在這種情況下,會根據字符串的哈希值,使用其哈希函數決定新項目的存儲位置。使用分區鍵值作為對內部哈希函數的輸入。可使用字符串數據類型表示日期或時間戳。 本節主要介紹DynamoDB 基本概念、核心組件、數據結構、Api DynamoDB 基本概念 DynamoDB 是 AWS 獨有的完全托管的 NoSQL Database。...

    王陸寬 評論0 收藏0
  • Amazon DynamoDB 入門3: 表的基本操作

    摘要:基本的操作包括表操作項目操作和索引管理。將立即執行請求。返回一個包含操作結果的響應。表是關系數據庫和中的基本數據結構。每秒需對此表執行的讀取和寫入次數。 Amazon DynamoDB 表的基本操作 之前兩篇文章介紹了DynamoDB如何在本地安裝以及基本的工作原理和API,這一節主要介紹如何使用DynamoDB。 基本的DynamoDB 操作包括表操作、項目操作和索引管理。 首先是鏈...

    Anshiii 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<