可参考最最最全的缓存使用指引

可参考最最最全的缓存使用指引
最新回答
半袖桃花

2021-08-05 01:55:25

最全的缓存使用指引

缓存是一种用于提高系统性能和响应速度的重要技术,通过存储频繁访问的数据,减少对原始数据源的访问次数,从而优化系统性能。以下是关于缓存使用的全面指引:

一、适用场景

缓存适用于多个场景,能够大幅提高系统性能和响应速度。典型的缓存适用场景包括:

  • 热点数据访问:如热门商品列表、用户会话信息、配置数据等,这些数据被频繁访问,放入缓存中可以减少数据库查询的负载。
  • 计算开销大的数据:如复杂的统计数据、报表生成、机器学习推理结果等,对计算复杂的结果进行缓存,可以避免重复计算。
  • 慢速存储访问:如从外部系统(如远程API、文件存储等)获取的数据,可以缓存结果避免每次调用外部服务。

这些场景的共同特性是读写占比高,合理地使用缓存可以帮助系统优化性能、减少延迟并降低后端负载。

二、缓存内容

缓存可以应用在Web应用中的多个层级和模块中,常见的缓存内容和适用位置包括:

  • DNS解析缓存:缓存DNS解析结果,减少域名解析时间,提升页面加载速度。
  • CDN缓存:缓存静态资源(如图片、CSS、JS文件等),通过将静态资源分发到离用户更近的节点,提升页面加载性能。
  • 页面级缓存:缓存生成的完整页面,避免每次请求都重新生成HTML内容,适合不频繁变化的页面。
  • API结果缓存:将API接口的返回结果缓存起来,减少后端查询和逻辑计算的负载。
  • 数据库查询缓存:缓存数据库查询结果,减少对数据库的访问次数。
  • 对象级缓存:缓存复杂的对象实例,如用户会话、购物车信息等。
  • 模板渲染缓存:将已经渲染的HTML模板结果缓存起来,减少动态渲染时的计算开销。
  • 会话数据缓存:缓存用户会话信息,尤其在分布式系统中通过Redis等缓存共享会话数据。
  • 文件系统缓存:缓存文件的元数据或部分内容,减少文件系统的I/O操作。

三、缓存键、值、过期时间设置

  • 键的设置

    唯一性:缓存键必须具备唯一性,通常可以通过业务逻辑拼接相关字段来构建唯一的键。

    哈希策略:对于长键,可以对其进行哈希,减少内存占用,同时提高查询效率。但不建议全键都为哈希,最好拼接一个业务前缀。

  • 值的设置

    大小控制:缓存值不宜过大,避免大数据量的缓存项占用过多内存。

    序列化:对于复杂对象,缓存值需要进行序列化和反序列化,选择合适的序列化机制可以优化性能。

  • 过期时间设置

    合理设置TTL:根据数据更新频率进行权衡,长期不变的数据可以设置较长的TTL,频繁变化的数据应设置较短的TTL。

    动态过期:通过动态调整过期时间,可以提高缓存的命中率。

    随机发散:避免所有缓存同时过期,合理设置不同的随机过期时间。

四、同步策略

  • 旁路缓存策略

    工作机制:应用程序首先查询缓存,如果缓存中存在所需数据,则直接返回;如果缓存中没有数据,则从数据库读取数据,再插入到缓存中。写操作时,先更新数据库,再删除缓存。

    优点:适合读多写少的场景,数据一致性较好。

    缺点:缓存失效场景多,增加了数据库的压力;有额外的同步开销。

  • 读穿/写穿策略

    工作机制:缓存代理统一管理数据访问,应用程序只和缓存交互。读操作时,如果缓存命中则直接返回,如果未命中,则由缓存代理从数据库读取数据并写入缓存。写操作时,缓存代理直接写入数据库并更新缓存。

    优点:简化应用程序代码,读操作性能较高。

    缺点:不适合分布式缓存场景,可能存在缓存一致性问题。

  • 写回策略

    工作机制:应用程序只更新缓存,缓存数据定期批量同步到数据库。

    优点:写性能极高,减少数据库压力。

    缺点:存在数据一致性问题,适合对数据一致性要求不高的业务场景。

五、淘汰算法

  • LRU(Least Recently Used):根据最近的访问时间进行淘汰,优先淘汰那些最近最少被访问的数据。
  • LFU(Least Frequently Used):优先淘汰访问频率最低的数据。
  • Redis 的 LRU 实现:使用近似LRU算法,通过随机采样n个键,淘汰时间戳最旧的一个。
  • Caffeine 的 Window-TinyLFU:结合LRU和LFU的优点,缓存分为Window和Main两个区域,Window存储短期热点数据,Main采用TinyLFU进行频率统计管理。

六、技术选型

  • ConcurrentHashMap:适合小规模、轻量级的单机缓存需求,性能极高,但不支持过期、淘汰机制。
  • Caffeine:适合单机应用中需要高效缓存管理和复杂淘汰策略的场景,支持先进的缓存淘汰策略,性能极高。
  • Redis:适合分布式系统、微服务架构下需要共享缓存、数据持久化或大规模缓存管理的场景,支持分布式缓存、多种数据结构和持久化机制。

七、最佳实践

  1. 缓存预热:在系统启动时,预先将常用数据加载到缓存中。
  2. 缓存穿透防护:使用布隆过滤器或缓存空值来防止查询不存在的数据直接穿透到数据库层。
  3. 缓存雪崩防护:合理设置不同的缓存过期时间,避免大量缓存同时失效。
  4. 缓存击穿防护:对热点数据加锁或采用单请求排队机制,防止同一时刻多个请求同时导致缓存失效。
  5. 强一致实现思路:设置短的过期时间、加锁、延迟双删、异步监听bin log然后刷缓存等。

综上所述,缓存的使用需要综合考虑适用场景、缓存内容、键值设置、过期时间、同步策略、淘汰算法和技术选型等多个方面,以实现最佳的性能和一致性。