redis-缓存设计和优化

缓存的收益与成本

收益

  1. 加速读写
  2. 降低后端负载

成本

  1. 数据不一致
  2. 代码维护成本更高:多了一层缓存逻辑
  3. 运维成本:Redis cluster

使用场景

  1. 降低后端负载: 对高消耗的运算结果进行缓存
  2. 加速请求响应 I/0
  3. 大量写合并为批量写:先累计在DB持久化

缓存更新策略

  1. LRU/LFU/FIFO算法剔除: maxmemory-policy
  2. 超时剔除:expire
  3. 主动更新:开发控制生命周期

一致性:3>2>1
低一致性要求时:最大内存和淘汰策略
高一致性要求时:超时剔除和主动更新结合,最大内存和淘汰策略兜底

缓存粒度控制

  1. 通用性:全量属性更好
  2. 占用空间:部分属性更好
  3. 代码维护:表面上全量属性更好

缓存穿透优化

当大量请求无法命中缓存时,DB压力瞬间暴增。访问根本不存在的数据会一直访问DB。原因:1. 业务代码自身问题 2. 恶意攻击,爬虫,排查:业务的响应时间、业务本身问题、相关指标:总调用数、缓存命中数、存储层命中数
解决办法:

  1. 缓存空对象(最好设置过期时间)弊端:1. 需要更多的键。2. 缓存层和存储层数据短期(过期时间)不一致。
  2. 布隆过滤器拦截:详细处理

无底洞问题优化

加了硬件性能不升反降

  1. 优化命令本身 慢查询 keys hgetall bigkey
  2. 减少网络通信次数
  3. 降低接入成本:客户端长连接、连接池、NIO

缓存雪崩优化

todo

热点KEY重建优化

  1. 三个目标
  • 减少重建缓存的次数
  • 数据尽可能一直
  • 减少潜在危险
  1. 两个解决
  • 互斥锁 对重建过程加锁 具有一致性,代码复杂,存在死锁的风险
  • 永远不过期 通过判断逻辑过期时间,使用单独线程更新缓存(存在缓存不一致)能杜绝热点key重建问题 维护逻辑过期时间增加为成本,增加内存成本.

你可能感兴趣的:(redis)