精华内容
下载资源
问答
  • 网站开发之缓存技术.zip 1数据库缓存 2CDN缓存 3服务器缓存 4浏览器缓存 下面我一一介绍其实现方法
  • asp下如何在ADO服务器端利用好缓存技术
  • Web前后端缓存技术Web前后端缓存技术(缓存的主要作用是什么) 一、总结 一句话总结: 加快页面打开速度 减少网络带宽消耗 降低服务器压力 1、在Web应用中,应用缓存的地方有哪些? 主要有浏览器缓存,页面...

    Web前后端缓存技术Web前后端缓存技术(缓存的主要作用是什么)

    一、总结

    一句话总结:

    加快页面打开速度
    减少网络带宽消耗
    降低服务器压力

     

    1、在Web应用中,应用缓存的地方有哪些?

    主要有浏览器缓存,页面缓存,服务器缓存,数据库缓存等

     

    2、服务器缓存主要分为哪两个?

    CDN缓存
    Combo缓存

     

    3、浏览器端缓存规则在哪里定义?

    主要在HTTP协议头和HTML的meta标签中定义。

    他们分别从新鲜度和校验值两个维度来规定浏览器是否可以直接使用缓存中的副本,还是需要去源服务器获取更新的版本。

     

    4、浏览器端缓存是否刷新的两个关键是什么?

    新鲜度(过期机制):也就是缓存副本有效期。
    校验值(验证机制):服务器返回资源的时候有时在控制头信息带上这个资源的实体标签Etag(Entity Tag),它可以用来作为浏览器再次请求过程的校验标识。


    新鲜度(过期机制):也就是缓存副本有效期。一个缓存副本必须满足以下条件,浏览器会认为它是有效的,足够新的:
        含有完整的过期时间控制头信息(HTTP协议报头),并且仍在有效期内;
        浏览器已经使用过这个缓存副本,并且在一个会话中已经检查过新鲜度
        满足以上两个情况的一种,浏览器会直接从缓存中获取副本并渲染。

    满足以上两个情况的一种,浏览器会直接从缓存中获取副本并渲染。

    校验值(验证机制):服务器返回资源的时候有时在控制头信息带上这个资源的实体标签Etag(Entity Tag),它可以用来作为浏览器再次请求过程的校验标识。如过发现校验标识不匹配,说明资源已经被修改或过期,浏览器需求重新获取资源内容。

     

    5、当一个用户发起一个静态资源请求的时候,浏览器会通过哪些步骤来获取资源?

    本地缓存阶段:先在本地查找该资源,如果有发现该资源,而且该资源还没有过期,就使用这一个资源,完全不会发送http请求到服务器;
    协商缓存阶段:如果在本地缓存找到对应的资源,但是不知道该资源是否过期或者已经过期,则发一个http请求到服务器,然后服务器判断这个请求,如果请求的资源在服务器上没有改动过,则返回304,让浏览器使用本地找到的那个资源;
    缓存失败阶段:当服务器发现请求的资源已经修改过,或者这是一个新的请求(在本来没有找到资源),服务器则返回该资源的数据,并且返回200, 当然这个是指找到资源的情况下,如果服务器上没有这个资源,则返回404。

     

    6、浏览器中的操作对缓存的影响?

    强制刷新 – 当按下ctrl+F5来刷新页面的时候, 浏览器将绕过各种缓存(本地缓存和协商缓存), 直接让服务器返回最新的资源;
    普通刷新 – 当按下F5或者点击刷新按钮来刷新页面的时候,浏览器将绕过本地缓存来发送请求到服务器, 此时, 协商缓存是有效的
    回车或转向 – 当在地址栏上输入回车或者按下跳转按钮的时候, 所有缓存都生效

     

    7、页面缓存是什么?

    页面缓存是将动态页面直接生成静态的页面放在服务器端

    页面缓存是将动态页面直接生成静态的页面放在服务器端,用户调取相同页面时,静态页面将直接下载到客户端,不再需要通过程序的运行和数据库的访问,大大节约了服务器的负载。
    每次访问页面时,会检测相应的缓存页面是否存在,若不存在,则连接数据库得到数据渲染页面并生成缓存页面文件,这样下次访问的页面文件就发挥作用了。

     

    8、数据库缓存是什么?

    数据库会在内存划分一个专门的区域,用来存放用户最近执行的查询

    数据库的缓存一般由数据库提供,可以对表建立高速缓存。数据库中,用户可能多次执行相同的查询语句,为了提高查询效率,数据库会在内存划分一个专门的区域,用来存放用户最近执行的查询,这块区域就是缓存。
    数据库缓存的使用必须在一定的应用环境下:查询的数据库表不会经常变动、有大量相同的查询(如订单信息查询)。

     

    9、缓存的同步是什么,以及常用的两种方案?

    缓存的同步指的是写命中缓存的时候,如果保持缓存与磁盘上数据一致性的问题。
    直写式WT(Write Through):当CPU要将数据写入内存时,除了更新缓冲内存上的数据外,也将数据写在磁盘中以维持主存与缓冲内存的一致性,当要写入内存的数据多起来的话,速度自然就慢了下来。
    回写式WB(Write Back):当CPU要将数据写入内存时,只会先更新缓冲内存上的数据,随后再让缓冲内存在总线不塞车的时候才把数据写回磁盘,所以速度会快得多。


    两种方式各有利弊,直写缓存方法利用了高速缓存中的数据始终与主存储器中数据匹配的特点。但是,需要的总线周期却非常耗时,从而降低性能。回写缓存可以维持性能,因为写入始终是在“爆发”中进行的,因而运行所需的总线周期将大大减少。
    两个CPU,或者CPU与DMA同时共享一块物理内存时,writer在写完后,要write back,这样另一个reader才能看到它写入的数据;在writer变为reader的时候,需要invalidate,否则看不到另一个 writer写入的数据。所以在共享的时候,需要同时做writeback和invalidate。

     

    10、与缓存相关的算法有哪些?

    先进先出算法(FIFO):如果一个数据最先进入缓存中,则应该最早淘汰掉。如果服务器接受到的数据请求与时间高度相关,可以考虑使用FIFO算法。
    最不经常使用算法(LFU):这个缓存算法使用一个计数器来记录条目被访问的频率。通过使用LFU缓存算法,最低访问数的条目首先被移除。这个方法并不经常使用,因为它无法对一个拥有最初高访问率之后长时间没有被访问的条目缓存负责。
    最近最少使用算法(LRU):这个缓存算法将最近使用的条目存放到靠近缓存顶部的位置。当一个新条目被访问时,LRU将它放置到缓存的顶部。当缓存达到极限时,较早之前访问的条目将从缓存底部开始被移除。这里会使用到昂贵的算法,而且它需要记录“年龄位”来精确显示条目是何时被访问的。此外,当一个LRU缓存算法删除某个条目后,“年龄位”将随其他条目发生改变。
    自适应缓存替换算法(ARC):在IBM Almaden研究中心开发,这个缓存算法同时跟踪记录LFU和LRU,以及驱逐缓存条目,来获得可用缓存的最佳使用。
    最近最常使用算法(MRU):这个缓存算法最先移除最近最常使用的条目。一个MRU算法擅长处理一个条目越久,越容易被访问的情况。

     

    11、图片缓存中的图片分发是什么意思?

    网站会将图片存储从网站中分离出来,假设一个或多个图片服务器来存储图片,将图片放到一个虚拟目录中,而网页上仍然用同一个URL地址指向服务器上的某一个图片的地址。

    网页传输过程中,图片会占用大量的数据量,是影响网站性能的主要因素,因此大部分网站会将图片存储从网站中分离出来,假设一个或多个图片服务器来存储图片,将图片放到一个虚拟目录中,而网页上仍然用同一个URL地址指向服务器上的某一个图片的地址。这样可以大大提高网站的性能。

     

     

     

    二、Web前后端缓存技术

    参考:Web前后端缓存技术
    https://blog.csdn.net/yzj5208/article/details/82080868

    Web缓存技术

    一、缓存概述

    缓存原本是一个硬件的概念:缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。

    在一个Web应用中,应用到缓存的地方有很多,主要有浏览器缓存,页面缓存,服务器缓存,数据库缓存等。

    缓存的作用主要有:

    • 加快页面打开速度
    • 减少网络带宽消耗
    • 降低服务器压力

    缓存结构

    二、浏览器缓存

    浏览器端缓存规则主要在HTTP协议头和HTML的meta标签中定义。他们分别从新鲜度和校验值两个维度来规定浏览器是否可以直接使用缓存中的副本,还是需要去源服务器获取更新的版本。

    新鲜度(过期机制):也就是缓存副本有效期。一个缓存副本必须满足以下条件,浏览器会认为它是有效的,足够新的:

    • 含有完整的过期时间控制头信息(HTTP协议报头),并且仍在有效期内;
    • 浏览器已经使用过这个缓存副本,并且在一个会话中已经检查过新鲜度
    • 满足以上两个情况的一种,浏览器会直接从缓存中获取副本并渲染。

    满足以上两个情况的一种,浏览器会直接从缓存中获取副本并渲染。

    校验值(验证机制):服务器返回资源的时候有时在控制头信息带上这个资源的实体标签Etag(Entity Tag),它可以用来作为浏览器再次请求过程的校验标识。如过发现校验标识不匹配,说明资源已经被修改或过期,浏览器需求重新获取资源内容。

    使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下:

    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    • 1

    上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。而广泛应用的还是 HTTP头信息 来控制缓存。

    在HTTP请求和响应的消息报头中,常见的与缓存有关的消息报头有:

    缓存结构

    HTTP缓存机制

    缓存行为主要由缓存策略决定,而缓存策略由内容拥有者设置。这些策略主要通过特定的HTTP头部来清晰地表达。

    当一个用户发起一个静态资源请求的时候,浏览器会通过以下几步来获取资源:

    • 本地缓存阶段:先在本地查找该资源,如果有发现该资源,而且该资源还没有过期,就使用这一个资源,完全不会发送http请求到服务器;
    • 协商缓存阶段:如果在本地缓存找到对应的资源,但是不知道该资源是否过期或者已经过期,则发一个http请求到服务器,然后服务器判断这个请求,如果请求的资源在服务器上没有改动过,则返回304,让浏览器使用本地找到的那个资源;
    • 缓存失败阶段:当服务器发现请求的资源已经修改过,或者这是一个新的请求(在本来没有找到资源),服务器则返回该资源的数据,并且返回200, 当然这个是指找到资源的情况下,如果服务器上没有这个资源,则返回404。

    用户操作行为与缓存的关系

    用户操作与缓存的关系

    浏览器中的操作对缓存的影响:

    • 强制刷新 – 当按下ctrl+F5来刷新页面的时候, 浏览器将绕过各种缓存(本地缓存和协商缓存), 直接让服务器返回最新的资源;
    • 普通刷新 – 当按下F5或者点击刷新按钮来刷新页面的时候,浏览器将绕过本地缓存来发送请求到服务器, 此时, 协商缓存是有效的
    • 回车或转向 – 当在地址栏上输入回车或者按下跳转按钮的时候, 所有缓存都生效

    本地缓存阶段

    Expires

    指定缓存到期GMT的绝对时间,如果设了max-age,max-age就会覆盖expires。如果expires到期需要重新请求。

    Cache-Control

    Cache-Control是http 1.1中为了弥补 Expires 缺陷新加入的。对已缓存的内容进行控制:

    • Cache-control: public表示缓存的版本可以被代理服务器或者其他中间服务器识别。
    • Cache-control: private意味着这个文件对不同的用户是不同的。只有用户自己的浏览器能够进行缓存,公共的代理服务器不允许缓存。
    • Cache-control: no-cache意味着文件的内容不应当被缓存。这在搜索或者翻页结果中非常有用,因为同样的URL,对应的内容会发生变化。

    其他相关控制字段

    • max-age: 指定缓存过期的相对时间秒数,max-ag=0或者是负值,浏览器会在对应的缓存中把Expires设置为1970-01-01 08:00:00。
    • s-maxage: 类似于max-age,只用在共享缓存上,比如proxy。
    • public: 通常情况下需要http身份验证的情况,响应是不可cahce的,加上public可以使它被cache。
    • no-cache: 强制浏览器在使用cache拷贝之前先提交一个http请求到源服务器进行确认。这对身份验证来说是非常有用的,能比较好的遵守 (可以结合public进行考虑)。它对维持一个资源总是最新的也很有用,与此同时还不完全丧失cache带来的好处),因为它在本地是有拷贝的,但是在用之前都进行了确认,这样http请求并未减少,但可能会减少一个响应体。
    • no-store: 告诉浏览器在任何情况下都不要进行cache,不在本地保留拷贝。
    • must-revalidate: 强制浏览器严格遵守你设置的cache规则。
    • proxy-revalidate: 强制proxy严格遵守你设置的cache规则。
    • cache:使用本地缓存,不发生请求。

    用法举例: Cache-Control: max-age=3600, must-revalidate

    协商缓存阶段

    Last-Modified & if-modified-since

    Last-Modified与If-Modified-Since是一对报文头,属于http 1.0。
    last-modified是WEB服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间。

    ETag & If-None-Match

    ETag与If-None-Match是一对报文,属于http 1.1。

    ETag可以用来解决这种问题。ETag是一个文件的唯一标志符。就像一个哈希或者指纹,每个文件都有一个单独的标志,只要这个文件发生了改变,这个标志就会发生变化。

    ETag机制类似于乐观锁机制,如果请求报文的ETag与服务器的不一致,则表示该资源已经被修改过,需要发最新的内容给浏览器。

    同时使用这两个报文头,在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,如都与服务器的相符,服务器返回304,否则,发送最新内容给浏览器。

    Etag/lastModified过程如下:

    1. 客户端请求一个页面(A)。
    2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
    3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
    4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
    5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

    304:通过If-Modified-Since If-Match判断资源是否修改,如未修改则返回304,发生了一次请求,但请求内容长度为0,节省了带宽。 如果有多台负载均衡的服务器,不同服务器计算出的Etag可能不同,这样就会造成资源的重复加载。

    Etag 主要为了解决 Last-Modified 无法解决的一些问题:

    1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

    2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);

    3、某些服务器不能精确的得到文件的最后修改时间。

    其他标签

    Content-Length:尽管并没有在缓存中明确涉及,Content-Length头部在设置缓存策略时很重要。某些软件如果不提前获知内容的大小以留出足够空间,则会拒绝缓存该内容。

    Vary:缓存系统通常使用请求的主机和路径作为存储该资源的键。当判断一个请求是否是请求同样内容时,Vary头部可以被用来提醒缓存系统需要注意另一个附加头部。它通常被用来告诉缓存系统同样注意Accept-Encoding头部,以便缓存系统能够区分压缩和未压缩的内容。

    总结

    浏览器第一次请求时:

    浏览器第一次请求时

    浏览器再次请求时:

    浏览器再次请求

    Question: 设置了一个月才过期的缓存,如果服务器端更新了css代码,要怎么让用户更新缓存呢?

    三、页面缓存

    页面缓存是将动态页面直接生成静态的页面放在服务器端,用户调取相同页面时,静态页面将直接下载到客户端,不再需要通过程序的运行和数据库的访问,大大节约了服务器的负载。每次访问页面时,会检测相应的缓存页面是否存在,若不存在,则连接数据库得到数据渲染页面并生成缓存页面文件,这样下次访问的页面文件就发挥作用了。

    MemCache的缓存策略:(visio不能用了,自己画的,略丑慎看)

    页面缓存

    四、数据库缓存

    数据库的缓存一般由数据库提供,可以对表建立高速缓存。数据库中,用户可能多次执行相同的查询语句,为了提高查询效率,数据库会在内存划分一个专门的区域,用来存放用户最近执行的查询,这块区域就是缓存。

    数据库缓存的使用必须在一定的应用环境下:查询的数据库表不会经常变动、有大量相同的查询(如订单信息查询)。

    PS:这个缓存策略也可以用在前端,比如订单信息不变的情况下,可以在前端设置一个对象,保存请求的地址、参数、结果,第一次请求时会保存请求的地址、参数和结果,再次请求时,如果请求的地址、参数一样,则查询该对象直接返回请求的结果。

    五、缓存的同步、复制与分发

    缓存的同步指的是写命中缓存的时候,如果保持缓存与磁盘上数据一致性的问题。一般有两种方案:

    • 直写式WT(Write Through):当CPU要将数据写入内存时,除了更新缓冲内存上的数据外,也将数据写在磁盘中以维持主存与缓冲内存的一致性,当要写入内存的数据多起来的话,速度自然就慢了下来。
    • 回写式WB(Write Back):当CPU要将数据写入内存时,只会先更新缓冲内存上的数据,随后再让缓冲内存在总线不塞车的时候才把数据写回磁盘,所以速度会快得多。

    两种方式各有利弊,直写缓存方法利用了高速缓存中的数据始终与主存储器中数据匹配的特点。但是,需要的总线周期却非常耗时,从而降低性能。回写缓存可以维持性能,因为写入始终是在“爆发”中进行的,因而运行所需的总线周期将大大减少。
    两个CPU,或者CPU与DMA同时共享一块物理内存时,writer在写完后,要write back,这样另一个reader才能看到它写入的数据;在writer变为reader的时候,需要invalidate,否则看不到另一个 writer写入的数据。所以在共享的时候,需要同时做writeback和invalidate。

    六、与缓存相关的算法

    • 先进先出算法(FIFO):如果一个数据最先进入缓存中,则应该最早淘汰掉。如果服务器接受到的数据请求与时间高度相关,可以考虑使用FIFO算法。
    • 最不经常使用算法(LFU):这个缓存算法使用一个计数器来记录条目被访问的频率。通过使用LFU缓存算法,最低访问数的条目首先被移除。这个方法并不经常使用,因为它无法对一个拥有最初高访问率之后长时间没有被访问的条目缓存负责。
    • 最近最少使用算法(LRU):这个缓存算法将最近使用的条目存放到靠近缓存顶部的位置。当一个新条目被访问时,LRU将它放置到缓存的顶部。当缓存达到极限时,较早之前访问的条目将从缓存底部开始被移除。这里会使用到昂贵的算法,而且它需要记录“年龄位”来精确显示条目是何时被访问的。此外,当一个LRU缓存算法删除某个条目后,“年龄位”将随其他条目发生改变。
    • 自适应缓存替换算法(ARC):在IBM Almaden研究中心开发,这个缓存算法同时跟踪记录LFU和LRU,以及驱逐缓存条目,来获得可用缓存的最佳使用。
    • 最近最常使用算法(MRU):这个缓存算法最先移除最近最常使用的条目。一个MRU算法擅长处理一个条目越久,越容易被访问的情况。

    应用:图片缓存的预载与分发

    图片的预加载

    为了防止图片在需要的时候才加载,而付出的时间开销,可以将图片进行预加载。代码如下:

    <html>
    <script>
        var img = new Image();
        image.src = "b.jpg";
    </script>
    <body>
        <img src="a.jpg" alt="pic" onmouseover="this.src='b.jpg'">
    </body>
    </html>
    • 图片的分发

    网页传输过程中,图片会占用大量的数据量,是影响网站性能的主要因素,因此大部分网站会将图片存储从网站中分离出来,假设一个或多个图片服务器来存储图片,将图片放到一个虚拟目录中,而网页上仍然用同一个URL地址指向服务器上的某一个图片的地址。这样可以大大提高网站的性能。

    转自:https://blog.csdn.net/LeeSirbupt/article/details/54409931

     

    转载于:https://www.cnblogs.com/Renyi-Fan/p/10907666.html

    展开全文
  • Web前后端缓存技术

    千次阅读 2018-08-26 15:49:55
    Web缓存技术 一、缓存概述 缓存原本是一个硬件的概念:缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存...

    Web缓存技术

    一、缓存概述

    缓存原本是一个硬件的概念:缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。

    在一个Web应用中,应用到缓存的地方有很多,主要有浏览器缓存,页面缓存,服务器缓存,数据库缓存等。

    缓存的作用主要有:

    • 加快页面打开速度
    • 减少网络带宽消耗
    • 降低服务器压力

    缓存结构

    二、浏览器缓存

    浏览器端缓存规则主要在HTTP协议头和HTML的meta标签中定义。他们分别从新鲜度和校验值两个维度来规定浏览器是否可以直接使用缓存中的副本,还是需要去源服务器获取更新的版本。

    新鲜度(过期机制):也就是缓存副本有效期。一个缓存副本必须满足以下条件,浏览器会认为它是有效的,足够新的:

    • 含有完整的过期时间控制头信息(HTTP协议报头),并且仍在有效期内;
    • 浏览器已经使用过这个缓存副本,并且在一个会话中已经检查过新鲜度
    • 满足以上两个情况的一种,浏览器会直接从缓存中获取副本并渲染。

    满足以上两个情况的一种,浏览器会直接从缓存中获取副本并渲染。

    校验值(验证机制):服务器返回资源的时候有时在控制头信息带上这个资源的实体标签Etag(Entity Tag),它可以用来作为浏览器再次请求过程的校验标识。如过发现校验标识不匹配,说明资源已经被修改或过期,浏览器需求重新获取资源内容。

    使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下:

    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    • 1

    上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。而广泛应用的还是 HTTP头信息 来控制缓存。

    在HTTP请求和响应的消息报头中,常见的与缓存有关的消息报头有:

    缓存结构

    HTTP缓存机制

    缓存行为主要由缓存策略决定,而缓存策略由内容拥有者设置。这些策略主要通过特定的HTTP头部来清晰地表达。

    当一个用户发起一个静态资源请求的时候,浏览器会通过以下几步来获取资源:

    • 本地缓存阶段:先在本地查找该资源,如果有发现该资源,而且该资源还没有过期,就使用这一个资源,完全不会发送http请求到服务器;
    • 协商缓存阶段:如果在本地缓存找到对应的资源,但是不知道该资源是否过期或者已经过期,则发一个http请求到服务器,然后服务器判断这个请求,如果请求的资源在服务器上没有改动过,则返回304,让浏览器使用本地找到的那个资源;
    • 缓存失败阶段:当服务器发现请求的资源已经修改过,或者这是一个新的请求(在本来没有找到资源),服务器则返回该资源的数据,并且返回200, 当然这个是指找到资源的情况下,如果服务器上没有这个资源,则返回404。

    用户操作行为与缓存的关系

    用户操作与缓存的关系

    浏览器中的操作对缓存的影响:

    • 强制刷新 – 当按下ctrl+F5来刷新页面的时候, 浏览器将绕过各种缓存(本地缓存和协商缓存), 直接让服务器返回最新的资源;
    • 普通刷新 – 当按下F5或者点击刷新按钮来刷新页面的时候,浏览器将绕过本地缓存来发送请求到服务器, 此时, 协商缓存是有效的
    • 回车或转向 – 当在地址栏上输入回车或者按下跳转按钮的时候, 所有缓存都生效

    本地缓存阶段

    Expires

    指定缓存到期GMT的绝对时间,如果设了max-age,max-age就会覆盖expires。如果expires到期需要重新请求。

    Cache-Control

    Cache-Control是http 1.1中为了弥补 Expires 缺陷新加入的。对已缓存的内容进行控制:

    • Cache-control: public表示缓存的版本可以被代理服务器或者其他中间服务器识别。
    • Cache-control: private意味着这个文件对不同的用户是不同的。只有用户自己的浏览器能够进行缓存,公共的代理服务器不允许缓存。
    • Cache-control: no-cache意味着文件的内容不应当被缓存。这在搜索或者翻页结果中非常有用,因为同样的URL,对应的内容会发生变化。

    其他相关控制字段

    • max-age: 指定缓存过期的相对时间秒数,max-ag=0或者是负值,浏览器会在对应的缓存中把Expires设置为1970-01-01 08:00:00。
    • s-maxage: 类似于max-age,只用在共享缓存上,比如proxy。
    • public: 通常情况下需要http身份验证的情况,响应是不可cahce的,加上public可以使它被cache。
    • no-cache: 强制浏览器在使用cache拷贝之前先提交一个http请求到源服务器进行确认。这对身份验证来说是非常有用的,能比较好的遵守 (可以结合public进行考虑)。它对维持一个资源总是最新的也很有用,与此同时还不完全丧失cache带来的好处),因为它在本地是有拷贝的,但是在用之前都进行了确认,这样http请求并未减少,但可能会减少一个响应体。
    • no-store: 告诉浏览器在任何情况下都不要进行cache,不在本地保留拷贝。
    • must-revalidate: 强制浏览器严格遵守你设置的cache规则。
    • proxy-revalidate: 强制proxy严格遵守你设置的cache规则。
    • cache:使用本地缓存,不发生请求。

    用法举例: Cache-Control: max-age=3600, must-revalidate

    协商缓存阶段

    Last-Modified & if-modified-since

    Last-Modified与If-Modified-Since是一对报文头,属于http 1.0。 
    last-modified是WEB服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间。

    ETag & If-None-Match

    ETag与If-None-Match是一对报文,属于http 1.1。

    ETag可以用来解决这种问题。ETag是一个文件的唯一标志符。就像一个哈希或者指纹,每个文件都有一个单独的标志,只要这个文件发生了改变,这个标志就会发生变化。

    ETag机制类似于乐观锁机制,如果请求报文的ETag与服务器的不一致,则表示该资源已经被修改过,需要发最新的内容给浏览器。

    同时使用这两个报文头,在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,如都与服务器的相符,服务器返回304,否则,发送最新内容给浏览器。

    Etag/lastModified过程如下:

    1. 客户端请求一个页面(A)。
    2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
    3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
    4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
    5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

    304:通过If-Modified-Since If-Match判断资源是否修改,如未修改则返回304,发生了一次请求,但请求内容长度为0,节省了带宽。 如果有多台负载均衡的服务器,不同服务器计算出的Etag可能不同,这样就会造成资源的重复加载。

    Etag 主要为了解决 Last-Modified 无法解决的一些问题:

    1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

    2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);

    3、某些服务器不能精确的得到文件的最后修改时间。

    其他标签

    Content-Length:尽管并没有在缓存中明确涉及,Content-Length头部在设置缓存策略时很重要。某些软件如果不提前获知内容的大小以留出足够空间,则会拒绝缓存该内容。

    Vary:缓存系统通常使用请求的主机和路径作为存储该资源的键。当判断一个请求是否是请求同样内容时,Vary头部可以被用来提醒缓存系统需要注意另一个附加头部。它通常被用来告诉缓存系统同样注意Accept-Encoding头部,以便缓存系统能够区分压缩和未压缩的内容。

    总结

    浏览器第一次请求时:

    浏览器第一次请求时

    浏览器再次请求时:

    浏览器再次请求

    Question: 设置了一个月才过期的缓存,如果服务器端更新了css代码,要怎么让用户更新缓存呢?

    三、页面缓存

    页面缓存是将动态页面直接生成静态的页面放在服务器端,用户调取相同页面时,静态页面将直接下载到客户端,不再需要通过程序的运行和数据库的访问,大大节约了服务器的负载。每次访问页面时,会检测相应的缓存页面是否存在,若不存在,则连接数据库得到数据渲染页面并生成缓存页面文件,这样下次访问的页面文件就发挥作用了。

    MemCache的缓存策略:(visio不能用了,自己画的,略丑慎看)

    页面缓存

    四、数据库缓存

    数据库的缓存一般由数据库提供,可以对表建立高速缓存。数据库中,用户可能多次执行相同的查询语句,为了提高查询效率,数据库会在内存划分一个专门的区域,用来存放用户最近执行的查询,这块区域就是缓存。

    数据库缓存的使用必须在一定的应用环境下:查询的数据库表不会经常变动、有大量相同的查询(如订单信息查询)。

    PS:这个缓存策略也可以用在前端,比如订单信息不变的情况下,可以在前端设置一个对象,保存请求的地址、参数、结果,第一次请求时会保存请求的地址、参数和结果,再次请求时,如果请求的地址、参数一样,则查询该对象直接返回请求的结果。

    五、缓存的同步、复制与分发

    缓存的同步指的是写命中缓存的时候,如果保持缓存与磁盘上数据一致性的问题。一般有两种方案:

    • 直写式WT(Write Through):当CPU要将数据写入内存时,除了更新缓冲内存上的数据外,也将数据写在磁盘中以维持主存与缓冲内存的一致性,当要写入内存的数据多起来的话,速度自然就慢了下来。
    • 回写式WB(Write Back):当CPU要将数据写入内存时,只会先更新缓冲内存上的数据,随后再让缓冲内存在总线不塞车的时候才把数据写回磁盘,所以速度会快得多。

    两种方式各有利弊,直写缓存方法利用了高速缓存中的数据始终与主存储器中数据匹配的特点。但是,需要的总线周期却非常耗时,从而降低性能。回写缓存可以维持性能,因为写入始终是在“爆发”中进行的,因而运行所需的总线周期将大大减少。 
    两个CPU,或者CPU与DMA同时共享一块物理内存时,writer在写完后,要write back,这样另一个reader才能看到它写入的数据;在writer变为reader的时候,需要invalidate,否则看不到另一个 writer写入的数据。所以在共享的时候,需要同时做writeback和invalidate。

    六、与缓存相关的算法

    • 先进先出算法(FIFO):如果一个数据最先进入缓存中,则应该最早淘汰掉。如果服务器接受到的数据请求与时间高度相关,可以考虑使用FIFO算法。
    • 最不经常使用算法(LFU):这个缓存算法使用一个计数器来记录条目被访问的频率。通过使用LFU缓存算法,最低访问数的条目首先被移除。这个方法并不经常使用,因为它无法对一个拥有最初高访问率之后长时间没有被访问的条目缓存负责。
    • 最近最少使用算法(LRU):这个缓存算法将最近使用的条目存放到靠近缓存顶部的位置。当一个新条目被访问时,LRU将它放置到缓存的顶部。当缓存达到极限时,较早之前访问的条目将从缓存底部开始被移除。这里会使用到昂贵的算法,而且它需要记录“年龄位”来精确显示条目是何时被访问的。此外,当一个LRU缓存算法删除某个条目后,“年龄位”将随其他条目发生改变。
    • 自适应缓存替换算法(ARC):在IBM Almaden研究中心开发,这个缓存算法同时跟踪记录LFU和LRU,以及驱逐缓存条目,来获得可用缓存的最佳使用。
    • 最近最常使用算法(MRU):这个缓存算法最先移除最近最常使用的条目。一个MRU算法擅长处理一个条目越久,越容易被访问的情况。

    应用:图片缓存的预载与分发

    图片的预加载

    为了防止图片在需要的时候才加载,而付出的时间开销,可以将图片进行预加载。代码如下:

    <html>
    <script>
        var img = new Image();
        image.src = "b.jpg";
    </script>
    <body>
        <img src="a.jpg" alt="pic" onmouseover="this.src='b.jpg'">
    </body>
    </html>
    • 图片的分发

    网页传输过程中,图片会占用大量的数据量,是影响网站性能的主要因素,因此大部分网站会将图片存储从网站中分离出来,假设一个或多个图片服务器来存储图片,将图片放到一个虚拟目录中,而网页上仍然用同一个URL地址指向服务器上的某一个图片的地址。这样可以大大提高网站的性能。

    转自:https://blog.csdn.net/LeeSirbupt/article/details/54409931

    展开全文
  • 前一章介绍了Cache和http状态码304的技术,这属于客户端文件缓存,使用该技术可以灵活的将每一个用户访问服务器的次数和字节数减少到最低。  不过有这样一个问题存在,就是上面的缓存都是针对单个用户的,如果该...

        前一章介绍了Cache和http状态码304的技术,这属于客户端文件缓存,使用该技术可以灵活的将每一个用户访问服务器的次数和字节数减少到最低。

        不过有这样一个问题存在,就是上面的缓存都是针对单个用户的,如果该用户通常在缓存时间内只访问该文件一次,是没有效果的,因此就算这个文件每天被再多的用户访问,也起不到缓存效果,而这种情况下需要使用服务端缓存。

        使用服务端缓存的理由很多,我使用的主要理由是每个页面生成对服务器性能的要求过大,因为每个页面生成的过程序需要多次访问数据库,并有可能需要从别的来源获取数据,而这些都是对性能影响很大的部分,而实际上,1000个用户访问的同一个页面,服务器返回的内容是相同的,这种情况下服务器生成1000次页面是完全不可取的,如果只在该页面初次被访问的时候生成一遍,而在一定时间内该页面被再次访问直接使用缓存,将会获得较大的服务器性能提升。

        我的服务器缓存过程是这样的:当用户访问一个页面的时候(假设不考虑客户端缓存,因为本章讲的是服务端缓存),首先将该URL映射为硬盘上的的一个文件路径,检查该文件是否存在。如果存在,则检查该文件的最后修改日期,如果该文件存在并且还没有过期,则直接返回该文件内容,而不需要进行数据库操作;如果文件不存在或已经过期,则生成文件内容保存到相应的文件,再返回该文件内容。

        这样做有几个好处:

        1.并不是所有的文件都预先生成缓存,节省磁盘空间,而且基本上不需要手工干预

        2.不需要建立缓存数据库,因为我认为,只要涉及到访问数据库,就会造成性能和稳定性问题,因为数据库可能是在另一台机器上,我记得有一次我的数据库崩溃了,而我发现当天网站70%的访问还是正常的,因为常被访问的页面已经被缓存了。

        3.缓存访问快,因为判断文件是否存在和文件的时间是很快的过程,而且,在大多数的程序语言之中,直接将一个文件返回到浏览器也是很方便的过程

        这样做也有几个缺点:

        1.如果有人攻击或者遍历你的网站的页面,网站的所有页面会很快的被生成,硬盘的空间会急剧增加

        2.缓存没有自动清除的功能,也就是说,如果要节省空间,可能需要手工执行一个程序,这个程序自动在缓存文件夹之中找到过期的文件并删除

        总体上来讲,根据页面生成过程的复杂度和数据库等页面生成模块的稳定性来决定是否使用这种服务器端缓存,是很有作用的。

    展开全文
  • 翻译:Wen Hui 转载:中间件小哥 客户端缓存是用于提供高性能服务的一项技术。...当使用客户端缓存时,应用服务器端会存储经常访问的数据请求,以便在下次客户端请求过程中重用之前的数据库查询回复,而无需

    原文:https://redis.io/topics/client-side-caching

    翻译:Wen Hui

    转载:中间件小哥

    客户端缓存是用于提供高性能服务的一项技术。它使用应用服务器节点(通常情况下和数据库服务器使用不同的物理机)的可用内存,用来在应用端直接存储一部分数据库信息。

    正常情况下当客户端请求应用服务器一些数据时,应用服务器会请求数据库这些信息,如下图所示:

    当使用客户端缓存时,应用服务器端会存储经常访问的数据请求,以便在下次客户端请求过程中重用之前的数据库查询回复,而无需再向数据库进行查询。

    尽管用于本地缓存的应用程序内存可能不是很大,但是与请求诸如数据库之类的网络服务相比,访问本地计算机内存所需的时间要小几个数量级。由于在通常情况下,少量比例数据会经常频繁的被访问,因此该模式可以极大地减少应用程序获取数据的延迟,并同时减少数据库端的负载。

    此外,在许多数据集中,信息很少进行更改。例如,社交网络中的大多数用户帖子要么是不变的,要么很少被用户编辑。再加上通常只有一小部分帖子非常受欢迎的事实,要么是因为一小群用户拥有大量关注者,或者因为最近的帖子具有更高的曝光度,由此可见为什么这种模式在实际情况下会非常有用。

    通常来说,客户端缓存的两个主要优点是:

    1. 可用的数据延迟非常短。

    2. 数据库系统接收的查询较少,从而可以使用更少的节点来提供相同的数据服务。

     

    在计算机科学中只有两大问题

    上述模式的问题是在数据被修改或过期时,如何使应用程序保存的信息无效,以避免向用户显示陈旧数据。例如,在上面的应用程序本地缓存了user:1234信息之后,Alice可以将其用户名更新为Flora。但是应用程序可能会继续为用户1234提供旧的用户名。

    有时,取决于我们要建模的应用程序,这个问题并不重要,因此客户端将只使用固定的最大“生存时间”来缓存信息。一旦过了给定的时间,该信息将不再被视为有效。使用Redis时,更复杂的模式会利用发布/订阅系统,以便向侦听的客户端发送无效消息。从使用的带宽的角度来看,这是可行的,但却是棘手且昂贵的,因为这种模式通常涉及向应用程序中的每个客户端发送无效消息,即使某些客户端可能没有无效数据的任何副本。 此外,每个更改数据的应用程序查询都需要使用PUBLISH命令,从而使数据库花费更多的CPU时间来处理此命令。

    无论使用哪种模式,都有一个简单的事实:许多非常大的应用程序都实现某种形式的客户端缓存,因为这是拥有快速存储或快速缓存服务器的下一个逻辑步骤。因此,Redis 6实现了对客户端缓存的直接支持,以使该模式更易于实现,更易于访问,可靠且高效。

     

    客户端缓存的Redis实现

    Redis客户端缓存支持称为跟踪(tracking),并具有两种模式:

    在默认模式下,服务器会记住给定客户端访问了哪些键,并在别的客户端修改相同的键时向客户端发送无效消息。这将花费服务器端的内存,但仅对在内存中拥有修改的键的客户端发送无效消息。

    相反,在广播模式下,服务器不会尝试记住给定客户端访问了哪些键,因此该模式在服务器端根本不会花费任何内存。相反,客户端会订阅键前缀(例如object:或user :),并且每次其他客户端修改与该前缀匹配的键值时都会收到通知消息。

    回顾一下,现在让我们暂时忘记广播模式,重点关注第一种模式。我们将在后面详细介绍广播模式。

    客户可以根据需要启用跟踪。连接开始时未启用跟踪。

    启用跟踪后,服务器会记住每个客户端在连接生存期内请求过的键(通过发送有关此键的读取命令)。

    当某个客户端修改了某个键,或者由于键具有关联的到期时间而将其逐出,或者由于最大内存策略而将其逐出时,所有启用了跟踪且可能已缓存键的客户端都会收到无效消息通知。

    当客户端收到无效消息时,要求它们删除相应的键值信息,以避免提供过时的数据。

    这是协议的示例:

    从表面上看,这看起来很棒,但是如果你想到有10万个已连接的客户端在每个持久连接中都请求数百万个键,则服务器将会因为存储太多信息而崩溃。因此,Redis使用两个关键思想来限制服务器端使用的内存量以及处理实现该功能的数据结构的CPU成本:

    服务器会在一个全局列表中记住可能已将给定键值缓存过的客户端列表。该表称为无效表。这个无效表可以设置最大数量的记录,如果插入了新键值,则服务器可以通过假装已修改(即使没有修改)并将其发送到客户端来驱逐旧条目。这样做,它可以使服务器端回收用于此键值的内存,即使这样会迫使键值在本地客户端缓存被逐出。

    在无效表内部,我们实际上不需要存储指向客户端结构的指针,这将在客户端断开连接时在无效表中需要强制执行垃圾回收过程:相反,我们要做的只是存储客户端ID(每个Redis客户端都有唯一的数字ID)。如果客户端断开连接,则随着缓存槽无效,将逐步收集垃圾信息。

    在这里只有一个键空间,不以数据库编号做划分。因此,如果客户端在数据库2中缓存键foo,而其他一些客户端在数据库3中更改了键foo的值,则仍然会发送无效消息。这样,我们可以忽略数据库编号,从而减少了内存使用量和实现的复杂度。

     

    两种连接方式

    使用Redis 6支持的新版本的Redis协议RESP3,可以在同一连接中运行数据查询并接收无效消息。但是,许多客户端实现可能更喜欢使用两个独立的连接来实现客户端缓存:一个用于数据,另一个用于无效消息。因此,当客户端启用跟踪时,它可以通过指定不同连接的“客户端ID”来指定将无效消息重定向到另一个连接。许多数据连接可以将无效消息重定向到同一连接,这对于实现连接池的客户端很有用。这两个连接模型是RESP2唯一支持的模型(缺乏在同一连接中复用不同类型信息的能力)。

    这次我们将通过在旧的RRESP2模式下使用实际的Redis协议显示一个示例,如何完成一个完整的会话,包括以下步骤:启用跟踪重定向到另一个连接,请求键的值信息以及在键的内容被其他客户端修改的情况下,获取服务器发送的键失效信息。

    首先,客户端打开第一个用于失效的连接,请求返回连接的ID,并通过Pub / Sub订阅专用通道,该通道在RESP2模式下用于获得失效消息(请记住,RESP2是通常的Redis协议,而不是你可以使用的更高级的协议):

    客户端可以决定在本地内存中缓存“ foo” =>“ bar”。

    现在,另一个客户端将修改“ foo”键的值:

    因此,失效连接将收到一条失效信息,该信息使指定的键值失效。

    客户端将检查在此缓存槽中是否有缓存的键值信息,并将逐出不再有效的信息。

    请注意,Pub / Sub消息的第三个元素不是单个键,而是只有一个元素的Redis数组。因为我们发送一个数组,所以如果有成组的键无效,我们可以在一条消息中做到这一点。

    关于理解使用RESP2的客户端缓存以及为了读取无效消息而进行的Pub / Sub连接非常重要的一点是,使用Pub / Sub完全是一个为了重用旧的客户端实现的技巧,但实际上并未真正发送并被所有订阅该频道的客户所接收。只有我们在CLIENT命令的REDIRECT参数中指定的连接才会实际收到Pub / Sub消息,从而使此功能具有更大的可伸缩性。

    如果改用RESP3,则将无效消息作为推送消息发送(在同一连接中,或者在使用重定向时在辅助连接中)(请参阅RESP3规范以获取更多信息)。

     

    追踪用来追踪什么

    如上面例子可以看到,默认情况下,客户端不需要告诉服务器它们正在缓存哪些键。服务器会追踪只读命令上下文中提到的每个键,因为它可能会被缓存。

    这具有明显的优点,即不需要客户端告诉服务器它正在缓存什么。此外,在许多客户端实现中,这就是你想要的,因为一个好的解决方案可能是使用先进先出的方法仅缓存尚未缓存的所有内容:我们可能希望缓存固定数量的对象,每个对象我们检索到新数据后,就可以对其进行缓存,丢弃最早的缓存对象。更高级的实现可能会删除最不常用的对象或类似对象。

    请注意,无论如何,如果服务器上有写流量,则缓存槽将在一段时间内失效。通常,当服务器假设我们得到的东西也缓存时,我们就要进行权衡:

    1. 当客户端倾向于使用欢迎新对象的策略来缓存更多内容时,这样做会更有效率。

    2. 服务器将被迫保留有关客户端键的更多数据。

    3. 客户端将收到有关其未缓存的对象的无效消息。

    因此,下一节将介绍另一种方法

     

    OPT-IN 模式

    客户端实现可能只希望缓存选定的键,并明确地与服务器通信它们将缓存的内容和不缓存的内容:缓存新对象时,这将需要更多的带宽,但同时会减少服务器需要记住的数据量,以及客户端收到的无效消息数量。

    为此,必须使用OPTIN选项启用跟踪:

    在这种模式下,默认情况下,不应缓存读取查询中的键,而是当客户端要缓存某些内容时,它必须在实际命令检索数据之前立即发送一个特殊命令CACHING:

    为了使协议更有效率,可以使用NOREPLY选项发送CACHING命令:在这种情况下,CACHING命令中客户端不会收到服务器返回的信息:

    CACHING命令会影响随后执行的命令,但是,如果下一个命令是MULTI,则将跟踪事务中的所有命令。同样,对于Lua脚本,将跟踪该脚本执行的所有命令。

     

    广播模式

    到目前为止,我们描述了Redis实现的第一个客户端缓存模型。还有一个称为广播模式,它从另一个折衷的角度来看问题,它不消耗服务器端的任何内存,而是向客户端发送更多的无效消息。在这种模式下,我们有以下主要行为:

    客户端使用BCAST选项启用客户端缓存,并使用PREFIX选项指定一个或多个前缀。例如:CLIENT TRACKING on REDIRECT 10 BCAST PREFIX object:PREFIX user:。如果根本没有指定任何前缀,则假定该前缀为空字符串,因此客户端将会接收每个被修改的键的无效消息。相反,如果使用一个或多个前缀,则仅在失效消息中发送与指定前缀之一匹配的键。

    服务器未在失效表中存储任何内容。相反,它仅使用不同的前缀表,其中每个前缀都与客户端列表相关联。

    每次修改与任何前缀匹配的键时,所有订阅该前缀的客户端都将收到无效消息。

    服务器的CPU消耗与注册前缀数量成正比。如果只有几个,几乎看不出任何区别。使用大量前缀,CPU成本可能变得非常高。

    在这种模式下,服务器可以优化为订阅给定前缀的所有客户端创建单个回复的过程,并将相同的回复发送给所有客户端。这有助于降低CPU使用率。

     

    避免竞争条件

    在实施客户端缓存以将无效消息重定向到其他连接时,你应该意识到存在竞争状况。请参见以下示例交互,在此我们将数据连接称为“ D”,并将失效连接称为“ I”

    如上所示,由于对GET的回复返回给客户端会有较长延时,因此在已经不再有效的实际数据之前,我们收到了无效消息。因此,我们将继续提供旧版本的foo键的值信息。为避免此问题,当我们使用占位符发送命令时,填充缓存是一个好主意:

    当对数据和无效消息使用单个连接时,这种竞争条件是不可能的,因为在这种情况下消息的顺序始终是已知的。

     

    与服务器断开连接时该怎么办

    同样,如果丢失与套接字的连接以获取无效消息,则可能会以客户端收到陈旧数据结束。为了避免这个问题,我们需要做以下事情:

    1. 确保如果连接丢失,则刷新本地缓存。

    2. 在将RESP2与Pub / Sub一起使用时,或者在RESP3上,都定期对无效订阅连接进行ping操作(即使连接处于Pub / Sub模式下,也可以发送PING命令!)。如果连接看起来断开并且我们无法接收ping回复,请在设定的最长时间后关闭连接并刷新缓存。

     

    什么需要缓存

    客户可能希望运行有关给定缓存的键在实际请求中被调用的次数的内部统计信息,以了解以后对哪些键使用客户端缓存。一般来说:

    · 我们不想缓存很多不断变化的键。

    · 我们不想缓存很多很少被请求的键。

    · 我们希望缓存经常请求的键并以合理的速率进行更改。有关键没有以合理的速度更改的示例,请考虑一个不断增加的全局计数器。

    但是,更简单的客户端可能只是使用一些随机采样来逐出数据,只是记住最后一次被查询的特定键值,从而试图逐出最近未被查询的键。

     

    有关客户端库实现的建议

    · 处理TTL:如果要支持带TTL的缓存键,请确保查询键的TTL值并在本地缓存中设置TTL。

    · 即使没有TTL,在每个键中都放置一个最大TTL是一个比较好的做法。这是个很好的保护措施,可避免可能导致客户端在本地副本中包含旧数据的错误或连接问题。

    · 绝对需要限制客户端使用的内存量。添加新键时,必须有一种方法可以将旧键逐出。

     

    限制Redis使用的内存量

    只需确保为Redis记住的最大键数配置一个合适的值,或者使用BCAST模式,该模式在Redis端根本不占用任何内存。请注意,当不使用BCAST时,Redis消耗的内存与跟踪的键数量以及请求此类键的客户端数量成正比。

    展开全文
  • 本文申明:本人凭着对英文和技术的热爱,根据自己有限的英文水平通过翻译文章以达到提高自身能力,如果有什么地方不对的,希望大家提意见. 目的:这篇文章将描述在asp.net中如何管理cache以及cache各个参数的用法. ...
  • 缓存技术

    2018-10-31 01:36:00
    App客户端底层都有缓存技术的。注:(移动端登录 用token 本地是有个文件的) 案例: 如果一旦请求到服务器端之后,会在本地缓存一份,快速响应给用户。 常见的缓存方案: 网络缓存 代理缓存(Nginx可以...
  • Web服务器缓存

    2015-11-27 14:44:00
    前面提到的一些缓存技术都是有我们的动态才程序控制的,现在的web服务器功能越来越强大,常用的web服务器软件也都内置了缓存功能,下面我们就简单的说下服务器端缓存的应用. 首先,我们先来介绍一下URL映射,对于所有...
  • ASP.NET缓存技术

    2021-01-19 22:03:07
    摘 要: 介绍了ASP.NET中各种缓存技术的应用程序模型,并重点分析了每种应用模型的优缺点及其适用范围。  随着经济化的发展,许多公司面对客户和市场需求的变化,需要构建足够强大、灵活、可伸缩的信息系统来支撑...
  • php缓存技术

    2019-09-25 14:38:24
    所谓缓存就是存储在服务器端的公用信息,与服务器同生共死。我们保存缓存的时候可以跟据指定的下次更新的时间判断。比如我们指定3分钟更新一次缓存,可以记录上次更新的时间,比较现在看是否超过3分钟,如果是则读取...
  • memcache缓存技术

    2017-12-30 19:22:46
    memcache是一种缓存技术,属于client/server结构的服务,客户端memcache,服务器端memcached 命令说明 memcached -d install 以守护模式开启memcached memcached -d unistall 关闭缓存服务 常用操作 实例化对象 $...
  • PHP缓存技术

    2018-02-14 11:21:05
    缓存技术: 有些信息比方经常不变的,但是还是能变的信息放在缓存中以加快显示速度,这是很有价值的,所谓的缓存,通俗的理解就是一些保存在服务器端的共用信息.它是于服务器同生死的,我们在保存缓存的时候可以指定下次...
  • Web缓存技术

    2015-09-24 10:24:21
    因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能。 本章从缓存所在的命名空间“System.Web.Caching...
  • C# 缓存技术

    2015-05-26 13:41:00
    因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能。 本章从缓存所在的命名空间“System.Web.Caching...
  • PHP缓存技术_PHP技术

    千次阅读 2008-10-06 11:37:00
    缓存技术: 有些信息比方经常不变的,但是还是能变的信息放在缓存中以加快显示速度,这是很有价值的,所谓的缓存,通俗的理解就是一些保存在服务器端的共用信息.它是于服务器同生死的,我们在保存缓存的时候可以指定下次...
  • web缓存技术

    2013-01-16 21:19:41
    web缓存技术   缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,173
精华内容 469
关键字:

服务器端缓存技术