iOS web缓存策略以及手动清除缓存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS web缓存策略以及手动清除缓存相关的知识,希望对你有一定的参考价值。

参考技术A 当我们使用webview加载html资源时,本质上就是向服务器索取资源的http请求过程,如果我们不注意资源的缓存策略的话,就可能会造成这样那样的问题,比如:实时性要求较高的功能却老是走缓存不更新,有些基本不会变动的页面却又每次都重新去服务器拉请求。

ios自带的缓存策略,提供了一个内存和磁盘混合的缓存,一共有7种缓存策略,使用较多的是其中的四种( 下方编号1,2,5,6 )

上面介绍了iOS自带的缓存控制 NSURLRequestCachePolicy ,也说到当 NSURLRequestCachePolicy 设为默认的 NSURLRequestUseProtocolCachePolicy 时,主要是根据http的缓存策略来决定是否使用缓存。

那么就简单的介绍一下,http的缓存控制和缓存校验。

在http中,控制缓存开关的字段有两个,Pragma和Cache-Control

Pragma有两个字段no-cache和expires,当pragma为no-cache时表示禁用缓存,expires的值是一个GMT时间,表示该缓存的有效时间。但是已经被逐步抛弃了,有些网站为了向下兼容还保留了这两个字段。

Cache-Control除了在响应中使用,在请求中也可以使用。

在请求中使用,Cache-Control可选的值有:

在响应中使用,Cache-Control可选的值有:

在缓存中,我们需要一个机制来验证缓存是否有效。比如服务器的资源更新了,客户端需要及时刷新缓存;又或者客户端的资源过了有效期,但服务器上的资源还是旧的,此时不需要重新发送。缓存校验就是用来解决这些问题的,在http1.1中,主要关注下 Last-Modified 和 etag 这两个字段。

服务端在返回资源时,会将该资源的最后更改时间通过 Last-Modified 字段返回给客户端。客户端下次请求时通过 If-Modified-Since 或者 If-UnModified-Since 带上 Last-Modified ,服务端检查该时间是否与服务器的最后修改时间一致:如果一致,则返回304状态码,不反悔资源;如果不一致,则返回200和修改后的资源,并带上新的时间。

单纯的以修改时间来判断还是有缺陷,比如文件的最后修改时间变了,但内容没变。对于这样的情况,我们可以使用etag来处理。
etag的方式是这样:服务器通过某个算法对资源进行计算,取得一串值(类似于文件的md5值),之后将该值通过etag返回给客户端,客户端下次请求时通过If-None-Match或If-Match带上该值,服务器对该值进行对比校验:如果一致则不要返回资源。

当我们的webview缓存到一定的峰值的时候,需要手动的清除一下wenview的缓存,方法如下:

找出web缓存的路径,清空该路径

webKit除了清除缓存的API

觉得有用,请帮忙点亮红心

Better Late Than Never!
努力是为了当机会来临时不会错失机会。
共勉!

Nginx缓存

开启三台虚拟机
192.168.80.100         Nginx
192.168.80.101         web1
192.168.80.102         web2

提供与Squid类似的缓存,把URL以及相关信息当成key,用MD5编码哈希后,把数据文件保存在硬盘上,并且只能为指定的URL或者状态码设置过期时间,并不支持类似 squid的purge命令来手动清除指定缓存页面,但是可以通过第三方的ngx_cache_purge来清除指定的URL缓存
Nginx的缓存加速功能是由proxy_cache(用于反向代理和静态缓存)和fastcgi_cache(PHP动态缓存)两个功能模块完成

反向代理:proxy_pass 转发
Nginx缓存特点:
缓存稳定,运行速度与Squid相差无几(因为都使用硬盘缓存)
对多核CPU的利用率比其他的开源软件好
支持高并发请求数,能同时承受更多的访问请求
nginx有两段缓存:
共享内存(存储键和缓存对象元数据)
磁盘空间:存储数据
Nginx缓存、Varnish、Squid对比
Squid:应用较早,支持传统、透明、反向等功能的一款应用软件,设置较复杂,一般配合CDN
Varnish:新兴软件,设计简单,使用内存缓存数据(快)
Nginx缓存:需通过调用模块实现缓存功能,基于硬盘缓存数据

nginx要定义缓存,需要以下配置:
proxy_cache_path:不能定义在server{}上下文中 
官方帮助手册:https://docs.nginx.com/nginx/admin-guide/
实战:nginx缓存
三台虚拟机都要启动:
systemctl stop firewalld     //关闭防火墙
setenforce 0                      //关闭监控
yum install lrz* -y        //安装上传软件
再把nginx-1.13.5.tar
ngx_cache_purge-2.3.tar
pcre-8.41.tar拉入

技术图片

解压软件包:
tar xf ngx_cache_purge-2.3.tar.gz -C /opt/
tar xf pcre-8.41.tar.gz -C /opt/
tar xf nginx-1.13.5.tar.gz -C /opt/
cd /opt/nginx-1.13.5/

技术图片

yum install -y zlib-devel   //安装插件

yum install -y gcc gcc-c++ make
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-pcre=/opt/pcre-8.41 --add-module=/opt/ngx_cache_purge-2.3
make && make install
useradd -M -s /sbin/nologin nginx       //创建一个程序用户
cd
ln -s /usr/local/nginx/conf/nginx.conf /etc/        //软链接
vi /etc/nginx.conf 
修改新增以下内容:
user  nginx nginx;
……
error_log  logs/error.log  info;前面的#去掉 
pid的#去掉

use epoll; //新增 ,事件驱动模型

default_type  application/octet-stream;    #默认文件类型
        charset utf-8; //新增

tcp_nopush  on; //去掉#号

keepalive_timeout  65; //在当前行下面新增,连接超时时间
        tcp_nodelay on;
        client_body_buffer_size 512k;
        proxy_connect_timeout 5;   #跟后端服务器连接超时时间,发起握手等候响应时间
        proxy_read_timeout 60;   #连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理
        proxy_send_timeout 5;   #后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据
        proxy_buffer_size 16k;   #代理请求缓冲区,会保存用户的头信息以供nginx进行处理
        proxy_buffers 4 64k;   #nginx保存单个用几个buffer最大用多少空间
        proxy_busy_buffers_size  128k;  #系统很忙时候可以申请最大的proxy_buffers
        proxy_temp_file_write_size 128k;   #proxy缓存临时文件的大小
#以下两行是开启nginx缓存功能的配置:
        proxy_temp_path /var/cache/nginx/cache_temp;
#创建缓存的时候可能生成一些临时文件存放的位置,自动创建
        proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#定义缓存存储目录;缓存级别,子目录级别,表示缓存目录的一级子目录是1个字符,二级子目录是2个字符;建立共享缓存,缓存数据元数据的空间,查缓存时,先从此空间查找,然后到相应目录中查找;缓存的时间;缓存空间大小
        upstream backend_server{
                server 192.168.80.101:80 weight=1 max_fails=2 fail_timeout=30s;
                server 192.168.80.102:80 weight=1 max_fails=2 fail_timeout=30s;
}   加权轮询

location / {
                proxy_next_upstream http_502 http_504 error timeout invalid_header;   #出现502-504或错误,会跳过此台服务器访问下一台服务器
                proxy_cache cache_one;  #启用名为cache_one缓存
                proxy_cache_valid 200 304 12h;   #状态码,有效时间12小时,其余状态码10分钟过期
                proxy_cache_key $host$uri$is_args$args;   #缓存key,通过唯一key来进行hash存取
                proxy_set_header Host $host;  #增加头部信息,方便观察客户端respoce是否命中
                proxy_set_header X-Forwarded-For $remote_addr;  #后端节点机器获取客户端真实ip,$remote_addr代表客户端的ip地址,
                proxy_pass http://backend_server;    请求转向
                }

技术图片
技术图片
技术图片
技术图片

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/         //软连接到$PATH环境变量中,方便系统识别
nginx -t   //检查nginx语法错误

技术图片

mkdir -p /var/cache/nginx/cache_temp     //创建缓存目录
mkdir /var/cache/nginx/proxy_cache      //创建代理目录
nginx -t      //检查nginx语法错误

技术图片

nginx        //启动nginx服务
netstat -anpt | grep nginx

技术图片

在另一台虚拟机搭建一个web服务器:web1(80.101)
yum install -y httpd       //安装http
vi /etc/httpd/conf/httpd.conf
把ServerName www.example.com:80 前面#删除
echo "<h1>192.168.80.101</h1>" > /var/www/html/index.html
systemctl start httpd
在另一台虚拟机搭建一个web服务器:web2(80.102)
yum install -y httpd       //安装http
vi /etc/httpd/conf/httpd.conf
把ServerName www.example.com:80 前面#删除
echo "<h1>192.168.80.102</h1>" > /var/www/html/index.html
systemctl start httpd
在浏览器上输入:
http://192.168.80.101/

技术图片

http://192.168.80.102/

技术图片

http://192.168.80.100/

技术图片

cd /var/cache/nginx/proxy_cache
cd 8
cd 9e/
cd
curl -I 192.168.80.100

技术图片

vi /etc/nginx.conf
在server_name localhost;下添加
add_header  X-Via $server_addr;
add_header  X-Cache  "$upstream_cache_status  from  $server_addr";

技术图片

nginx -t
pkill -9 nginx
nginx
curl -I 192.168.80.100

技术图片

vi /etc/nginx.conf
把以下内容添加在/404.html上面:
location ~/purge(/.*) {
                        allow 127.0.0.1;
                        allow 192.168.80.0/24;
                        deny all;
                        proxy_cache_purge cache_one $host$1$is_args$args;
                }

技术图片

nginx -t
pkill -9 nginx
nginx

技术图片

http://192.168.80.100/purge/         //用来清除缓存

技术图片

以上是关于iOS web缓存策略以及手动清除缓存的主要内容,如果未能解决你的问题,请参考以下文章

缓存失效策略

☆前端优化:浏览器缓存技术介绍

具有LRU回收策略的Java缓存

Web缓存基础:术语HTTP报头和缓存策略

Web缓存基础:术语HTTP报头和缓存策略

Redis缓存简介以及缓存的更新策略