Redis缓存设计

做~自己de王妃 提交于 2020-08-17 20:58:39

缓存的收益及成本

  1. 收益:加速读写、降低后端负载
  2. 成本:数据不一致性、代码维护成本、运维成本

缓存更新策略

  1. LRU/LFU/FIFO算法剔除,用于缓存使用量超过预设最大值时的缓存处理
  2. 超时剔除:缓存数据超过过期时间后自动删除,存在一定时间的数据不一致性
  3. 主动更新:应用方对数据的一致性要求较高,需要在真实数据更新后立刻更新缓存数据

缓存粒度控制(即缓存的内容应该如何选择)

  • 基于通用性、空间占用及代码维护三个层面考虑

缓存穿透优化(查询一个根本不存在的数据,缓存层和存储层都不会命中)

  1. 缓存空对象,这样在访问时会从缓存中直接返回空对象,保护了数据库
    • 空值缓存意味着更多的键和内存空间,需要给这些空对象设置较短的过期时间
    • 缓存层和存储层会存在一定时间的数据不一致现象
  2. 布隆过滤器,通过布隆过滤器判断键是否存在,不存在就不访问存储层,使用面积有限

缓存无底洞优化(缓存节点水平扩展后,性能因为获取的键散步于不同的机器上导致的IO增多使得请求反而变慢的现象)

  1. 串行执行,简单对所有请求的键执行get
  2. 串行IO,计算出请求的键分布于哪些节点上,对这些节点做mget或pipeline
  3. 并行IO,与串行IO的不同仅在于并行的请求节点做mget或pipeline
  4. hash_tag,将请求的键放到一个节点上

雪崩优化(缓存大量失效导致请求打到存储层)

  1. 保证业务高可用性
  2. 依赖隔离组件为后端限流降级

热点key重建优化(缓存失效的瞬间,热点key的大面积请求导致后台瞬间负载增大)

  1. 互斥锁:一个线程重建,其余线程等待(现已优化为一个线程重建,其余线程返回老数据)
  2. 永远不过期:现基本已改为缓存预重设
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!