闽公网安备 35020302035485号
5.Redis 的基础操作
var fs = require('fs');
// 堆代码 duidaima.com
// 执行阻塞I/O
var file = fs.readFileSync('/etc/passwd');
console.log(file);
// 执行非阻塞I/O
fs.readFile('/etc/passwd', function(err, file) {
if (err) return err;
console.log(file);
});
.使用 Node 包 fs 来处理文件.readFile() 是异步函数,会立刻返回并在后台运行
> db.user.find({email: 'ofan@skyshi.com'}).explain("executionStats")
有索引的查询> db.getCollection("user").createIndex({ "email": 1 }, { "name": "email_1", "unique": true })
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
两者之间扫描文件的数量相差巨大 ~ 1038:
| 方法 | 扫描文件 |
|---|---|
| 没有索引 | 1039 |
| 有索引 | 1 |
pm2 start app.js -i 0
如何使用 Winston 记录 –
功能
1.支持 4 个可以自由选择的日志等级,如:info、error、verbose、debug、silly 和 warnnpm install winston --save这里是使用 Winston 记录的基本配置:
const winston = require('winston');
let logger = new winston.Logger({
transports: [
new winston.transports.File({
level: 'verbose',
timestamp: new Date(),
filename: 'filelog-verbose.log',
json: false,
}),
new winston.transports.File({
level: 'error',
timestamp: new Date(),
filename: 'filelog-error.log',
json: false,
})
]
});
logger.stream = {
write: function(message, encoding) {
logger.info(message);
}
};
7. 使用 HTTP/2 而不是 HTTPconst async = require("async");
// 使用对象而不是数组
async.parallel({
task1: function(callback) {
setTimeout(function() {
console.log('Task One');
callback(null, 1);
}, 200);
},
task2: function(callback) {
setTimeout(function() {
console.log('Task Two');
callback(null, 2);
}, 100);
}
}, function(err, results) {
console.log(results);
// 结果相当于: {task2: 2, task1: 1}
});
在以上例子中,我们使用了 async.js 以异步的形式执行了两个任务。task 1 需要 200 毫秒完成,但是 task 2 不需要等待 task 1 完成后再执行 – 它在设定的 100 毫秒后执行。并行任务对 API 的性能有很大的影响。它减少了延迟并最大限度地减少了阻塞操作。:
| 方法 | 响应时间 |
|---|---|
| 不使用 Redis | 900ms |
| 使用 Redis | 0.621ms |
'use strict';
//定义需要的所有依赖项
const express = require('express');
const responseTime = require('response-time')
const axios = require('axios');
//加载 Express 框架
var app = express();
//创建在响应头中添加 X-Response-Time 的中间件
app.use(responseTime());
const getBook = (req, res) => {
let isbn = req.query.isbn;
let url = `https://www.googleapis.com/books/v1/volumes?q=isbn:${isbn}`;
axios.get(url)
.then(response => {
let book = response.data.items
res.send(book);
})
.catch(err => {
res.send('The book you are looking for is not found !!!');
});
};
app.get('/book', getBook);
app.listen(3000, function() {
console.log('Your node is running on port 3000 !!!')
});
以下是使用 Redis 的 Node:'use strict';
//定义需要的所有依赖项
const express = require('express');
const responseTime = require('response-time')
const axios = require('axios');
const redis = require('redis');
const client = redis.createClient();
//加载 Express 框架
var app = express();
//创建在响应头中添加 X-Response-Time 的中间件
app.use(responseTime());
const getBook = (req, res) => {
let isbn = req.query.isbn;
let url = `https://www.googleapis.com/books/v1/volumes?q=isbn:${isbn}`;
return axios.get(url)
.then(response => {
let book = response.data.items;
//设置string-key:缓存中的 isbn。以及缓存的内容: title
// 设置缓存的过期时间为 1 个小时(60分钟)
client.setex(isbn, 3600, JSON.stringify(book));
res.send(book);
})
.catch(err => {
res.send('The book you are looking for is not found !!!');
});
};
const getCache = (req, res) => {
let isbn = req.query.isbn;
//对照服务器的 redis 检查缓存数据
client.get(isbn, (err, result) => {
if (result) {
res.send(result);
} else {
getBook(req, res);
}
});
}
app.get('/book', getCache);
app.listen(3000, function() {
console.log('Your node is running on port 3000 !!!')
)};