缓存在带来性能提升和支持高并发的同时,也带来另一个问题,如果缓存宕机导致所有的缓存失效,所有的流量都压到后端的服务上,例如数据库层。这时,后端服务因为压力过大无法提供服务或快速响应,缓存因为等待后端请求的响应而“热”不起来,最终导致“雪崩”问题。
在高并发系统中,解决缓存失效有以下三个思路:
- Consistent Hashing一致性hash算法,缓存分片,增加虚拟节点来保证服务器能均匀地分布在圆环上,最大限度地减小服务器增减节点时产生的缓存重新分布问题。
- 备份。由中间件把缓存复制多份,一旦缓存宕机时能切换到另一份缓存上
- 实现缓存持久化或半持久化。所谓的持久化就是定期把缓存里面的数据刷到磁盘,保存起来,在缓存失效时能保证大部分数据仍然有效,例如使用Redis或MemcacheDB把一些数据存到磁盘。可能有人会说:“是否在刷磁盘那一刻会影响缓存的高效性?”这可以考虑通过高端硬件(例如Fushion IO或SSD作为存储设备),来减少刷Cache过程中减少对服务的影响
运维层面:
- 缓存空间大小的使用率
- 缓存的命中率
- 响应时间、以及qps
- 服务器的网络带宽、CPU、内存、硬盘I/O