缓存数据类型

临时数据(Temp Cache)

  • 如页面间传值、业务约束计数等;
  • 需要在负载均衡服务器间共享状态;
  • 过期时间视业务时间而定;
  • 特点:数据大小、过期时间不一致;占用内存较小,生成及使用间隔时间较短;

策略:

  1. 使用集中式缓存
  2. 过期时间较长且访问频率低的需要考虑独立存储防止被过期算法逐出;

缓存数据(DB Cache)

  • 需要减轻数据库访问压力;
  • 数据量可能较大;
  • 与数据库存在一致性要求;
  • 过期时间可能需要根据压力经常调整;

策略:

  1. 需要同时考虑数据在缓存中传输效率以及内存占用;
  2. 应当针对 1 考虑 key 设计及数据结构,
  3. 数据块过大情况下只能使用内存缓存,但如果占用应用内存无法保证命中率或 Web 服务器过多则需要考虑惊群现象,回避策略:
    1. 抖动:避免同时过期;
    2. 争先:读写锁模式,发现数据过期,其他线程阻塞直到更新;
    3. 延时:在数据过期前更新;
  4. 一致性数据库为准,如有改变应当使缓存过期或更新;

热数据(Hot Cache)

  • 生命周期内有性能需求的数据,且生命周期可能较短;
  • 可能被频繁创建和访问,但不经常被更改;
  • 数据结构不适合数据库索引;
  • 需要在负载均衡服务器间共享状态;

策略:

  1. 使用集中式缓存
  2. 每类数据独立存储
  3. 一致性以缓存为准:创建时双写,数据库作为备份,若数据有更新可能需要定时持久化;

Memcache 小抄

  1. 数据大小差异过大会导致 Slab 而不是端口内存不足逐出数据;
  2. 逐出使用 LRU 算法,创建后不被获取的数据可能会比已过期数据更易逐出;
  3. 已过期数据只要不被获取就不会被删除,仍旧会占用内存,使用离散键的缓存会造成内存虚高;
  4. stats cachedump slab_id limit_num,显示某个 slab 中的前 limit_num 个 key 列表,输出格式为: ITEM key_name [ value_length b; expire_time|access_time s]

    其中,memcached 1.2.2 及以前版本显示的是访问时间(timestamp),1.2.4 以上版本,包括 1.2.4 显示过期时间(timestamp); 如果是永不过期的 key,expire_time 会显示为服务器启动的时间。