MS-缓存

在web世界,理论上每一层都可以缓存,以PHP为例:

  • 底层有CPU缓存,磁盘文件系统缓存
  • 应用层有Zend虚拟机缓存,Memcached/Redis这样的内存缓存,有APC这样的Opcode缓存。
  • 数据库有Table Cache、Thread Cache、Query Cache。
  • Servlet容器层有Apache缓存
  • 再往上一点,有一个WebCache层(Squid、Varnish)
  • 然后有基于HTTP协议和浏览器自身的缓存
  • 代码级别有Smarty这样实现的文件缓存

缓存三要素

  1. 命中率
    指的是请求缓存次数和缓存命中次数的比例。比例越高,说明缓存的使用率越高。

    如果数据频繁更新,就需要考虑缓存的合理性。因为频繁更新会使命中率大大降低。以Query Cache为例,Query Cache具有失效机制,如果表中的数据变化比较频繁,大量Query Cache频繁失效,命中率就可能比较低。这种场景下,Query Cache不仅不能提高效率,反而可能造成负面影响。

  2. 缓存更新策略
    Mysql的query cache更新策略
    在Mysql中,可以设置Query Cache所使用的总内存,Mysql会把默认可以缓存的Sql语句的结果进行缓存,一旦内存塞满后,就会剔除老的Query Cache对象。
    为了保证Query Cache中的内容,与实际数据绝对一致,当表中数据有任何变化,包括新增、更新、删除等,都会使引用到该表的SQL的Query Cache失效。

    一般缓存更新策略

    • FIFO[First In First Out]
      最先进入缓存的数据,在缓存空间不足的情况下,会被首先清理出去。
    • LFU[Less Frequently Used]
      最少被使用的缓存,被优先清理出去,要求缓存的数据有hit属性。
    • LRU[Least Recently Used]
      最近最少使用的被优先清理。需要缓存的数据有一个时间戳。
  3. 缓存最大数据量
    指的是缓存中能处理元素的最大个数或所能使用的最大存储空间。

    例如,MySQL的Query Cache缓存最大数据量由query_cache_size参数决定,并且可以修改。而基于内存的Key Value实施方案Memcached,其缓存最大数据量可使用内存由操作系统决定,默认为64MB,每次最大可申请内存为2MB。

  4. 具体缓存策略

    1. 文件缓存
      • 模版引擎缓存,即将php代码编译为html静态文件
    2. opcode缓存
      opcode(operation code,操作码),就是就是虚拟机把PHP代码编译成一种中间码,缓存起来(内存或硬盘),下次运行此页面时,直接解释这些中间码就好了,省去Flex语法器进行语法编译和大部分的语法检查的过程,提高PHP运行速度,减轻服务器负荷。
      eAccelerator工具能够起到“常驻内存”的作用。
    3. 客户端缓存(Web缓存)
      前端页面缓存主要遵循HTTP协议和客户端(或者服务器端)的设置
      不缓存的场景
      • 响应头告诉缓存起不要缓存
      • 请求信息需要认证或者加密
      • 回应中不存在校验器(ETag或者Last Modified头信息),缓存服务器会认为缺乏直接的更新度信息,内容将会被认为不可缓存。(详见Web缓存)
    4. Web服务器缓存
      Nginx缓存

你可能感兴趣的:(MS-缓存)