一、连接 MySQL

本章节我们将为大家介绍如何使用 Node.js 来连接 MySQL,并对数据库进行操作。

1.1 安装驱动

1
cnpm install mysql

1.2 连接数据库

在以下实例中根据你的实际配置修改数据库用户名、及密码及数据库名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var mysql      = require('mysql');
var connection = mysql.createConnection({
host : '127.0.0.1',
user : 'node',
password : 'node#123',
database : 'nodedb'
});

connection.connect();

connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});

执行脚本输出结果为:

The solution is: 2

1.3 数据库连接参数

参数描述
host主机地址 (默认:localhost)
user用户名
password密码
port端口号 (默认:3306)
database数据库名
charset连接字符集(默认:'UTF8_GENERAL_CI',注意字符集的字母都要大写)
localAddress此IP用于TCP连接(可选)
socketPath连接到unix域路径,当使用 host 和 port 时会被忽略
timezone时区(默认:'local')
connectTimeout连接超时(默认:不限制;单位:毫秒)
stringifyObjects是否序列化对象
typeCast是否将列值转化为本地JavaScript类型值 (默认:true)
queryFormat自定义query语句格式化方法
supportBigNumbers数据库支持bigint或decimal类型列时,需要设此option为true (默认:false)
bigNumberStringssupportBigNumbers和bigNumberStrings启用 强制bigint或decimal列以JavaScript字符串类型返回(默认:false)
dateStrings强制timestamp,datetime,data类型以字符串类型返回,而不是JavaScript Date类型(默认:false)
debug开启调试(默认:false)
multipleStatements是否许一个query中有多个MySQL语句 (默认:false)
flags用于修改连接标志
ssl使用ssl参数(与crypto.createCredenitals参数格式一至)或一个包含ssl配置文件名称的字符串,目前只捆绑Amazon RDS的配置文件

更多说明可参见: https://github.com/mysqljs/mysql

1.4 数据库操作( CURD )

在进行数据库操作前,本章节用到的库表 SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
CREATE DATABASE nodedb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'node' @'%' IDENTIFIED BY 'node#123';
CREATE USER 'node' @'localhost' IDENTIFIED BY 'node#123';
GRANT ALL PRIVILEGES ON nodedb.* TO 'node' @'%' IDENTIFIED BY 'node#123';
GRANT ALL PRIVILEGES ON nodedb.* TO 'node' @'localhost' IDENTIFIED BY 'node#123';
FLUSH PRIVILEGES;

use nodedb;

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for `websites`
-- ----------------------------
DROP TABLE IF EXISTS `websites`;
CREATE TABLE `websites` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL DEFAULT '' COMMENT '站点名称',
`url` varchar(255) NOT NULL DEFAULT '',
`alexa` int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名',
`country` char(10) NOT NULL DEFAULT '' COMMENT '国家',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of `websites`
-- ----------------------------
BEGIN;
INSERT INTO `websites` VALUES ('1', 'Google', 'https://www.google.cm/', '1', 'USA'), ('2', '淘宝', 'https://www.taobao.com/', '13', 'CN'), ('3', '菜鸟教程', 'http://www.runoob.com/', '4689', 'CN'), ('4', '微博', 'http://weibo.com/', '20', 'CN'), ('5', 'Facebook', 'https://www.facebook.com/', '3', 'USA');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

1.4.1 查询数据

将上面我们提供的 SQL 文件导入数据库后,执行以下代码即可查询出数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

var mysql = require('mysql');
var connection = mysql.createConnection({
host : '127.0.0.1',
user : 'node',
password : 'node#123',
database : 'nodedb'
});

connection.connect();

var sql = 'SELECT * FROM websites';
//查
connection.query(sql,function (err, result) {
if(err){
console.log('[SELECT ERROR] - ',err.message);
return;
}

console.log('select-start');
console.log(result);
console.log('select-end');
});

connection.end();

执行脚本输出就结果为:

select-start
[
RowDataPacket {
id: 1,
name: 'Google',
url: 'https://www.google.cm/',
alexa: 1,
country: 'USA'
},
RowDataPacket {
id: 2,
name: '淘宝',
url: 'https://www.taobao.com/',
alexa: 13,
country: 'CN'
},
RowDataPacket {
id: 3,
name: '菜鸟教程',
url: 'http://www.runoob.com/',
alexa: 4689,
country: 'CN'
},
RowDataPacket {
id: 4,
name: '微博',
url: 'http://weibo.com/',
alexa: 20,
country: 'CN'
},
RowDataPacket {
id: 5,
name: 'Facebook',
url: 'https://www.facebook.com/',
alexa: 3,
country: 'USA'
}
]
select-end

1.4.2 插入数据

我们可以向数据表 websties 插入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

var mysql = require('mysql');
var connection = mysql.createConnection({
host : '127.0.0.1',
user : 'node',
password : 'node#123',
database : 'nodedb'
});

connection.connect();

var addSql = 'INSERT INTO websites(Id,name,url,alexa,country) VALUES(0,?,?,?,?)';
var addSqlParams = ['博客网站', 'https://www.wno704.com','23453', 'CN'];
//增
connection.query(addSql,addSqlParams,function (err, result) {
if(err){
console.log('[INSERT ERROR] - ',err.message);
return;
}

console.log('insert-start');
//console.log('INSERT ID:',result.insertId);
console.log('INSERT ID:',result);
console.log('insert-end');
});

connection.end();

执行脚本输出就结果为:

insert-start
INSERT ID: OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 6,
serverStatus: 2,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
insert-end

执行成功后,查看数据表,即可以看到添加的数据:

1.4.3 更新数据

我们也可以对数据库的数据进行修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

var mysql = require('mysql');

var connection = mysql.createConnection({
host : '127.0.0.1',
user : 'node',
password : 'node#123',
database : 'nodedb'
});

connection.connect();

var modSql = 'UPDATE websites SET name = ?,url = ? WHERE Id = ?';
var modSqlParams = ['博客本地地址', 'https://127.0.0.1',6];
//改
connection.query(modSql,modSqlParams,function (err, result) {
if(err){
console.log('[UPDATE ERROR] - ',err.message);
return;
}

console.log('update-start');
console.log('UPDATE affectedRows',result.affectedRows);
console.log('update-end');
});

connection.end();

执行基本输出就结果为:

update-start
UPDATE affectedRows 1
update-end

执行成功后,查看数据表,即可以看到更新的数据:

1.4.4 删除数据

我们可以使用以下代码来删除 id 为 6 的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

var mysql = require('mysql');
var connection = mysql.createConnection({
host : '127.0.0.1',
user : 'node',
password : 'node#123',
database : 'nodedb'
});

connection.connect();

var delSql = 'DELETE FROM websites where id=6';
//删
connection.query(delSql,function (err, result) {
if(err){
console.log('[DELETE ERROR] - ',err.message);
return;
}

console.log('delete-start');
console.log('DELETE affectedRows',result.affectedRows);
console.log('delete-end');
});

connection.end();

执行基本输出就结果为:

delete-start
DELETE affectedRows 1
delete-end

执行成功后,查看数据表,即可以看到 id=6 的数据已被删除:

二、连接 MongoDB

MongoDB是一种文档导向数据库管理系统,由C++撰写而成。

本章节我们将为大家介绍如何使用 Node.js 来连接 MongoDB,并对数据库进行操作。

2.1 安装驱动

1
cnpm install mongodb

接下来我们来实现增删改查功能。

2.3 创建数据库

要在 MongoDB 中创建一个数据库,首先我们需要创建一个 MongoClient 对象,然后配置好指定的 URL 和 端口号。

如果数据库不存在,MongoDB 将创建数据库并建立连接。

1
2
3
4
5
6
7
8
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/nodedb";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
console.log("数据库已创建!");
db.close();
});

2.4 创建集合

我们可以使用 createCollection() 方法来创建集合:

1
2
3
4
5
6
7
8
9

var MongoClient = require('mongodb').MongoClient;

var url = 'mongodb://localhost:27017/nodedb';
MongoClient.connect(url, { useNewUrlParser: true }, function (err, db) {
if (err) throw err;
console.log('数据库已创建');
db.close();
});

2.5 创建集合

我们可以使用 createCollection() 方法来创建集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

var MongoClient = require('mongodb').MongoClient;

var url = 'mongodb://localhost:27017/nodedb';
MongoClient.connect(url, { useNewUrlParser: true }, function (err, db) {
if (err) throw err;
console.log('数据库已创建');
var dbase = db.db("nodedb");
dbase.createCollection('site', function (err, res) {
if (err) throw err;
console.log("创建集合!");
db.close();
});
});

2.6 数据库操作( CURD )

与 MySQL 不同的是 MongoDB 会自动创建数据库和集合,所以使用前我们不需要手动去创建。

2.6.1 插入数据

以下实例我们连接数据库 nodedb 的 site 表,并插入一条数据条数据,使用 insertOne():

1
2
3
4
5
6
7
8
9
10
11
12
13
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
var myobj = { name: "我的博客", url: "www.wno704.com" };
dbo.collection("site").insertOne(myobj, function(err, res) {
if (err) throw err;
console.log("文档插入成功");
db.close();
});
});

执行脚本输出就结果为:

文档插入成功

从输出结果来看,数据已插入成功。

我们也可以打开客户端查看数据,如:

如果要插入多条数据可以使用 insertMany():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
var myobj = [
{ name: '菜鸟工具', url: 'https://c.runoob.com', type: 'cn'},
{ name: 'Google', url: 'https://www.google.com', type: 'en'},
{ name: 'Facebook', url: 'https://www.google.com', type: 'en'}
];
dbo.collection("site").insertMany(myobj, function(err, res) {
if (err) throw err;
console.log("插入的文档数量为: " + res.insertedCount);
db.close();
});
});

res.insertedCount 为插入的条数。

2.6.2 查询数据

可以使用 find() 来查找数据, find() 可以返回匹配条件的所有数据。 如果未指定条件,find() 返回集合中的所有数据。

1
2
3
4
5
6
7
8
9
10
11
12
13

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
dbo.collection("site"). find({}).toArray(function(err, result) { // 返回集合中所有数据
if (err) throw err;
console.log(result);
db.close();
});
});

以下实例检索 name 为 "我的博客" 的实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
var whereStr = {"name":'我的博客'}; // 查询条件
dbo.collection("site").find(whereStr).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});

执行以下命令输出就结果为:

[
{
_id: 5f8ae4edecbf1619e82b0742,
name: '我的博客',
url: 'www.wno704.com'
}
]

2.6.3 更新数据

我们也可以对数据库的数据进行修改,以下实例将 name 为 "我的博客" 的 url 改为 http://127.0.0.1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
var whereStr = {"name":'我的博客'}; // 查询条件
var updateStr = {$set: { "url" : "http://127.0.0.1" }};
dbo.collection("site").updateOne(whereStr, updateStr, function(err, res) {
if (err) throw err;
console.log("文档更新成功");
db.close();
});
});

执行成功后,进入 mongo 管理工具查看数据已修改:

如果要更新所有符合条的文档数据可以使用 updateMany():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
var whereStr = {"type":'en'}; // 查询条件
var updateStr = {$set: { "url" : "https://www.google.com" }};
dbo.collection("site").updateMany(whereStr, updateStr, function(err, res) {
if (err) throw err;
console.log(res.result.nModified + " 条文档被更新");
db.close();
});
});

result.nModified 为更新的条数。

2.6.4 删除数据

以下实例将 name 为 "我的博客" 的数据删除 :

1
2
3
4
5
6
7
8
9
10
11
12
13
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
var whereStr = {"name":'我的博客'}; // 查询条件
dbo.collection("site").deleteOne(whereStr, function(err, obj) {
if (err) throw err;
console.log("文档删除成功");
db.close();
});
});

执行成功后,进入 mongo 管理工具查看数据已删除:

如果要删除多条语句可以使用 deleteMany() 方法

以下实例将 type 为 en 的所有数据删除 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
var whereStr = { type: "en" }; // 查询条件
dbo.collection("site").deleteMany(whereStr, function(err, obj) {
if (err) throw err;
console.log(obj.result.n + " 条文档被删除");
db.close();
});
});

obj.result.n 删除的条数。

2.6.5 排序

排序 使用 sort() 方法,该方法接受一个参数,规定是升序(1)还是降序(-1)。

例如:

1
2
{ type: 1 }  // 按 type 字段升序
{ type: -1 } // 按 type 字段降序

按 type 升序排列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
var mysort = { type: 1 };
dbo.collection("site").find().sort(mysort).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});

2.6.6 查询分页

如果要设置指定的返回条数可以使用 limit() 方法,该方法只接受一个参数,指定了返回的条数。

1
2
3
4
5
6
7
8
9
10
11
12
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
dbo.collection("site").find().limit(2).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});

如果要指定跳过的条数,可以使用 skip() 方法。

1
2
3
4
5
6
7
8
9
10
11
12
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
dbo.collection("site").find().skip(2).limit(2).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});

2.6.7 连接操作

mongoDB 不是一个关系型数据库,但我们可以使用 $lookup 来实现左连接。

例如我们有两个集合数据分别为:

集合1:orders

1
2
3
[
{ _id: 1, product_id: 154, status: 1 }
]

集合2:products

1
2
3
4
5
[
{ _id: 154, name: '笔记本电脑' },
{ _id: 155, name: '耳机' },
{ _id: 156, name: '台式电脑' }
]

$lookup 实现左连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://127.0.0.1:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
dbo.collection('orders').aggregate([
{ $lookup:
{
from: 'products', // 右集合
localField: 'product_id', // 左集合 join 字段
foreignField: '_id', // 右集合 join 字段
as: 'orderdetails' // 新生成字段(类型array)
}
}
]).toArray(function(err, res) {
if (err) throw err;
console.log(JSON.stringify(res));
db.close();
});
});

2.6.8 删除集合

我们可以使用 drop() 方法来删除集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("nodedb");
// 删除 test 集合
dbo.collection("site").drop(function(err, delOK) { // 执行成功 delOK 返回 true,否则返回 false
if (err) throw err;
if (delOK) console.log("集合已删除");
db.close();
});
});

2.7 使用 Promise

Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。

2.7.1 创建集合

以下实例使用 Promise 创建集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost/nodedb";
MongoClient.connect(url, { useNewUrlParser: true }).then((conn) => {
console.log("数据库已连接");
var dbase = conn.db("nodedb");
dbase.createCollection("site").then((res) => {
console.log("已创建集合");
}).catch((err) => {
console.log("数据库操作错误");
}).finally(() => {
conn.close();
});
}).catch((err) => {
console.log("数据库连接失败");
});

2.7.2 数据操作

现在我们在一个程序中实现四个连续操作:增加 、查询 、更改 、删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost/nodedb";
MongoClient.connect(url, { useNewUrlParser: true }).then((conn) => {
console.log("数据库已连接");
const test = conn.db("nodedb").collection("test");
// 增加
test.insertOne({ "site": "wno704.com" }).then((res) => {
// 查询
return test.find().toArray().then((arr) => {
console.log(arr);
});
}).then(() => {
// 更改
return test.updateMany({ "site": "wno704.com" },
{ $set: { "site": "127.0.0.1" } });
}).then((res) => {
// 查询
return test.find().toArray().then((arr) => {
console.log(arr);
});
}).then(() => {
// 删除
return test.deleteMany({ "site": "127.0.0.1" });
}).then((res) => {
// 查询
return test.find().toArray().then((arr) => {
console.log(arr);
});
}).catch((err) => {
console.log("数据操作失败" + err.message);
}).finally(() => {
conn.close();
});
}).catch((err) => {
console.log("数据库连接失败");
});

执行结果:

数据库已连接
[ { _id: 5f8aebe52d84ba44a8010871, site: 'wno704.com' } ]
[ { _id: 5f8aebe52d84ba44a8010871, site: '127.0.0.1' } ]
[]

2.7.3 用异步函数实现相同的数据操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost/nodedb";

async function dataOperate() {
var conn = null;
try {
conn = await MongoClient.connect(url);
console.log("数据库已连接");
const test = conn.db("nodedb").collection("site");
// 增加
await test.insertOne({ "site": "wno704.com" });
// 查询
var arr = await test.find().toArray();
console.log(arr);
// 更改
await test.updateMany({ "site": "wno704.com" },
{ $set: { "site": "127.0.0.1" } });
// 查询
arr = await test.find().toArray();
console.log(arr);
// 删除
await test.deleteMany({ "site": "127.0.0.1" });
// 查询
arr = await test.find().toArray();
console.log(arr);
} catch (err) {
console.log("错误:" + err.message);
} finally {
if (conn != null) conn.close();
}
}

dataOperate();

运行结果:

数据库已连接
[ { _id: 5f8aec7e316c6003207ad35c, site: 'wno704.com' } ]
[ { _id: 5f8aec7e316c6003207ad35c, site: '127.0.0.1' } ]
[]

运行结果完全一样。

很显然,异步函数是一种非常良好的编程风格,在多次使用异步操作的时候非常实用。

但是请勿在低于 7.6.0 版本的 node.js 上使用异步函数。

三、连接Redis

本章节我们将为大家介绍如何使用 Node.js 来连接 Redis,并对数据库进行操作。

3.1 安装驱动

1
cnpm install redis

3.2 连接Redis

1
2
3
4
5
6
7
8
9
10
11
12
13
//引入redis
var redis = require("redis");

//创建redis客户端
var client = redis.createClient("10007", "127.0.0.1");
//连接错误处理
client.on("error", function (error) {
console.log(error);
});
//redis验证 (如果redis没有开启验证,此配置可以不写)
//client.auth("123456");
//关闭redis连接
client.end(true);

3.3 数据库操作

3.3.1 string(字符串)存储与读取

我们先来看看如何存储和获取键/值对。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//引入redis
var redis = require("redis");

//创建redis客户端
var client = redis.createClient("10007", "127.0.0.1");
//连接错误处理
client.on("error", function (error) {
console.log(error);
});
//redis验证 (如果redis没有开启验证,此配置可以不写)
//client.auth("123456");

//设置数据
client.select('2', function(error){
if(error) {
console.log(error);
} else {
}
});

client.set('color','red',redis.print)
client.get('color',function (error,value) {
if(error) throw error;
console.log(value);
})

// set
client.set('name', 'flyname', function(error, res) {
if(error) {
console.log(error);
} else {
console.log(res);
//client.end(true);
}
});

// get
client.get('name', function(error, res){
if(error) {
console.log(error);
} else {
console.log(res);
}
// 关闭链接
client.end(true);
});

执行脚本,结果输出:

Reply: OK
red
OK
flyname

3.3.2 哈希表

哈希表有点类似ES6中的Map。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//引入redis
var redis = require("redis");

//创建redis客户端
var client = redis.createClient("10007", "127.0.0.1");
//连接错误处理
client.on("error", function (error) {
console.log(error);
});
//redis验证 (如果redis没有开启验证,此配置可以不写)
//client.auth("123456");

//设置数据
client.select('2', function(error){
if(error) {
console.log(error);
} else {
}
});

var obj = {
name:'sss',
age:223
}

client.hmset('kitty',obj,redis.print);

client.hget('kitty', 'age', function (error, value) {
if(error) {
console.log(error);
} else {
console.log(value);
//client.end(true);
}
});

client.hkeys('kitty', function (error, keys) {
if(error) {
console.log(error);
} else {
keys.forEach(function (key,i) {
console.log(key,i);
});
//client.end(true);
}
});


client.hgetall('kitty', function(error, res){
if(error) {
console.log(error);
} else {
console.log(res);
}
// 关闭链接
client.end(true);
});

运行,结果如下:

Reply: OK
223
name 0
age 1
{ name: 'sss', age: '223' }

3.3.3 链表

Redis链表类似JS数组,lpush向链表中添加值,lrange获取参数start和end范围内的链表元素, 参数end为-1,表明到链表中最后一个元素。
注意:随着链表长度的增长,数据获取也会逐渐变慢(大O表示法中的O(n))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//引入redis
var redis = require("redis");

//创建redis客户端
var client = redis.createClient("10007", "127.0.0.1");
//连接错误处理
client.on("error", function (error) {
console.log(error);
});
//redis验证 (如果redis没有开启验证,此配置可以不写)
//client.auth("123456");

//设置数据
client.select('2', function(error){
if(error) {
console.log(error);
} else {
}
});



client.lpush('tsaks', 'Paint the house red.',redis.print);
client.lpush('tsaks', 'Paint the house green.',redis.print);
client.lrange('tsaks', 0, -1, function (error, items) {
if(error) {
console.log(error);
} else {
items.forEach(function (item, i) {
console.log(item,i)
})
client.end(true);
}
});

运行,结果如下:

Reply: 1
Reply: 2
Paint the house green. 0
Paint the house red. 1

3.3.4 集合

类似JS中的Set,集合中的元素必须是唯一的,其性能: 大O表示法中的O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//引入redis
var redis = require("redis");

//创建redis客户端
var client = redis.createClient("10007", "127.0.0.1");
//连接错误处理
client.on("error", function (error) {
console.log(error);
});
//redis验证 (如果redis没有开启验证,此配置可以不写)
//client.auth("123456");

//设置数据
client.select('2', function(error){
if(error) {
console.log(error);
} else {
}
});



client.sadd('IP', '125.192.40.2',redis.print);
client.sadd('IP', '125.192.40.3',redis.print);
client.sadd('IP', '125.192.40.4',redis.print);

client.smembers('IP', function (error, members) {
if(error) {
console.log(error);
} else {
console.log(members);
//client.end(true);
}
});


client.smembers('IP', function (error, members) {
if(error) {
console.log(error);
} else {
members.forEach(function (item, i) {
console.log(item,i)
})
client.end(true);
}
});

运行,结果如下:

1
2
3
4
5
6
7
Reply: 0
Reply: 0
Reply: 0
[ '125.192.40.4', '125.192.40.3', '125.192.40.2' ]
125.192.40.4 0
125.192.40.3 1
125.192.40.2 2

3.3.4 信道

Redis超越了数据存储的传统职责,它还提供了信道,信道是数据传递机制,提供了发布/预定功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//引入redis
var redis = require("redis");

//创建redis客户端
var clientA = redis.createClient("10007", "127.0.0.1");
var clientB = redis.createClient("10007", "127.0.0.1");

//redis验证 (如果redis没有开启验证,此配置可以不写)
//clientA.auth("123456");
//clientB.auth("123456");

//设置数据
clientA.select('2', function(error){
if(error) {
console.log(error);
} else {
}
});
clientB.select('2', function(error){
if(error) {
console.log(error);
} else {
}
});

//连接错误处理
clientA.on("message", function (channel, message) {
console.log('client A message->channel: %s->%s',channel, message);
//client.end(true);
});

clientA.on("subscribe", function (channel, message) {
clientB.publish('main-chat-room', 'hello');
//client.end(true);
});

clientA.subscribe('main-chat-room');

上面代码中,clientA订阅了main_chat_room,这时clientA捕获到订阅事件,执行回调函数,clientB向main_chat_room发送了一条信息Hello world!
clientA接受到信息后,在控制台打印出了相关信息。

运行,结果如下:

client A message->channel: main-chat-room->hello