LoachBlog

LoachBlog 个人笔记

缓存系统-问道篇

为什么使用缓存?

减少服务器的负担,避免重复计算,提高系统性能,提高网站的访问速度。

缓存是怎么应运而生的?

1、静态网站的访问方式:客户端->请求服务器->服务器返回静态页面->响应给客户端

2、动态网站的访问方式:客户端->请求服务器A->处理逻辑->请求数据库->返回数据->最后动态生成页面->响应给客户端

3、1和2对比可以发现,动态网站服务器的操作量远远要大于静态网站。在超过一定量的客户端同时请求这两种网站,很明显动态网站的服务器压力要比静态网站大很多。因为动态网站需要计算,从数据库取数据等一些繁杂的操作,所以访问静态网站要比访问动态网站要快得多。为了解决动态网站超量请求(高峰负载)带来的压力,这个时候缓存技术就出现了。

缓存

  • 这里缓存指的是Web缓存(或HTTP缓存)是用于临时存储(缓存)Web文档(如HTML页面和图像),以减少服务器延迟的一种技术。说白了,就是把动态网站第一次响应的数据页面当作静态页面缓存下来,下一次或下多次请求的时候,直接访问这个缓存的页面,不需要再经过处理逻辑,请求数据库等繁杂的操作了。从而也就减小了服务器的压力。

缓存特征

命中率

  • 命中率=返回正确结果数/请求缓存次数,它是衡量缓存有效性的重要指标。命中率越高,表明缓存的使用率越高。

最大元素(或最大空间)

  • 缓存中可以存放的最大元素的数量,一旦缓存元素数量超过这个值(或者缓存数据所占用空间超过其最大致辞空间),那么将会触发缓存启动清空策略根据不同的场景合理的设置最大元素质往往可以一定程度上提高缓存的命中率,从而有效的使用缓存。

清空策略

  • 当缓存空间用满时,如何保证在稳定服务器的同事提升有效命中率?这需要缓存策略来处理。 1、FIFO(first in first out) 先进先出策略,最先进入缓存的数据在缓存空间不够的情况下(超出最大元素限制)会被有限清洗掉,已腾出行的空间接受新的数据。策略算法主要比较缓存元素的创建时间。在数据实效性要求场景下课选择该类策略,优先保障最新数据库可用。 2、LFU(less frequently used) 最少使用策略,无论是否过期,根据元素的被使用次数判断,清除使用次数较少的元素释放空间。策略算法主要比较元素hitCount(命中次数)。在保证高频数据有效性场景,可选择这类策略。 3、LRU(least recently used) 最近最少使用策略,无论是否过期,根据元素最后一次呗使用的时间戳,清除最远使用时间戳的元素释放空间。策略算法主要比较最近一次get使用时间,在热点数据场景下适用,优先保证热点数据的有效性。 4、其他策略 根据 过期时间判断,清理过期时间最长的元素 根据过期时间判断,清理最近过期的元素 随机清理 根据关键字(或元素内容)长短清理等
  • 缓存介质

    内存

    • 将缓存存储在内存中是最快的选择,无需额外的I/O开销,但是内存的缺点是没有持久化存储,一旦应用异常断电或者重启,缓存数据无法复原。

    硬盘

    • 大多数缓存框架会结合使用内存和硬盘,在内存分配可能干满了或是在异常的情况下,可以被动或主动的将内存空间数据持久化到硬盘中,达到释放空间或备份数据。

    数据库

    • key-value存储结构的特殊数据库,响应速度或吞吐量都远远高于关系型数据库。(如:BerkeleyDB和Redis)

    缓存和应用场景

    • 在应用服务框架中,可以根据缓存和应用之间的耦合度,分为本地缓存(local cache)和分布式缓存(remote cache)。

    本地缓存

    • 本地缓存,指在应用中的缓存组件,其最大的优点是应用和cache在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下适用本地缓存比较合适;同时,它的缺点也是应用程序和缓存的耦合度高,多个应用程序无法直接共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费。

    分布式缓存

    • 分布式缓存,指应用分离的缓存组件或服务器,其最大的优点是自身就是一个独立应用,与本地应用隔离,多个应用可直接的共享缓存。

    缓存类型

    1、Memcached:最有效、最快,,完全基于内存的缓存服务,达到减少数据库访问,提高站点性能的目的
    
    2、DataBase Caching:基于数据库的缓存,可以将数据缓存在特殊的数据库中(不是关系型数据库),只有key-value的数据库。
    
    3、Filesystem Caching:基于文件系统的缓存,将缓存的数据存储在独立的文件中
    
    4、Local-memory caching:当使用内存缓存,但又没有办法通过Memcached搭建一个缓存系统的时候,就可以通过Local-memory方式
    
    5、Dummy caching(for developmer):仿缓存也就是假缓存,作为开发测试使用。缓存当中不会真正缓存数据,只是实现了对应的缓存接口
    
    6、Using a custom cache backend:当以上都不能满足你的缓存需求就可以自己开发缓存页面,设置好就可以使用。
    

    缓存粒度

    1、Per-site cache:整个站点的缓存,是最简单的方法,可以让整个站点整个网页的所有页面都缓存,这种缓存只要在项目中设置加入缓存中间键的配置,系统便会自动对整个网站进行缓存,无需写代码来缓存页面。
    
    2、Per-view cache:比较细腻度的缓存框架,基于view层的缓存,对单个视图的输出结果进行缓存。
    
    3、Template fragment caching:模板,片状画出,避免模板中的重复。
    
    4、Low-level cache API:低级的缓存API,有时对整个解析的页面进行缓存可能不会有什么好处。比如站点包含了一个视图,而这个视图是依赖几个face的查询,每个一段时间就会发生变化,在这种情况下使用站点级缓存和视图级缓存都不太理想。因为对于经常变化的数据不需要缓存,但变化少的部分又需要缓存。针对这种情况,通过缓存低级缓存API可以根据自己的需要来进行不同粒度的缓存。
    

    参考资料

    https://tech.meituan.com/cache_about.html
    

    打赏

    取消

    打赏

    扫描支持
    请我喝咖啡

    打开支付宝请我喝咖啡

    请登录后评论.
        

    No comment。