缓存入门

缓存

  • 问题起因: cpu处理速度快,而读取数据库/磁盘上的数据慢,造成性能瓶颈

  • 解决思路:空间换时间,把磁盘上是数据 放在速度更快的内存里读取

一般缓存都有这些功能:数据存取、过期时间、淘汰机制、命中率统计

  • 缓存缺点:增加系统复杂性,开发成本往往会增加

本地缓存

java HashMap 的数据在内存中,读取速度比数据库快
把数据保存在 HashMap 或 ConcurrentHashMap 读取,就是一个本地缓存的实现了,

缓存入门

  • 本地缓存缺点:
    1. 各个相同服务之间的本地缓存的数据无法共享。对分布式架构支持不友好
    2. 容量受服务部署所在的机器限制明显

分布式缓存

  • mysql,oracle 是在磁盘的 数据库服务
  • 分布式缓存(Distributed Cache) 是在内存的 数据库服务

缓存入门

  • 分布式缓存缺点:
    1. 需要新增Redis 或 Memcached 等分布式缓存服务应用,要单独保证分布式缓存服务应用的高可用。

缓存读写模式/更新策略

Cache Aside Pattern(旁路缓存模式)

以 DB 的结果为准
有首次请求数据一定不在 cache 的问题,对于热点数据可以提前放入缓存中。
适合读请求比较多的场景

  • 写:更新 DB,然后直接删除 cache 。
  • 读:从 cache 中读取数据,
    读取到:就直接返回,
    读取不到:就从 DB 中取数据返回,然后再把数据放到 cache 中。

Read/Write Through Pattern(读写穿透)

由 cache 服务来负责 cache 和 DB 的读写。同步更新 cache 和 DB
减轻了应用程序的职责

  • 写(Write Through):先查 cache,
    cache 中不存在:直接更新 DB。
    cache 中存在:先更新 cache,然后 cache 服务自己更新 DB(同步更新 cache 和 DB)。
  • 读(Read Through): 从 cache 中读取数据,
    读取到:就直接返回 。
    读取不到:先从 DB 加载,写入到 cache 后返回响应。

Write Behind Pattern(异步缓存写入)

由 cache 服务来负责 cache 和 DB 的读写。异步更新 cache 和 DB
写性能非常高, 适合数据经常变化的业务场景(文章的点赞数量、阅读数量)

只更新缓存,不直接更新 DB,改为异步批量的方式来更新 DB。