缓存/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{
            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 进行断点续传操作.

你可能感兴趣的:(缓存/Node多进程/转码)