缓存/Node多进程/转码

缓存

    // 使用cache-control 控制缓存策略,expires 控制缓存时间
    res.setHeader('cache-control','no-cache');//设置不缓存,这是个坑
    // 第一次请求时,服务器像浏览器发送了文件最后修改啊日期,
    // 浏览器再次向服务器发送请求时,会将当前的最后修改日期发送,如果服务器发现该日期是最新版,就会直接返回304.否则会发送新的文件.
    const server = http.createServer((req,res)=>{
        let {pathname} = url.parse(req.url);   
        // let gz = zlib.createGzip();
        // res.setHeader('content-encoding','gzip');
        // ins.pipe(gz).pipe(res);
        //获取并处理文件最后一次的修改日期
        fs.stat(`www${pathname}`,(err,stat)=>{
            if(err){
                res.writeHead(404);
                res.write('Not Found');
                res.end();
            }else{
                if(req.headers['if-modified-since']){//如果浏览器发送了版本日期
                    let reqdate = req.headers['if-modified-since'];//获取日期
                    let oDate = new Date(reqdate);//转换成Date日期
                    let tClient = Math.floor(oDate.getTime()/1000);//浏览器发送过来的日期
                    let tServer = Math.floor(stat.mtime.getTime()/1000);//服务器查到的日期
                    if(tServer>tClient){//如果服务器比较新,就发送新的
                        sendFileToClient();
                    }else{//使用缓存
                        res.writeHead(304);
                        res.write('Not Modified');
                        res.end();
                    }

                }else{//没发送版本日期的时候,直接发送文件
                    sendFileToClient();
                }
    
            }
            function sendFileToClient(){
                let ins =fs.createReadStream(`www${pathname}`);
                res.setHeader('Last-Modified',stat.mtime.toUTCString());//此处处理头,将最后一次文件的修改信息传给浏览器
                ins.pipe(res);
                ins.on('error',err=>{
                    res.writeHead(404);
                    res.write('Not Found');
                    res.end();
                })
            }
        })
    }); 

Node多进程

Node.js默认情况下是单进程与单线程的
使用cluster 、process 模块
多进程
    1. 是安全的,而且性能高.
    2. 普通程序不能创建进程,只有系统进程才可以创建进程.
    3. 进程是分裂出来(只有主进程可以分裂,子进程不可以分裂),分裂出来的两个进程执行的是同一套代码(即父子进程执行同一套代码).
    4. 父子进程之间可以分享句柄.
const cluster = require('cluster');
    const http = require('http');
    const cluster = require('cluster');//创建进程模块
    const os = require('os');//系统模块,用来获取当前主机有几个CPU
    const process = require('process');//控制进程模块
    if(cluster.isMaster){//判断是主进程,才可以分裂
        for(let i=0;i<os.cpus().length;i++){//控制有几个CPU就分裂几次
            cluster.fork();//进程分裂
        }
        console.log('主进程');
    }else{//如果是个子进程就开启一个服务器
        const server = http.createServer((req,res)=>{
            console.log(process.pid);//获取进程ID
            res.write('s')
            res.end();
        })
        server.listen(8087)
        console.log('子进程开启的8087服务器');
    }

数据库

数据库
    1. 服务端(下载的mysql数据库)
    2. 客户端(Navicat、NodeJS、JAVA、PHP等)

扩展

使用encodeURIComponent
使用encodeURIComponent('待转码字符') 在前端将数据转码,
使用decodeURIComponent('转码后的字符') 在服务器端将数据转回.
断点续传
使用content-range 进行断点续传操作.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,090评论 0 3
  • 第一章 前端三大语言:HTML(专门编写网页内容)、CSS(编写网页样式)、JS(专门编写网页交互行为) 能简写尽...
    fastwe阅读 4,712评论 0 0
  • HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。有些 App...
    咖啡绿茶1991阅读 6,588评论 0 7
  • 每个文本编辑器都有默认的编码方式(比如 UTF-8 编码),当我们保存文档的时候,可以选择编码方式,如果没有特意选...
    _于曼丽_阅读 5,468评论 0 1
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,614评论 0 21