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 而不是 HTTP
const 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 !!!') )};