Nodejs课堂笔记-第四课 Dynamodb为何物
本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢!
我喜欢带着目标来学习新知识。因此学习nodejs过程中,不喜欢只看枯燥的语法和概念,喜欢做一些有实际应用意义的事情。这样写出来的代码更加的接地气,同时边写边学可以避免学习疲劳,算是寓教于乐。
所以在第四节课中,我开始尝试在nodejs中使用DynamoDB。为什么选择DynamoDB呢? 一方面它是目前云环境中最具代表性的NoSql数据库,另外一方面它在国外实在非常火,估计国内也会慢慢升温。因此后下手不如先下手,现在就开始接触使用DynamoDB,免得以后被动。
在使用DynamoDB之前,我们先了解一下DynamoDB。
Amazon DynamoDB 是一项快速灵活的 NoSQL 数据库服务,适合所有需要一致性且延迟低于 10 毫秒的任意规模的应用程序。它是完全托管的云数据库,支持文档和键值存储模型。其灵活的数据模型和可靠的性能令其成为移动、Web、游戏、广告技术、物联网和众多其他应用的不二之选。
如果使用DynamoDB,那么就要再Amazon中创建DynamoDB实例。哎,这都是钱啊。 虽说学习都是要成本的, 但这个成本有点高。Amazon也想到了这个问题,因此提供了一个DynamoDB Local版本,用于开发和测试。 Amazon也算业界良心~
OK,那就使用DynamoDB Local版本吧。 在Amazon中是这样介绍DynamoDB Local的,请看下面:
DynamoDB Local版本是一个自由免费下载,可以在本地计算机中运行的DynamoDB服务工具。通过DynamoDB Local,开发人员可以在本地使用DynamoDB API脱离真实的DynamoDB Web服务来开发应用。但可以获取到几乎和使用真实DynamoDB Web服务相同的效果。开发人员可以在本地任意的创建表,修改数据。这些变化都会被DynamoDB Local记录并跟踪起来。有了DynamoDB,开发人员就可以完全脱离DynamoDB Web服务,甚至连网络连接都可以不需要了。
DynamoDB Local如此之好,但只能用于本地开发和测试用途。当应用发布上线之时,还是需要将数据库切换到真实的DynamoDB Web Service中。但仅仅是需要切换数据库服务而已,应用中的代码都不需要做任何变更。
DynamoDB Local介绍完了,我们看一下如何下载和使用DynamoDB Local。
点击这里下载DynamoDB Local。请注意:目前DynamoDB Local仅支持JRE6.X及其以上版本。如果读者当前机器JRE版本过低,呵呵,执行upgrade吧。
下载下来的DynamoDB Local是一个压缩包。解压后放在任意目录都可以(说是这样说,但还是建议放到一个比较好找的目录为好。免得时间一长,找不到。)
打开一个终端,或者CMD窗口。切换到解压后的目录。执行下面的命令,简单测试一下是否正常:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
正常情况下,会显示dynamodb服务已经绑定到本地的8000端口。如下图:
{ dynamodb_local_2013-- } » java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb /d/workspaces/workspaces-nodejs/dynamodb_local_2013--
-- ::27.416:INFO:oejs.Server:jetty-8.1..v20130726
-- ::27.549:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8000
或者是下面的输出:
Initializing DynamoDB Local with the following configuration:
Port: 8000
InMemory: false
DbPath: null
SharedDb: true
shouldDelayTransientStatuses: false
CorsParams: *
这取决于JDK版本。
DynamoDB可以接受其他命令参数,主要有以下几个:
-cors value
-dbPath value
-delayTransientStatuses
-help
-inMemory
-optimizeDbBeforeStartup
-port value
-sharedDb
如果想看DynamoDB的使用说明,可以执行java -jar DynamoDBLocal.jar -help来查看,如下图所示:
docker@docker-cloud-r720:~/team/andy/nodejs/src/dynamodb$ java -jar DynamoDBLocal.jar -help
usage: java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar
[-port <port-no.>] [-inMemory] [-delayTransientStatuses]
[-dbPath <path>][-sharedDb] [-cors <allow-list>]
-cors <arg> Enable CORS support for javascript against a
specific allow-list list the domains separated
by , use '*' for public access (default is
'*')
-dbPath <path> Specify the location of your database file.
Default is the current directory.
-delayTransientStatuses When specified, DynamoDB Local will introduce
delays to hold various transient table and
index statuses so that it simulates actual
service more closely. Currently works only for
CREATING and DELETING online index statuses.
-help Display DynamoDB Local usage and options.
-inMemory When specified, DynamoDB Local will run in
memory.
-optimizeDbBeforeStartup Optimize the underlying backing store database
tables before starting up the server
-port <port-no.> Specify a port number. Default is
-sharedDb When specified, DynamoDB Local will use a
single database instead of separate databases
for each credential and region. As a result,
all clients will interact with the same set of
tables, regardless of their region and
credential configuration. (Useful for
interacting with Local through the JS Shell in
addition to other SDKs)
但实际情况中发现,在JDK1.8中,执行help命令不显示。在其他JDK版本中,可以正常显示。暂不清楚是否和JDK有关系,但不影响DynamoDB的使用。
下面开始讲解各个参数:
-cors <arg> 用于运行javascript的跨域访问。如果启动用了这个参数,那么就必须提供allow参数。 默认情况下是*,即允许所有请求。
-dbPath <path> 设定存放数据库数据文件的路径。如果不指定,那么就使用当前目录存放数据。请注意:此选项和--inMemory冲突,不可同时使用。
-delayTransientStatuses 启用DynamoDB延时操作。DynamoDB Local在本地执行时,几乎所有操作都是实时完成的,没有延时。但在实际的DynamoDB Web Service中,是存在一定延时的。因此如果需要更加接近实际DynamoDB的场景,就建议使用此项参数。但请注意,此项参数只能尽可能的接近实际情况,但不会百分百的模拟实际情况。
-help 没啥好说的,输出帮助信息。内容请见上面。
-inMemory DynamoDB Local可以将数据保存到本地,也可以将数据保存到内存中。上面的-dbpath就是保存到本地,这里就是保存到内存。至于区别嘛,就是一个可以持久化,一个没法持久化。呵呵,除此之外,没啥区别。
-optimizeDbBeforeStartup 如果启用了此项参数,就可以在DynamoDB Local启动时首选初始化底层数据库。背后的事情,就是将持久化的数据加载到服务中。因此使用此项参数时,必须同步使用-dbPath参数。
-port <port-no.> 默认端口是8000.如果8000被占用了,就可以通过这个参数绑定其他端口。
-sharedDb DynamoDB默认为每个用户标示一组数据库文件。用户之间是隔离,无法访问的。但通过这个参数,就可以允许其他用户访问此用户的数据库。
好了,说完参数的用法,开发人员就可以愉快的使用DynamoDB了。
剩下的一点时间,简单说一下DynamoDB Local和实际的DynamoDB Web service有什么不同:
- DynamoDB Local不判别用户注册区域和AWS账户有效性
- DynamoDB Local没有吞吐量限制。API中的相关参数都会被忽略。例如,用户可以无限制的使用CreateTable,一天之内无限的UpdateTable。所有的吞吐量限制在Local模式都会被忽略。
- DynamoDB的执行速度,仅仅与本地机器配置有关。即便采用了延时参数,那么有些操作也会比实际DynamoDB Web Service要快得多。例如CreateTable和DeleteTable几乎都是瞬间完成,数据库中的表几乎都是ACTIVE状态。只有当UpdateTable影响到全局二级索引时,会有短暂的CREATING和DELETING状态,很快就会恢复为ACTIVE状态。而在实际DynamoDB服务中,这些都会消耗大量的时间。
- 在DynamoDB Local模式中,会有很强的读一致性。这是因为所有本地操作都是在本地完成的,几乎可以忽略脏数据的影响。除非用户的机器性能有点低....
- Local模式不记录占用的容量。如果API要求返回此值,那么就是nulls
- Local模式也不记录项目记录信息。 如果API要求返回,那么也是nulls
- 在实际的DynamoDB Web Service中,每次只会返回1MB的数据。在Local模式,同样存在此项限制。但在查询索引时有一些区别,DynamoDB Web Service仅计算Key和Value所占数据量,而Local会计算所有项目数据。
- 在使用DynamoDB数据流时也有区别:DynamoDB Web Service所创建的分片会受到表分区的影响。而在Local模式中,不存在表分区。所有的分片都是临时,因此在Local模式中,程序不应过分依赖分片结果。
恩。好了,DynamoDB Local的基本情况讲解完毕了,下节课可以尝试在Nodejs中使用DynamoDB了。
OK,下课。起来~
Nodejs课堂笔记-第四课 Dynamodb为何物的更多相关文章
- Nodejs课堂笔记-第三课 构建一个nodejs的Docker镜像
本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 因为一直做Linux有关的开发工作,所以不习惯在Windows平台编译和测试 ...
- Nodejs课堂笔记—第一课:修改Webstorm的默认主题
最近小半年一直在忙于研究Docker源码,也在写相关的分析文章.但受限于某些条件不能发布到网上,甚为郁闷.而最近几天,接到新的开发任务,需要使用nodejs.之前一直听说过nodejs,但从来没有真正 ...
- Nodejs学习笔记(四)——支持Mongodb
前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ...
- Nodejs课堂笔记-第二课 package.json的作用
本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 上节课,我们打造了一下IDE工具-web storm的显示界面.至少现在回到 ...
- Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
目录 简介和安装 测试MySQL 认识一下Connection Options MYSQL CURD 插入 更新 查询 删除 Nodejs 调用带out参数的存储过程,并得到out参数返回值 结束数据 ...
- NodeJs学习笔记(四)---单元测试
sailsjs框架用了一段时间了,感觉如果功能复杂了,非常难以处理,想用一下单元测试,看是否能解决问题. sailsjs的官方文档使用的是mocha,我搜索了一些资料,主要参考了朴灵 ...
- IP通信基础课堂笔记----第四章(重点中的重点)
IPv4编址方法 一个IPv4地址可表示为一个32位的二进制数. IP地址前面的网络部分表示一个网段,后面部分(主机位)表示这个网段上的一台设备. 常用IP地址分为四类:A.B.C.D. 每类的网络地 ...
- Nodejs学习笔记(四)—与MySQL交互(felixge/node-mysql)
简介和安装 Node.js与MySQL交互操作有很多库,具体可以在 https://www.npmjs.org/search?q=mysql 查看. 我选择了felixge/node-mysql,用 ...
- 【04】【转】Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
目录 简介和安装 测试MySQL 认识一下Connection Options MYSQL CURD 插入 更新 查询 删除 Nodejs 调用带out参数的存储过程,并得到out参数返回值 结束数据 ...
随机推荐
- Angular 学习笔记——ng-repeat 隔行换色
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- linux系统预留内存和磁盘大小
默认情况下, Linux 会最多使用 40% 的可用内存作为文件系统缓存.当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的 IO 请求都是同步的. 将缓存写入磁盘时,有一个默认1 ...
- 【Linux】使用xshell登陆时密码框为灰色,无法输入密码
使用xshell登陆时,出现以上情况,那么这到底值咋回事呢?经过查询以后发现是服务器端设置问题,解决办法如下: vi /etc/ssh/sshd_config 接着保存退出,然后重启sshd服务 se ...
- hadoop:WordCount问题总结
今天玩了一下hadoop的MapReduce,中途遇到了几个问题,在此记录一下. 1.一切按照配置完成之后,hadoop namenode format,start-all.sh启动,使用jps查看进 ...
- springMVC 前后台日期格式传值解决方式之二(共二) @InitBinder的使用
关于springmvc日期问题的解决方式 除了本博客的[springMVC 前后台日期格式传值解决方式之 @DateTimeFormat的使用和配置]一文, 还有如下这种方式: 在Controller ...
- python按行读取apk中版本号、包名等信息
主要是读apk中manifest.xml中的信息. 读单一apk信息:见“文件”中“apkInfo.xml”.实际运行时,需要将后缀由“.xml”改为“.py". 批量自动获取apk软件信息 ...
- Jenkins Docker 插件
原文地址:https://wiki.jenkins.io/display/JENKINS/Docker+Plugin Created by magnayn -, last modified by Ni ...
- 40: Redraiment的走法(不连续最长子字符串)
题目描述 : Redraiment是走梅花桩的高手.Redraiment总是起点不限,从前到后,往高的桩子走,但走的步数最多,不知道为什么?你能替Redraiment研究他最多走的步数吗? 样例输 ...
- 【Hadoop基础教程】4、Hadoop之完全分布式环境搭建
上一篇blog我们完成了Hadoop伪分布式环境的搭建,伪分布式模式也叫单节点集群模式, NameNode.SecondaryNameNode.DataNode.JobTracker.TaskTrac ...
- hdu 1398 Square Coins 分钱币问题
Square Coins Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...