缓存(二)
时间:2019-10-28
本文章向大家介绍缓存(二),主要包括缓存(二)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一.缓存的概念
1. Buffer,Cache的区别:
buffer: 一般用于写操作,写缓冲。
cache: 一般用于读操作,读缓存。
它们都是解决速度不一致的问题,都设计到IO操作。
2.Cache的重点关注点:
1.存放位置(多级cache):
客户端(浏览器缓存)
内存(本地或者远程服务器)
硬盘(本地或者远程服务器)
2.过期时间: TTL
3.强制失效
4.Cache的命中率(重点): 一个完全没有命中率的cache没有意义。
二.浏览器缓存
1.缓存协商的定义:
浏览器和web服务器进行缓存的对话。
2.浏览器缓存的几种方式:
Last-Modified: 文件最后修改时间
Etag: MD5
Expires: 过期时间
Nginx设置方法:
location ~ .*\.(js|css){
expires 1h; #1小时过期
}
(如果在过期前发现js错了,需要改名或者加时间123.js变成123.js?201610)
Cache-Control: 解决客户端时间不对的问题
3.浏览器几种刷新方式的区别:
在地址栏敲击Enter键: 只要没有过期的直接使用缓存,所有缓存机制都生效。
F5或者刷新按钮: Expires不受影响,其他缓存机制都失效。
Ctrl+F5: 强制刷新,所有缓存机制都失效,相当于第一次访问网页。
二.CDN相关
1.CDN主要解决以下问题:
不同运营商的互联问题,BGP又贵。
用户和服务器之间网络传输距离长的问题。
现有服务器带宽有限。
提高用户的响应速度和成功率。
2.CDN的核心技术:
1.内容调度 - 智能dns(根据你的localDNS的Ip来判断)
2.监测系统 - 监测各个节点的链路状态和健康状态
3.内容分发 - 预缓存
4.过期刷新 - 缓存刷新
5.数据存储 - 文件的存储
6.用户配置中心 - saltstack ansible
7.计费系统
8.数据可视化 - 日志分析,日志下载
9.防攻击 - WAF
二.Nginx反向代理缓存配置
1.配置nginx反向代理缓存:
vim /usr/local/nginx/conf/proxy.conf
#cdn
proxy_temp_path /data/cdn_cache/proxy_temp_dir; #缓存的临时目录
proxy_cache_path /data/cdn_cache/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1d max_size=1g;
#缓存的目录,缓存级别1:2,缓存名称cache_one,内存缓存大小50M,自动清除1天没访问的文件,硬盘缓存大小1G.
proxy_connect_timeout 5;
proxy_send_timeout 60;
proxy_read_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404; #后端服务器出现500,502等异常后,可以分配到下一台服务器程序继续处理,提高平台访问成功率。
vim /usr/local/nginx/conf/vhost/bbs.conf
location ~ .*.(gif|jpg|png|bmp)$ {
proxy_pass http://image;
#Use Proxy Cache
proxy_cache cache_one; #匹配上面的缓存配置
proxy_cache_key "$host$request_uri";
add_header Cache "$upstream_cache_status"; #增加header头
proxy_cache_valid 200 304 301 302 8h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 2d;
}
mkdir -p /data/cdn_cache/proxy_cache_dir/
mkdir -p /data/cdn_cache/proxy_temp_dir
2.如何根据URL来删除缓存文件:
先查看缓存文件的头部信息:
head /data/cdn_cache/proxy_cache_dir/c/7c/9857f1ea1acafc1697b2121f36f7f7cc
KEY: bbs.wmj.com/b.gif #这个是Key值,根据上面定义格式来生成的"$host$request_uri"
HTTP/1.1 200 OK
Date: Wed, 05 Jul 2017 07:59:18 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 05 Jul 2017 04:15:35 GMT
ETag: "2009e8-26ec-5538a40711f72"
Accept-Ranges: bytes
Content-Length: 9964
Connection: close
缓存文件名就是根据KEY值的MD5计算而来。
echo -n "bbs.wmj.com/b.gif" |md5sum
9857f1ea1acafc1697b2121f36f7f7cc -
文件路径”c/7c”分别是md5的最后一位和倒数2-3位来生成。
通过这个来定义“levels=1:2”
3.删除nginx缓存文件的脚本:
#!/bin/bash
#######################################################
#说明:
# 1.本脚本用于清除nginx缓存文件
# 2.查看你的nginx是根据什么作为key来hash的,我的设置是 proxy_cache_key $host$request_uri;
# 因此nginx会根据$host$request_uri作为key进行hash,因此可以模拟nginx对一个key进行再
# hash找到相应的文件路径,删除(具体可随意找个缓存文件 more 一下看看)
# 3.缓存设置 proxy_cache_path /data/cdn_cache/proxy_cache_dir/ levels=1:2 keys_zone=cache_one:6000m inactive=15d max_size=200g;
# 根据相应的配置,请做相应修改测试
# 4.uri格式请按照同级目录下rm_apk_list.txt中填写
#####################################################
while read -r line
do
md5uri=`echo -n $line | md5sum | awk '{ print $1 }'`
filepath=`echo "$md5uri" | awk '{print "/data/cdn_cache/proxy_cache_dir/"substr($0,length($0),1)"/"substr($0,length($0)-2,2)"/"$0}'`
rm -rf $filepath
done
/root/rm_apk.sh < rm_apk_list.txt #脚本执行命令
三.PHP的缓存机制
1.安装php的opcache:
参考资料:http://php.net/manual/zh/book.opcache.php
安装的时候: –enable-opcache
php.ini
zend_extension=opache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
2.动态内容静态化
3.PHP本地缓存:
php-yac
原文地址:https://www.cnblogs.com/wuhg/p/11752099.html
- (cljs/run-at (JSVM. :all) "细说函数")
- 动手写个数字输入框2:起手式——拦截非法字符
- Linux安装DNSmasq搭建自己的公共DNS
- (cljs/run-at (JSVM. :all) "一次说白DataType、Record和Protocol")
- 虚拟主机多域名转向
- .top域名名声大噪,这枚单字符10天建站上线!
- 编译期类型检查 in ClojureScript
- Chrome Extension in CLJS —— 搭建开发环境
- 双拼域名lanben.com以三万元成交
- 动手写个数字输入框3:痛点——输入法是个魔鬼
- Thinking in React Implemented by Reagent
- ssm整合Redis
- 前端魔法堂——调用栈,异常实例中的宝藏
- 开启MySQL的binlog日志
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Keras SGD 随机梯度下降优化器参数设置方式
- php图片裁剪函数
- 浅谈Python中的继承
- 如何对python的字典进行排序
- python怎么判断模块安装完成
- 关于Theano和Tensorflow多GPU使用问题
- Python魔术方法专题
- python中get和post有什么区别
- workerman结合laravel开发在线聊天应用的示例代码
- php+js实现裁剪任意形状图片
- keras实现theano和tensorflow训练的模型相互转换
- python中round函数如何使用
- PHP array_reduce()函数的应用解析
- php微信公众号开发之简答题
- php5.x禁用eval的操作方法