Amazon DynamoDB 入门5:索引创建及管理

上一节我们介绍了项目的添加、修改、获取、删除(CRUD)操作,这一节将介绍索引的创建及管理。 创建索引 SQL 在关系数据库中,索引是一个数据结构,可对表中的不同的列执行快速查询。可以使用 CREATE INDEX SQL 语句将索引添加到现有表,并指定要建立索引的列。在创建索引后,可以照常查询表中的数据,但现在数据库可使用索引快速查找表中的指定行,而不是扫描整个表。 在创建一个索引后,数据库将自动维护此索引。只要修改表中的数据,就会自动更改索引以反映表中的更改。 HUGOMORE42 在 MySQL 中,您可以创建如下所示的索引: CREATE INDEX GenreAndPriceIndex ON Music (genre, price); DynamoDB 在 DynamoDB 中,我们可以创建和使用secondary index来实现类似目的。 DynamoDB 中的索引与其关系对应项不同。当我们创建secondary index时,必须指定其键属性 - 分区键和排序键。 在创建secondary index后,我们可以对它执行 Query 或 Scan 操作,就如同对表执行这些操作一样。 DynamoDB 没有查询优化程序,因此,仅在我们对secondary index执行 Query 或 Scan 操作时使用它。 DynamoDB 支持两种不同的索引: 全局二级索引 - 索引的主键可以是其表中的任意两个属性(可以在创建表时创建,也可以向现有表添加新全局二级索引,或者删除现有的全局二级索引)。 本地二级索引 - 索引的分区键必须与其表的分区键相同。不过,排序键可以是任何其他属性(是在创建表的同时创建的。不能向现有表添加本地二级索引,也不能删除已存在的任何本地二级索引)。 DynamoDB 确保secondary index中的数据最终与其表保持一致。我们可以请求对表或local secondary index执行强一致性 Query 或 Scan 操作。但是,全局二级索引仅支持最终一致性。 可使用 UpdateTable 操作并指定 GlobalSecondaryIndexUpdates 来将global secondary index添加到现有表: { TableName: "Music", AttributeDefinitions:[ {AttributeName: "Genre", AttributeType: "S"}, {AttributeName: "Price", AttributeType: "N"} ], GlobalSecondaryIndexUpdates: [ { Create: { IndexName: "GenreAndPriceIndex", KeySchema: [ {AttributeName: "Genre", KeyType: "HASH"}, //Partition key {AttributeName: "Price", KeyType: "RANGE"}, //Sort key ], Projection: { "ProjectionType": "ALL" }, ProvisionedThroughput: { "ReadCapacityUnits": 1,"WriteCapacityUnits": 1 } } } ] } 添加索引时必须向 UpdateTable 提供以下参数: ...

2017-01-18 · 3 min · 520 words

Amazon DynamoDB 入门4:项目的基本操作(CRUD)

上一节我们介绍了DynamoDB 表的操作,这一节将介绍项目的添加 修改 获取 删除操作。 创建项目 Amazon DynamoDB 提供了 PutItem 和 BatchWriteItem 两种方式写入数据 添加单个项目 在 Amazon DynamoDB 中,使用 PutItem 操作向表添加项目: HUGOMORE42 { TableName: "Music", Item: { "Artist":"No One You Know", "SongTitle":"Call Me Today", "AlbumTitle":"Somewhat Famous", "Year": 2015, "Price": 2.14, "Genre": "Country", "Tags": { "Composers": [ "Smith", "Jones", "Davis" ], "LengthInSeconds": 214 } } } 此表的主键包含 Artist 和 SongTitle。您必须为这些属性指定值。 以下是要了解的有关此 PutItem 示例的几个关键事项: ...

2017-01-18 · 5 min · 991 words

Amazon DynamoDB 入门3: 表的基本操作

之前两篇文章介绍了DynamoDB如何在本地安装以及基本的工作原理和API,这一节主要介绍如何使用DynamoDB。 基本的DynamoDB 操作包括表操作、项目操作和索引管理。 首先是链接数据库。和关系型数据库不同,DynamoDB 是一项 Web 服务,与其进行的交互是无状态的。应用程序不需要维护持久性网络连接。相反,与 DynamoDB 的交互是通过 HTTP(S) 请求和响应进行的。 HUGOMORE42 执行某项操作的步骤为: 应用程序将 HTTP(S) 请求发送到 DynamoDB。该请求包含要执行的 DynamoDB 操作的名称和参数。DynamoDB 将立即执行请求。 DynamoDB 返回一个包含操作结果的 HTTP(S) 响应。如果出错,DynamoDB 将返回 HTTP 错误状态和消息。 大多数情况下,我们编写应用程序代码访问DynamoDB。同时还可以使用 AWS 管理控制台或 AWS Command Line Interface (AWS CLI) 向 DynamoDB 发送临时请求并查看结果。 剩下的就让我们用代码展示吧! 表操作 我们知道,关系模型需要一个明确定义的架构,其中,数据将标准化为表、列和行。此外,在表、列、索引和其他数据库元素之间定义所有关系。但 DynamoDB 不同,DynamoDB 没有架构。每个表必须具有一个用来唯一标识每个数据项目的主键,但对其他非键属性没有类似的约束。DynamoDB 可以管理结构化或半结构化的数据,包括 JSON 文档。 表是关系数据库和 DynamoDB 中的基本数据结构。关系数据库管理系统 (RDBMS) 要求在创建表时定义表的架构。相比之下,DynamoDB 表没有架构 - 与主键不同,我们在创建表时无需定义任何属性或数据类型。 新建表 DynamoDB 使用 CreateTable 操作创建表,并指定参数,请求语法如下所示: { "AttributeDefinitions": [ { "AttributeName": "string", "AttributeType": "string" } ], "GlobalSecondaryIndexes": [ { "IndexName": "string", "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" }, "ProvisionedThroughput": { "ReadCapacityUnits": number, "WriteCapacityUnits": number } } ], "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "LocalSecondaryIndexes": [ { "IndexName": "string", "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" } } ], "ProvisionedThroughput": { "ReadCapacityUnits": number, "WriteCapacityUnits": number }, "StreamSpecification": { "StreamEnabled": boolean, "StreamViewType": "string" }, "TableName": "string" } 必须向 CreateTable 提供以下参数: ...

2017-01-14 · 3 min · 611 words

Amazon DynamoDB 入门2: 工作原理、API和数据类型介绍

本节主要介绍DynamoDB 基本概念、核心组件、数据结构、Api DynamoDB工作原理 DynamoDB 基本概念 DynamoDB 是 AWS 独有的完全托管的 NoSQL Database。它的思想来源于 Amazon 2007 年发表的一篇论文:Dynamo: Amazon’s Highly Available Key-value Store。在这篇论文里,Amazon 介绍了如何使用 Commodity Hardware 来打造高可用、高弹性的数据存储。想要理解 DynamoDB,首先要理解 Consistent Hashing。Consistent Hashing 的原理如下图所示: HUGOMORE42 它的概念是: 我有一个足够大的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 表的以下内容: ...

2017-01-09 · 4 min · 652 words

Amazon DynamoDB 入门1:配置(本地)及python示例

本节主要介绍AmazonDynamoDB 安装配置及Python开发示例" 什么是 Amazon DynamoDB Amazon DynamoDB 是一种完全托管的 NoSQL 数据库服务,提供快速而可预测的性能,能够实现无缝扩展。使用 DynamoDB,您可以免除操作和扩展分布式数据库的管理工作负担,因而无需担心硬件预置、设置和配置、复制、软件修补或集群扩展等问题。 使用 DynamoDB,您可以创建数据库表来存储和检索任意量级的数据,并提供任意级别的请求流量。您可以扩展或缩减您的表的吞吐容量,而不会导致停机或性能下降,还可以使用 AWS 管理控制台来监控资源使用情况和各种性能指标。 HUGOMORE42 Amazon DynamoDB 特点 DynamoDB 会自动将数据和流量分散到足够数量的服务器上,以满足吞吐量和存储需求,同时保持始终如一的高性能。所有数据均存储在固态硬盘 (SSD) 中,并会自动复制到 AWS 区域中的多个可用区中,从而提供内置的高可用性和数据持久性。 DynamoDB 是 NoSQL 数据库并且无架构,这意味着,与主键属性不同,无需在创建表时定义任何属性或数据类型。与此相对,关系数据库要求在创建表时定义每个列的名称和数据类型。 Amazon DynamoDB 使用 AWS 配置 注册 Amazon Web Services 并创建访问密钥 创建 AWS 凭证文件 开启DynamoDB 服务 在计算机上运行 DynamoDB 除了 Amazon DynamoDB Web 服务之外,AWS 还提供可本地运行的可下载版本的 DynamoDB。 使用本地版本,在开发应用程序时无需 Internet 连接。 方法1 直接在计算机上安装 需要安装java环境 下载 DynamoDB 解压,并将解压后的目录复制到某个位置 打开命令提示符窗口,打开 DynamoDBLocal.jar 的目录,并输入以下命令: java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb 现在就可以使用了 ...

2017-01-07 · 2 min · 304 words

网站微信登录-python 实现

最近我们的网站要加微信登录功能,找了python sdk 感觉都不满意,然后就参考instagram python sdk 自己造了轮子。 轮子 github 地址 python-weixin 根据需求选择相应的登录方式 微信现在提供两种登录接入方式 移动应用微信登录 网站应用微信登录 HUGOMORE42 这里我们使用的是网站应用微信登录 按照 官方流程 注册并通过开放平台开发者资质认证 注册微信开放平台帐号后,在帐号中心中填写开发者资质认证申请,并等待认证通过。 创建网站应用 通过填写网站应用名称、简介和图标,以及各平台下载地址等资料,创建网站应用 接入微信登录 在资源中心查阅网站应用开发文档,开发接入微信登陆功能,让用户可使用微信登录你的网站应用 如果已经完成上面的操作,请继续往下看 微信网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为: 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数; 通过code参数加上AppID和AppSecret等,通过API换取access_token; 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。 获取access_token 时序图 具体流程请参考官方文档,我们这里只说一下python的实现方法。官方文档地址 点这里 参考python-instagram 我写了一个 [python-weixin] (https://github.com/gusibi/python-weixin)一个微信python SDK 不过现在还只有微信接入、获取用户信息、 刷新refresh_token 等简单功能 安装 方法一 手动安装 首先 需要把代码clone到本地 python setup.py install 方法二 pip install pip install git+https://github.com/gusibi/python-weixin.git@master 使用方式 from weixin.client import WeixinAPI APP_ID = 'your app id' APP_SECRET = 'your app secret' REDIRECT_URI = 'http://your_domain.com/redirect_uri' # 这里一定要注意 地址一定要加上http/https scope = ("snsapi_login", ) api = WeixinAPI(appid=APP_ID, app_secret=APP_SECRET, redirect_uri=REDIRECT_URI) authorize_url = api.get_authorize_url(scope=scope) 现在将 authorize_url地址(如 http://yoursite.com/login/weixin)在浏览器打开, 将跳转到微信登录页面,使用手机扫码登录后将跳转到 ...

2016-09-05 · 2 min · 263 words

跟着代码学go 002 -- 控制流

控制流 上一篇我们了解了golang 的变量、函数和基本类型,这一篇将介绍一下控制流 现在我们看一个复杂点的例子: HUGOMORE42 fibonacci(递归版) 01 package main 02 03 import "fmt" 04 05 func main() { 06 result := 0 07 for i := 0; i <= 10; i++ { 08 result = fibonacci(i) 09 fmt.Printf("fibonacci(%d) is: %d\n", i, result) 10 } 11 } 12 13 func fibonacci(n int) (res int) { 14 if n <= 1 { 15 res = 1 16 } else { 17 res = fibonacci(n-1) + fibonacci(n-2) 18 } 19 return 20 } // outputs fibonacci(0) is: 1 fibonacci(1) is: 1 fibonacci(2) is: 2 fibonacci(3) is: 3 fibonacci(4) is: 5 fibonacci(5) is: 8 fibonacci(6) is: 13 fibonacci(7) is: 21 fibonacci(8) is: 34 fibonacci(9) is: 55 fibonacci(10) is: 89 for i := 0; i <= 10; i++ {} 第7行是一个循环结构 这里for 循环是一个控制流 控制流 For Go 只有一种循环接口– for 循环 ...

2016-04-26 · 4 min · 836 words

跟着代码学go 001 -- 变量&函数

变量&函数 最近在学习golang,写下学习笔记提升记忆。 为了看起来不是那么枯燥,本学习笔记采用分析代码的形式。 首先搬出我们最经典的第一段代码: HUGOMORE42 hello world package main // 0 import "fmt" // 1实现格式化的 I/O /* Print something */ // 2 func main() { // 3 fmt.Println("Hello, world; or καλημε ́ρα κóσμε; orこんにちは 世界") // 4 } 首先我们要认识到 每个Go 程序都是由包组成,程序的运行入口是包main 首行这个是必须的。所有的 Go 文件以 package 开头,对于独立运行的执行文件必须是 package main; 这是说需要将fmt加入到main。不是main 的包被称为库 末尾以 // 开头的内容是单行注释 Package fmt包含有格式化I/O函数,类似于C语言的printf和scanf 这也是注释,表示多行注释。 package main 必须首先出现,紧跟着是 import。在 Go 中,package 总是首先出现, 然后是 import,然后是其他所有内容。当 Go 程序在执行的时候,首先调用的函数 是 main.main(),这是从 C 中继承而来。这里定义了这个函数 调用了来自于 fmt 包的函数打印字符串到屏幕。字符串由 " 包裹,并且可以包含非 ASCII 的字符。这里使用了希腊文和日文、中文" 编译和运行代码 构建 Go 程序的最佳途径是使用 go 工具。 构建 helloworld 只需要: ...

2016-04-25 · 5 min · 922 words

golang 介绍

1. Golang 是什么 Go 官方说明: Go 编程语言是一个使得程序员更加有效率的开源项目。Go 是有表达力、简 洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新的类型系统允许构建有 性的模块化程序。Go 编译到机器码非常快 速,同时具有便利的垃圾回收和强大的运行时反射。它是快速的、静态类 型编译语言,但是感觉上是动态类型的,解释型语言 HUGOMORE42 2. 为什么要开发这个语言 Go 语言的发展目标 Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合 Go 语言是一门类型安全和内存安全的编程语言。虽然 Go 语言中仍有指针的存在,但并不允许进行指针运算。 Go 语言的另一个目标是对于网络通信、并发和并行编程的极佳支持,从而更好地利用大量的分布式和多核的计算机 Go 语言中另一个非常重要的特性就是它的构建速度(编译和链接到机器代码的速度),一般情况下构建一个程序的时间只需要数百毫秒到几秒。 Go 语言实现高效快速的垃圾回收(使用了一个简单的标记-清除算法)。 3. 有什么特性&&用途 语言的特性 清晰并且简洁 Go 努力保持小并且优美,你可以在短短几行代码里做许多事情; 并行 Go 语言从本质上(程序和结构方面)来实现并发编程。 Go 让函数很容易成为非常轻量的线程。这些线程在 Go 中被叫做 goroutines Channel 这些 goroutines 之间的通讯由 channel[18, 25] 完成 快速 编译很快,执行也很快。目标是跟 C 一样快。编译时间用秒计算; Go 的可执行文件都比相对应的源代码文件要大很多,这恰恰说明了 Go 的 runtime 嵌入到了每一个可执行文件当中。当然,在部署到数量巨大的集群时,较大的文件体积也是比较头疼的问题。但总得来说,Go 的部署工作还是要比 Java 和 Python 轻松得多。因为 Go 不需要依赖任何其它文件,它只需要一个单独的静态文件,这样你也不会像使用其它语言一样在各种不同版本的依赖文件之间混淆。 安全 当转换一个类型到另一个类型的时候需要显式的转换并遵循严格的规则。Go 有 垃圾收集(使用了一个简单的标记-清除算法),在 Go 中无须 free(),语言会处理这一切; 值得注意的是,因为垃圾回收和自动内存分配的原因,Go 语言不适合用来开发对实时性要求很高的软件。 ...

2016-04-14 · 2 min · 271 words