• 缓存


    什么是缓存?

    1、并不是指计算机的内存或者CPU的缓存。

    2、缓存是指为了降低应用程序对物理数据源的访问的频次,从而提高应用程序运行性能的一种策略。

    为什么使用缓存?

    1、程序访问数据库的效率直接影响应用程序的运行速度,提升和优化程序的执行效率至关重要。

    2、缓存的使用是提升和优化代码执行效率的重要手段,所以学会缓存的使用和配置是优化的关键。

    缓存的工作原理?

    1、缓存其实是对物理数据源的复制,当下一次我们要访问物理数据源里的数据,我们就没有必要去从物理数据源哪里读取我们所需要的数据,而是可以直接从我们的缓存中获取我们所需的数据,当然,缓存是存储在我们物理设备的内存当中,这有利于我们提高读取数据的效率。

    2、我们知道我们的每一次请求都是应用程序发起的,当我们没有使用缓存的时候,我们的应用程序就直接取读取我们数据库中的数据,然后返回给我们的应用程序;

      当我们使用缓存以后,应用程序回去先读取缓存中的数据,这个时候就会存在两种情况,一种是缓存命中,一种是缓存未命中,当缓存命中以后,应用程序会先读取缓存中的数据然后直接返回给应用程序,当缓存未命中的时候,应用程序会去读取数据库中的数据,然后返回给应用程序,顺带做一个操作,就是将我们读取的数据写入到应用程序当中。(如下图)

    下面,我们来介绍下客户端、服务器端、数据库端的缓存机制:

    一、客户端缓存

    根据统计,从浏览器向一个网页发出请求算起,获得网页的HTML文档的时间只占整个页面应答完成时间的5%,而剩余的95%时间全部是在请求和下载页面中的各个组件。因此减少对页面中组件的请求和下载,有效地利用浏览器缓存机制是十分有意义的。 

    常用的客户端缓存技术:

    1、cookie:

         只能存储4KB     

         浪费带宽,每次会随着HTTP发送给服务器;

         操作cookie内的数据很繁琐,没有方便的API.
    2、http缓存(粗粒度)

    http缓存是基于HTTP协议的浏览器文件级缓存机制。即针对文件的重复请求情况下,浏览器可以根据协议头判断从服务器端请求文件还是从本地读取文件。

    3、 flash:(需要安装插件;移动端无法普及;)

    这种方式基本不用,这一方法主要基于flash有读写浏览器端本地目录的功能,同时也可以向js提供调用的api,则页面可以通过js调用flash去读写特定的磁盘目录,达到本地数据缓存的目的。

    那么随着HTML5的普及,HTML5给我们提供了更好的缓存机制:(相关内容在本博客中的HTML5中本地存储可以看到)

    1、Application Cache(细粒度);本地缓存应用所需的文件(css,js,图片等)

    2、Local Storage & Session Storage;键值对(key-Value)存储数据

    3、Web SQL;关系数据库,通过SQL语句访问

    4、IndexedDb;索引数据库

    二、服务器端缓存

    当一个网页频繁被访问的时候,我们可以通过把整个网页缓存起来来提高执行效率。这样做的优点是,当用户再次访问这个网页的时候,被格式化好的HTML会被直接送现。

    为什么会有如上所说的这种缓存机制呢?我们还需要了解下,.net的一个运行机制(如下图),当用户请求一个页面的时候,服务器(IIS)会去相应用户的请求,然后根据用户的提示去执行相应的动态代码,

    相应的动态代码会生成相应的一个结果,然后把这个结果缓存起来,生成相应的HTML页面,通过Response发送给浏览器。

    我们可以试想一下,如果有1000个用户来访问这个页面,我们是不是要执行1000次动态代码生成HTML这样一个过程呢,很显然这样的效率是很低的,既然我们已经生成过了一次HTML,为什么我们还要重复的再去生成相同的HTML呢?

    我们是不是可以把第一个用户访问该网页而生成的结果缓存起来,当下个用户来访问的时候就可以从缓存中获取结果,而不必再去执行动态代码查询数据库返回给我们的用户,这样的效率是不是更好一点。基于这样的一个考虑,.net提供了

    outputcache这样一个技术。

    什么是outputcache

    Output Cache 是一项非常有效的增强访问性能的技术,由于IIS的一些特性,默认情况下Output  Cache是打开的,但是要对某些请求进行缓存,还需要开发者进行定制。

    定制Output Cache

    对于Output Cache的定制,我们有两种方法,一种是基于底层的API技术,一种是基于高层的Output Cache。

    一旦Output Cache 被定制过,那么这个网页就会在第一次被访问的时候生成cache,直到请求过期为止。

    DEMO 1

    通过使用Output Cache定义一个缓存页,显示当前时间,当这个页面被缓存之后,刷新时,当前显示时间不发生变化。

    这段话定义了页面将要被缓存,并且,其缓存时间为30秒,只有在30秒之后,页面自动清除除去缓存,此时,第一个访问者将会提供新的缓存。

    DEMO 2  参数缓存

    有些时候我们需要根据用户的请求来生成页面,但是用户的请求只有有限的几种组合,这个时候就可以根据用户请求来生成几种缓存页面,来进行缓存。

    接受参数示例,根据用户选择不同的ID显示不同的数据内容。

    DEMO 3 回调缓存

    通过设置回调缓存机制,可以针对每个请求页面中插入动态的部分,以弥补单独使用静态缓存的不足。

    我们知道,我们缓存的是一张页面,但是当我们需要让每个用户登录进来的用户名都是不同的,之前的缓存都不适用,因为不管是那个用户访问这张页面,它显示的都是一个用户登录进来的用户名,因为第一次登录进来的用户缓存了该页面。

    因此下图中,对HTML对象进行了扩展,从而达到了动态改变缓存中的内容,但是会出现这么一个情况,当我把HTML.Substitution()方法定义到了div中,运行后会一直跑到body后层(一直无法解决)。

    于是使用了MVCDonutCacheNuGet包来实现这种场景,从而很容易的达到了,局部缓存的目的,而且也不用再去实现扩展了。

    三、数据库缓存

    前面的例子中,我们使用的是缓存技术一旦时间到,无论服务器端的数据是否被改变,都会释放缓存。

    下面我们介绍的例子,通过配置数据库连接池,只有当数据库数据被改变的时候,缓存才会改变。

    配置数据库缓存:(如下操作)

    配置完成后,我们还要配置一下数据库端的数据库连接池:

    进入到该文件夹:使用aspnet_regsql 工具

    C:WindowsMicrosoft.NETFrameworkv2.0.50727

    aspnet_regsql -S localhost -U sa -P 123456 -ed -d Student -et -t user

    打开vs命令工具行,输入:aspnet_regsql -S 数据库服务IP -U 用户名 -P 密码 -ed -d 数据库名称 -et -t 表名称

    参数解释:

    -S localhost:数据库地址

    -U sa:数据库登录名

    -P 123456:数据库登录密码

    -d Student :数据库的名称

    -t user:表名称(小写)

    -ed  为 SQL 缓存依赖项启用数据库

    -et   为 SQL 缓存依赖项启用表

    -dd  为 SQL 缓存依赖项禁用数据库

    -dt   为 SQL 缓存依赖项禁用表

    最终的运行结果如下图:

  • 相关阅读:
    C++学习笔记十关联容器
    Ubuntu下使用GDB断点Go程序
    各种语言的数字转罗码方法的实现
    为什么 ++i和i++的效果是一样的,试了javascript ,c++ java
    罗马数字转换阿拉伯数字(Java版,考虑较为全面)
    C++学习笔记九顺序容器(二) ForFreeDom 博客园
    智立方 屁话真言108:能盛事者能成事_智立方的杨石头_新浪博客
    腾讯搜搜高管吴军离职的传闻与真相
    罗马数字_百度百科
    快速深入一门语言的几个问题 Shell909090 随笔杂记
  • 原文地址:https://www.cnblogs.com/zhangweidong/p/5169484.html
Copyright © 2020-2023  润新知