缓存在大型网站架构中的应用

缓存的基本知识

在整个计算机体系构造中(无论是硬件层面还是软件层面),缓存都是无处不在的。

在计算机硬件构造中,由于两种介质的速度不匹配,高速介质在和低速介质交互时速度趋向低速方,这就导致了高速介质的资源闲置。而通过引入第三种介质(速度和成本介于两者中间),将低速方读写的部分内容数据保存在该介质中,高速方大多数情况下则无需和低速方直接交互,这样就能整体提升了交互的性能。这就是计算机体系中缓存的由来。比较典型的就是CPU缓存(CPU寄存器=>L1 cahce =>L2 cache =>内存=>硬盘),如图:

 

在计算机系统和应用软件层面,缓存更是无处不在。我们在使用浏览器上网时,很多静态资源会被缓存到本地。我们在手机上采用微信聊天时,很多好友的头像等数据会被缓存到手机中。在操作系统层面,I/O操作也会被内核缓存(一般将数据缓存在文件系统的缓存页中),当然,这个可能相比前两个场景更加抽象,但缓存的目的都是一致的,为了提升读写性能。

 

缓存在狭义上解决介质读写速度不匹配问题,广义上包括任何利用中间媒介提高速度的方法,包括:空间换时间,动态操作变为静态操作。

 

缓存(CACHE)和缓冲(BUFFER)

缓存:可以共享,多种数据,大小不固定,可以重复使用,已知数据,用于提高IO效率。

缓冲:不可以共享,单一数据,大小固定,读取后失效,命中100%,未知数据,用于减少IO次数。

缓存的属性

命中率:从缓存中返回正确数据的次数/总请求次数。

容量:超过这个值启用一定的策略:转移到磁盘;转移到远端;清空部分。

存储介质:内存、磁盘。

成本:开发成本、部署成本、硬件成本。

效率:SET效率、GET效率、序列化、哈希算法、分布式算法。

缓存的限制

由于价格的因素,缓存实现依赖的存储往往有大小限制——保存什么,舍弃什么,命中率。

缓存往往是从无到有的——在最初阶段不能发挥作用,在不命中的时候性能颠簸。

 

缓存的分类

按照存储介质来分 :

内存(网站进程内、同服务器独立进程、独立服务器、分布式服务器组)。

磁盘(本地文件和数据库,独立服务器、分布式服务器组)。

缓存可以使用磁盘而不仅仅是内存。

按照存储的数据来分 :

直接用于输出的整页(HTML、脚本样式、图片)。

片段页(可供多个客户端使用的HTML、脚本样式等)。

索引和聚合数据(空间换时间)。

耗时查询的结果数据。

和业务相关的大块数据(列表数据,引用数据)。

和业务相关的小级数据(行级数据,资源数据)。

和上下文(用户)相关的数据(活动数据)。

按照实现方式来分 :

框架或引擎内置的缓存(比如ORM缓存和SQL SERVER缓存)。

安装特定的组件根据规则自动实现缓存(比如反向代理和输出缓存)。

需要由开发以编程方式实现的缓存(比如业务数据缓存)。

按照作用来分 :

用于数据的读取(之后介绍的大部分内容都是基于此类缓存)

用于(允许丢失)数据的写入——写到缓存的队列中,再由工作线程提交处理(写入存储)

 

网站架构中的缓存

浏览器缓存(HTTP缓存头)

代理缓存(Squid Vanish CDN)

Web服务器缓存(内核缓存、应用缓存)

页面输出缓存(片段缓存、整页缓存)

业务数据缓存(本地缓存,分布式缓存)

其它缓存(ORM、数据库、搜索引擎等缓存)

 

缓存的常见模式和策略(过期、更新、清除)

缓存的常见模式:

 

缓存的策略:

缓存的更新策略

A 由获取数据请求触发的被动更新

B 由更新数据请求触发的主动更新(双写)

C 使用独立线程主动定时更新缓存

D 回调方式更新(过期或依赖)

E 永远不更新?

  

缓存的过期(失效)策略

F 绝对的过期时间

G 平滑过期(有人使用就不会过期)

H 依赖方式(依赖数据库、依赖文件)

I 永远不过期?

缓存的清除(替换)策略:

RAND 删除随机数据,不能反映局部性。

SIZE 删除最大的数据。

FIFO,First In First Out 删除最先进入缓存的数据,不能反映局部性。

LFU,Least Frequently Used 删除一直以来最少被使用的数据。

LRU,Least Recently Used 删除最近最少使用的数据。

常见模式

延迟加载方式:A+F

预加载方式:B/C/E+I

原文地址:http://www.cnblogs.com/dinglang/p/6108185.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 错误提示开启,php开启与关闭错误提示,php开启错误提示_PHP教程

php开启与关闭错误提示,php开启错误提示windows系统开关php错误提示如果不具备修改php.ini的权限,可以将如下代码加入php文件中:代码如下 复制代码ini_set(“display_errors”, “On”);error_reporting(E_ALL | E_STRICT);当然,如…

Java IO: Reader And Writer

转载自 Java IO: Reader And Writer译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) Java IO的Reader和Writer除了基于字符之外,其他方面都与InputStream和OutputStream非常类似。他们被用于读写文本。InputStream和OutputStream是基于字节的&am…

win10安装dockerx docker的常见命令 可以子腾讯云上做做练习

参考资料 https://www.jianshu.com/p/e8427d12b3e0 百度搜索 docker hub 可以查找 你需要的镜像 https://hub.docker.com/?utm_sourcegetting_started_guide&utm_mediumembedded_Windows&utm_campaignfind_whalesay https://blog.csdn.net/zzq060143/article/de…

韩文博 php,No releases available for package pear.php.net/HTTP_Upload

卸载了PHP的HTTP_Upload>pear uninstall HTTP_Uploaduninstall ok: channel://pear.php.net/HTTP_Upload-0.9.1但重新安装时,出错>pear install HTTP_UploadNo releases available for package "pear.php.net/HTTP_Upload"install failed执行pear c…

Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持

Jexus 是一款运行于 Linux 平台,以支持 ASP.NET、PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器。最新版 5.8.2 已经发布,有如下更新: 1,现在大部分网站已经部署HTTPS,大家对于安全越来越重视&…

拦截器中/* vs /** ------SpringMVC

<!--关于拦截器的配置--> <mvc:interceptors><mvc:interceptor><!--/** 包括路径及其子路径--><!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截--><!--/admin/** 拦截的是/admin/下的所有--><mvc:mapping path&q…

php移动代码,移动专区周级收录如何提交 复制这段php代码即可

今天我们来讲解下“移动专区的周级提交”很多朋友都在使用移动专区(之前的熊掌号)进行提交&#xff0c;但是天级提交只给10个额度&#xff0c;需要我们不断提交10个才会有所增长&#xff0c;但是我们可以使用“周级提交”可以直接享受5万的数据提交&#xff0c;对于我们站点的收…

Java IO: 异常处理

转载自 Java IO: 异常处理译文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a; 李璟(jlee381344197gmail.com) 流与Reader和Writer在结束使用的时候&#xff0c;需要正确地关闭它们。通过调用close()方法可以达到这一点。不过这需要一些思考。请看下边的代码&#xff1a…

钟 docker讲解

任意目录打开git bash AdministratorPC-201908221240 MINGW64 ~/Desktop/开发工具$ ssh root10.23.12.67 连接服务器 The authenticity of host 10.23.12.67 (10.23.12.67) cant be established. ECDSA key fingerprint is SHA256:q//66ce/mAHBGMTzqoOuHyW4h2m3ywE6BQevsNXv…

拦截器---SpringMVC(权限拦截)

拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 **过滤器与拦截器的区别&#xff1a;**拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分&#xff0c;任…

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接

我们知道rabbitmq是一个专业的MQ产品&#xff0c;而且它也是一个严格遵守AMQP协议的玩意&#xff0c;但是要想骚&#xff0c;一定需要拿出高可用的东西出来&#xff0c;这不本篇就跟大家说 一下cluster的概念&#xff0c;rabbitmq是erlang写的一个成品&#xff0c;所以知道如何…

Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace"houseDao" ><result…

JS Promise的实现原理

转载自 JS Promise的实现原理在前端开发过程中&#xff0c;会经常使用到 Promise 模式&#xff0c;可以使异步代码看起来如同步般清新易读&#xff0c;从而从回调地狱中解脱出来。ES6中 已原生支持 Promise&#xff0c;但在未支持的浏览器中还需要通过 polyfill 模拟实现。下…

php类常量的特点,php类常量是什么?类常量用法详解

这篇文章主要介绍了php类常量用法,实例分析了php中类常量的概念、特性与相关使用技巧,需要的朋友可以参考下本文实例讲述了php类常量用法。分享给大家供大家参考。具体如下&#xff1a;类常量属于类自身&#xff0c;不属于对象实例&#xff0c;不能通过对象实例访问子类可以重写…

手机钉钉在进行视频会议时怎么录屏

https://www.iefans.net/info/v1037168.html 钉钉在进行视频会议时怎么录屏 编辑&#xff1a;秩名2020-03-24 10:14:52 钉钉 类型&#xff1a;效率办公 语言&#xff1a;简体中文 安卓下载 扫一扫下载游戏 钉钉是一款很好用的学习办公软件&#xff0c;它的工呢很多&#xf…

文件上传与下载----SpringMVC

文件上传 1、导入文件上传的jar包&#xff0c;commons-fileupload &#xff0c; Maven会自动帮我们导入他的依赖包 commons-io包&#xff1b; <!--文件上传--> <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupl…

Vue3学习(后端开发)

目录 一、安装Node.js 二、创建Vue3工程 三、用VSCode打开 四、源代码目录src 五、入门案例——手写src 六、测试案例 七、ref和reactive的区别 一、安装Node.js 下载20.10.0 LTS版本 https://nodejs.org/en 使用node命令检验安装是否成功 node 二、创建Vue3工程 在…

微软Ignite大会约起来

今年的微软Ignite技术大会今天开始了&#xff0c;要好好学习哦&#xff0c;提供直播地址&#xff0c;通过阅读原文链接可以直达直播地址 http://soft.zdnet.com.cn/special/microsoft_ignite_2016。 大会亮点 创新 IT 技术飞速发展促发了更多行业创新&#xff0c;因此您和您的企…

aria2c rpc php,aria2c 的基本配置,附带傻瓜式源码

经常需要配置&#xff0c;但是 每次都需要查找配置项的意义&#xff0c;所以索性写在这里&#xff0c;以便有个记录&#xff0c;下次无需查找。aria2c -d/Users/blueboz/Downloads \-c \-D \-laria.log \-j5 -k1M \-x16 -s16 \--file-allocationnone \--enable-rpc \--load-coo…

探讨JS合并两个数组的方法

转载自 探讨JS合并两个数组的方法我们在项目过程中&#xff0c;有时候会遇到需要将两个数组合并成为一个的情况。 比如&#xff1a; var a [1,2,3]; var b [4,5,6];有两个数组a、b&#xff0c;需求是将两个数组合并成一个。方法如下&#xff1a; 1、concat js的Array对象提供…