缓存机制
Posted sharesdk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存机制相关的知识,希望对你有一定的参考价值。
缓存 缓存就是数据交换的缓冲区(称作Cache)
缓存工作的原则,就是 “引用的局部性”,这可以分为时间局部性和空间局部性。
CPU 缓存、网络缓存、磁盘缓存、数据缓存、WEB缓存等。
web 应用缓存场景
访问一个地址 从浏览器缓存 路由缓存 DNS缓存 递归搜索 web缓存 数据缓存
一、HTTP 缓存:
1、HTTP 协议 超文本传输协议
HTTP 报文就是浏览器和服务器间通信时发送及响应的数据块。
浏览器向服务器请求数据,发送请求(request)报文;服务器向浏览器返回数据,返回响应(response)报文。
报文信息主要分为两部分:
A、包含属性的首部(header) 附加信息(cookie,缓存信息等)与缓存相关的规则信息,均包含在header中;
B、包含数据的主体部分(body) HTTP请求真正想要传输的部分;
HTTP 缓存有多种规则,Expires ;通过web 服务器实现缓存机制。
Apache 缓存
mod_cache 模块
Apache 的缓存方式也有两种,一种是基于硬盘文件的缓存,由 mod_disk_cache 实现,另一种是使用内存缓存,由 mod_mem_cache 实现。URL 的请求方式必须是 GET 方式。
基于硬盘文件存储的缓存 :
<IfModule mod_cache.c> CacheDefaultExpire 86400 <IfModule mod_disk_cache.c> CacheEnable disk /tmp/file CacheRoot /tmp/apacheCache CacheDirLevels 5 CacheDirLength 4 CacheMaxFileSize 1048576 CacheMinFileSize 10 </IfModule> </IfModule>
CacheDefaultExpire:设定缓存过期的时间(秒),默认是1小时,只有当缓存的文档没有设置过期时间或最后修改时间时这个指令才会生效.
CacheEnable:启用缓存,第1个参数是缓存类弄,这里当然是 disk了,第2个参数是缓存路径,指的是 url 路径,这里是缓存所有的东西.
CacheRoot:缓存文件所在的目录,运行 Apache 的用户(如daemon 或 nobody)要能对其进行读写,如果不清楚的话可以直接设置成 777,请手动建立该目录并设置好访问权限
CacheDirLevels:缓存目录的深度,默认是3,这里设置为5
CacheDirLength:缓存目录名的字符长度,默认是4,这里设置为5
CacheMaxFileSize 和 CacheMaxFileSize: 缓存文件的最大值和最小值(byte),当超过这个范围时将不再缓存,这里设置为 1M 和 10bytes
基于内存的缓存
<IfModule mod_cache.c> <IfModule mod_mem_cache.c> CacheEnable mem / MCacheMaxObjectCount 20000 MCacheMaxObjectSize 1048576 MCacheMaxStreamingBuffer 65536 MCacheMinObjectSize 10 MCacheRemovalAlgorithm GDSF MCacheSize 131072 </IfModule> </IfModule>
CacheEnable:启用缓存,使用基于内存的方式存储
MCacheMaxObjectCount:在内存中最多能存储缓存对象的个数,默认是1009,这里设置为20000
MCacheMaxObjectSize:单个缓存对象最大为 1M,默认是10000bytes
MCacheMaxStreamingBuffer:在缓冲区最多能够放置多少的将要被缓存对象的尺寸,这里设置为 65536,该值通常小于100000或 MCacheMaxObjectSize 设置的值
MCacheMinObjectSize:单个缓存对象最小为10bytes,默认为1bytes
MCacheRemovalAlgorithm:清除缓存所使用的算法,默认是 GDSF,还有一个是LRU,可参考 Apache 的官方文档。
MCacheSize:缓存数据最多能使用的内存,单位是 kb,默认是100kb,这里设置为128M
Nginx 调优 配置cache 缓存 常见的 304 状态
proxy_temp_path /tmp/proxy_temp_dir; // 设置缓存位置 proxy_cache_path /tmp/proxy_cache_dir levels = 1:2 keys_zone = cache_one:200m inactive =1d max_size =30g; // 设置缓存区名称 内存缓存空间大小 1天内容没有访问自动清除 缓存设置大小 ;
Tomcat性能调优
开启压缩功能
compression="on"
通过ExpiresFilter设置资源缓存,可通过Expires
与 Cache-Control
控制资源何时过期。
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; res.setHeader("Cache-Control", "max-age=10"); // 第一次请求10s后过期 }
二、应用场景方式缓存分类有三大类
A、数据库缓存
B、静态缓存
C、动态缓存
一、数据库缓存:
1、MongoDB:是文档型的非关系型数据库,使用bson结构。其优势在于查询功能比较强大,能存储海量数据,缺点是比较消耗内存。使用os mmap机制缓存数据文件 所以会耗尽系统资源所有内存。
方案:集群多副本集;
应用:一般用来存放评论等半结构化数据,支持二级索引。 适合存储json类型数据,不经常变化。用于对象及JSON数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。
场景: 资讯 新闻;
2、Redis:内存 缓存技术 主要规则是 key-value存储系统;支持备份;还支持list,set,sorted set,hash 等众多数据结构。Redis使用单线程的IO复用模型,和Memcached类似,但它支持存储的value类型相对更多支持不同的排序 算法;可以将内存中的数据保持在磁盘中。
方案:一般主从模式,3.0之后集群哨兵模式;或者twemproxy部署简单快捷;可以直接在proxy进行读写、并转发请求给后端的redis;但是不适合超大流量系统。
应用:适合小数据文件 当数据不能剔除,数据需要落地时,redis更合适 类似用户信息文件;
3、Memcache:都是基于内存缓存技术 关系型数据缓存。
方案:也是分布式集群
原理:Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,Memcached 用一致性哈希环的方式,在客户端计算出分布位置。
应用:memacached基本上只支持kv存储,不支持枚举,持久化和复制等功能;
场景:视频信息资料 100K大数据文件;内存利用率比较高。
二、静态缓存
1、客户端缓存
浏览器缓存,也就是客户端缓存;一般是在 web 服务器上配置;
应用:
a、常见的nginx 的 expires 设置一个时间缓存;请求常见的 304 状态;请求未改动。
b、jsp 文件html 标签 expires
3、服务器端的静态缓存
服务器端也是主要分为磁盘缓存和内存缓存两大类;
1、Squid
squid 代理服务器;
场景应用:缓存静态页面和html 文件 图片 流媒体 等 ;(一般会禁止CGI 缓存)会缓存到内存和硬盘中;
a、透明代理 也是正向代理 不需要设置客户端 只设置网关服务器设置;
b、反向代理 结合智能DNS 实现的基本的CDN( 内容分发网络)框架;
squid 主要负责提供缓存加速以及访问控制;正向代理是对用户的一种代理操作。正向代理缓存 应用内部网络希望访问外部网络时缓存页面数据。
2、Varnish
varish是以内存作为共享容器的:内存缓存;内存的大小决定了它的缓存容量。相对于主要以硬盘为存储的squid来说要高效的多。它适合一些经常查询且变化不大的静态内容缓存。
Varnish与一般服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程;master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
3、CDN
CDN 是属于静态缓存加速。
CDN 是基于传统 nginx、squid、varnish 等 web 缓存技术,结合 DNS 智能解析的静态缓存加速技术。
CDN 的静态缓存技术核心主要在于两点:
节点缓存:对需要加速的网站应用,相应的静态资源通过内存缓存+磁盘缓存的方式缓存在服务器端。
精准调度:对访问的用户 ip 进行智能解析调度,实现就近缓存节点访问。
三、缓存 回收策略机制
1、基于空间
达到一定存储空间 按照策略移除数据。
2、基于容量
缓存条目限制 超过将旧的数据移除
3、基于时间
TTL 活存期限 设置一个时间段
TTI 空闲期 数据多久没有没有访问将从缓存中移除。
以上是关于缓存机制的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis关于复杂的SQL查询的处理&Mybatis的缓存机制
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题