缓存:
缓存好处:
- 加速读写
- 降低后端负载(例如很复杂的sql)
- 加速请求响应,对数据缓存,例如redis可以达到万次的读写速度
成本:
- 数据不一致, 缓存与数据库的数据不一致(跟更新策略有关系)
- 代码成本: 需要处理缓存与数据库层的逻辑,代码增加
- 运维成本增加
更新策略:
LRU(最近最少访问),LFU(访问频率,最少访问换出),FIFO(先进先出)
超时剔除
主动更新(真实数据更新主动通知缓存更新,代码或者通过消息队列等进行通知更新)
缓存穿透:
缓存空对象: 缓存不命中,然后回数据库查询, 查询为空, 不缓存,
如果攻击者一直利用缓存穿透则可能对数据库照成很大压力,甚至宕掉
可以对对于数据进行缓存,但是会带来内存空间消耗,如果是大量攻击,则可能会大量内存,也可能照成宕机
布隆过滤器, 将关键的key进行缓存,例如id, 做第一层的缓存。
雪崩:
缓存层不能提供服务, 则数据库层将直接处理所有请求,则所有压力在于数据库层,可能造成进一步宕机, 引起雪崩效应
优化:
- 保障缓存层高可用
- 将后端进行限流,降级
热点key重建优化
热点key,一般并发量非常大
重建不可能在短时间内完成
因此:
减少重建次数
数据尽可能一致
互斥锁。加锁进行重建更新
由于操作系统拥有swap, 利用磁盘做虚拟内存,扩展内存,但这样容易照成缓存性能下降,因此一般禁用缓存