一、连接 MySQL 本章节我们将为大家介绍如何使用 Node.js 来连接 MySQL,并对数据库进行操作。
1.1 安装驱动 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) bigNumberStrings supportBigNumbers和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 安装驱动 接下来我们来实现增删改查功能。
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 安装驱动 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