一个周末掌握IT前沿技术之node.js篇<二>:Node.js与redis





本篇极限学习内容一共有7章,第1章是内容最多、最理论性、最抽象的一章。如果能在3个小时内掌握第1章80%的内容,我们的学习效率是惊人的。现在是中午,小憩一会儿,我们继续!

后面的章节将越来越工程性,注重实践。本章将围绕Node.js介绍现在流行的各种数据库模型,并对其中一种进行上机实验。在此之前,似乎有必要介绍一下我们实验开发环境的搭建。

《windows下Node.js开发环境的搭建》
由于历史原因,即使是开发人员,平时使用的操作系统也多是windows。为了快速开发我们的产品,我们不需要单独搭建一个Linux环境。
1. 下载并安装windows版安装程序:“node-v0.6.14.msi”,一路next,直到完成。

下载地址:{官网} {微盘}

2. 下载并安装一个支持Node.js的集成开发环境IDE:“JetBrains WebStorm 3.0.3”,一路next,直到完成。

下载地址:{官网} {微盘}

Node.js开发环境安装完成。您是否还沉浸在愉悦的安装过程中?很遗憾,一切皆已完成!:)没有JDK,没有Cygwin,没有python,没有动态链接库。一切就这么简单。 

最有前途的集成开发环境是cloud9,它是一个web app,可以安装在本地,通过浏览器访问127.0.0.1来使用。这样的应用程序是一个趋势,然而我们这里没有选用有两个原因:一是它暂时不支持Node.js 0.4以上的版本,二是它处于快速发展的阶段,变化会很大。我们会关注它的发展,更新我们的知识和工具,和时代一起发展。

和时代一起发展的还有各种数据库技术,接下来我们就来深入地分析它们。


二. JavaScript与 数据库模型


任何一个web应用都有持久化存储各种用户数据的需求。这些数据包括,用户信息、用户制造的内容、用户之间的关系、用户与内容之间的关系、内容与内容之间的关系等等。这些数据中多数是关系。我们应该听说过关系型数据库。顾名思义,那么是不是用关系型数据库实现这些需求是最好的方法呢?答案是否定的。虽然迄今为止,主导的数据模型仍然是关系模型。那么我们就从关系模型开始讲起。


2.1 五大流行的数据库模型。

(1). 关系模型。

关系模型是最有技术含量的数据库模型。它借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型是由埃德加·科德于1970年首先提出的,并提出了“科德十二定律”,成为了全关系系统应遵循的基本准则。如果深入地研究这些内容,那是一门大型的学科。Oracle是关系模型数据库的领先者,被它收购的MySQL是使用最广泛的数据库没有之一。我们的目的不是研究理论,而是使用。下面的链接将教我们怎样使用Node.js连接mysql数据库:
《使用Node.js连接MySQL数据库》
数据库的目的就是优化人们对于数据的存储查询(增删查改CRUD)过程。特别是随着数据规模的增大,这些过程会变得异常地困难。在上一个时代,也就是Facebook的时代,Facebook是MySQL的最大的使用者。它曾将的数亿个用户信息,数百亿条内容,数千亿个连接,全部存储在MySQL的各个表结构中。处理它们是一个极其艰巨的任务,但由于对技术的强烈需求,Facebook一直推动着技术的发展(达到了处理这些问题本身就不是问题的状态)。我们有一个理念,那就是在产品推出的初期,不需要太多地考虑大数据,大并发量的问题。如果产品出现爆发式的增长,强烈需求的推动作用,会解决大部分的技术问题。所以在对数据模型的选择中,大数据并不是我们考虑的重要因素。即使是MySQL也可以通过分布式集群和一些精深的技术手段来提高它的大数据处理性能。那么在数据库模型的选择上我们应该重点考虑哪些因素呢?优先级从高到低依次应该是:1.快速实现的需要;2.业务模型和数据模型的匹配;3.横向可扩展性。

就以MySQL为例,对于各种编程语言开发接口非常友好,SQL语句功能强大,适宜快速实现。数据规模增大时也有成熟的扩展解决方案。不过它数据模型和一些业务模型差异很大,会隐性增加开发的复杂度。如果让一个非常有经验的DBA通过MySQL的表结构去表达微博产品所需要的数据结构,他也会感到非常吃力。关系模型适宜去表达形态类似于“课程表”、“成绩单”这样的数据结构。而像“关注关系”、“评论”、“回复”这样的结构化的数据,如果要使用关系模型,我们需要将它们进行变形,然后填入到“课程表”和“成绩单”中来。在Facebook的时代,其他一些数据模型要么就不够优秀,要么就不够成熟,要么就不够开放,MySQL是当时唯一的选择。我们今天又有哪些更多更好的选择呢?

(2). 键值模型

输入:set a "this is a string"
输出:OK
输入:get a
输出:"this is a string"

一个数据库可以完成上面这样的操作,就是一个键值存储数据库了。“不对!”一个兄台马上跳了出来,“这不是memcached吗?”以redis为代表的键值存储数据库确实和memcached有类似的文本接口,但它们之间有两个大的差别:1.键值存储数据库是可以持久化的;2.它提供了更丰富的数据结构和功能。

以redis为例,在文本接口中键入命令:“sava”,redis就会生成一个“dump.rdb”的文件,记录下键值存储引擎中存储的所有内容。通过简单的文本接口,可以对键值对进行增删改的操作。键值存储引擎并不在意“值”的内部结构,它依赖客户端对“值”进行解释和管理。文本接口是效率最高的接口形式,redis和传说中的memcached一样,有接近每秒1万次的响应能力。很多开发者都认为Memcached完全基于内存,而Redis具有持久化保存特性,即使是异步的,Redis也不可能比Memcached快。但是测试结果基本是Redis占绝对优势。redis支持5种丰富的数据类型:string、hashes、lists、sets、sorted set,对每一种数据类型提供了很多丰富的操作命令,方便程序实现一些数据操作的需求。和memcached一样,redis的所有数据都得存储在内存之中,存储容量受到内存大小的限制。回忆第一章1.3节的分析,JavaScript的对象模型在某种意义上也是一种key-value模型,便于和redis配合使用。由于redis的简单和强大,我们下一节将通过一个例程来演示Node.js如何连接redis数据库。

(3). 文档模型
以MongoDB为代表的文档模型数据库,是非关系数据库当中功能最丰富,最像关系数据库的一种。它支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。正因为它的功能强大,所以它的配置和使用相对复杂,在使用过程中还会有一些不稳定的因素出现。如果你希望快速开发出产品,我们建议你不要一上来就搭一个MongoDB集群。

(4). 列式存储模型
以HBase为代表的列式存储数据库,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。我们将在第7章,围绕Node.js和HBase,详细学习云计算的前沿技术。

(5). 图形数据库

真实世界的普遍联系模型是图。图形数据库非常便于对真实世界的各种对象事物建模,如社交图谱、组织关系。Neo4j是一个典型的图形数据库。Neo4j提供了大规模可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图像,可以扩展到多台机器并行运行。相对于关系数据库来说,图形数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询。下图就是neo4j数据模型。

我们清楚地知道,这代表着数据库技术的发展方向。只不过,neo4j还属于新生事物,开发不够稳定,性能有待认证,学习成本高。下面我们就对模型最简单、部署最方便的一种持久化数据模型redis进行演示。如果你要快速搭建一个十万级用户的应用,相信它会是你最好的选择。


2.2 Node.js连接操作redis数据库

在很多场景下,redis可以取代memcached,为你的应用服务提供在大并发条件下的快速响应的数据持久化支持。在数据量的规模比较小的情况下,可以说redis是你最好的选择。redis的数据需要存放在内存中,这是它信息容量的边界条件。并且在数据量增大的情况下(800万条记录),redis的读写性能会出现瀑布型的下降。下面两篇文章说明了这个问题。
《redis千万级的数据量的性能测试》
《redis不同数据量下的性能表现》
这也就是上面提到“十万级用户的应用”的原因。不过,对于新兴互联网应用来说,我们应该更多地考虑怎么样获得十万用户,而不是用户超过十万以后的性能问题。然而,分析技术的发展,大数据的存储与处理问题,已经超越了大并发大流量的问题,成为了影响系统性能的最主要瓶颈。这也就是问什么云计算技术越来越重要的原因。
在windows下安装redis非常容易。

下载地址:{官网} {微盘}

解压文件,运行对应版本的“redis-server.exe”,即可开启redis服务器。“redis-cli.exe”是可以操作数据库的命令行工具。
对于redis的数据结构和命令,文档《Redis学习笔记.pdf》讲得比较详细:

下载地址:{微盘}

安装Node.js的redis连接模块,执行如下命令

C:\>cd "Program Files\nodejs"
C:\Program Files\nodejs>npm install -g redis

如果我们使用webstorm开发,配置开发环境。在Run/Debug Configuration中,加入环境变量:“NODE_PATH=C:\Program Files\nodejs\node_modules”。除了编辑器的各种功能外,webstorm对Node.js有很好的调试功能。操作简单,多尝试就能学会。我们就来调试下面这个例程吧:
例程2:

demo2.js如下:

/**
 * Date: 12-3-11
 * 演示程序2
 * 说明: 连接redis,并进行读写
 */
var http = require("http");
var redis=require("redis");
var client = redis.createClient();
var i = 1;

http.createServer(
    function (request, response) {

        response.writeHead(200, {"Content-Type":"text/html; charset=UTF-8"});

        response.write("欢迎您第" + i + "次访问服务器!<br>Welcome!<br>");
        client.set(["demo2_key", "服务器访问被访问次数: i = " + i]);
        client.get(["demo2_key"], function(err, result){
            console.log(result);
            response.write(result);
            response.end();
        });
        i++;
    }).listen(80);

console.log("服务器开启");

加几个断点,看看内部数据结构,读懂上面这段代码,Node.js似乎就是这么简单!

本文目录:《一个周末掌握IT前沿技术之node.js篇》
1.《Node.js与javascript》
2.《Node.js与redis》
3.《Node.js与服务端模板引擎》
4.《Node.js与Restful API》
5.《Node.js与Nginx》
6.《Node.js与客户端模板引擎》
7.《Node.js与HBase》
文本粗陋,欢迎斧正!欢迎投稿!原创文章,转载请链接。
联系邮箱:(it.Web.technical#gmail.com)
IT技术精研院
 

Leave a Reply

无觅相关文章插件,快速提升流量