缓存雪崩 Cache Avalanche
- 概念
高并发系统中,如果缓存系统故障,大量的请求直接访问到后台数据库系统,导致数据库挂掉,整个系统彻底崩溃 - 解决方案
造成雪崩的原因主要是缓存系统高可用性较差,所以可以通过提高缓存系统的稳定性和可用来来解决
redis作为缓存系统,可以通过哨兵机制、集群化、持久化等来提高可用性
缓存穿透 Cache Penetration
- 概念
高并发系统中,如果一个请求的数据在缓存中不存在,同时在数据库中也不存在,当某一时间点出现大量的这种请求,会导致系统正常的请求无法及时处理,从而出现问题 - 解决方案
- 把不存在的key存储null到缓存中,但是这种做法会导致缓存中存储大量不存在的数据,一般不建议这么做
- 另外一种解决方式,转换为查找问题,类似于在海量数据中查找key是否存在,一般选用布隆过滤器来实现
布隆过滤器有非常多的用途,包括:垃圾邮件识别、搜索蜘蛛爬虫url去重等,主要借助K个哈希函数和一个超大的bit数组来降低哈希冲突本身带来的误判,从而提高识别准确性。
布隆过滤器也存在一定的误判,假如判断存在可能不一定存在,但是假如判断不存在就一定不存在,因此刚好用在解决缓存穿透的key查找场景,事实上很多系统都是基于布隆过滤器来解决缓存穿透问题的。
缓存击穿 Hotspot Invalid
- 概念
缓存系统中的大量热点数据在同一时间点过期失效,这些数据的访问就会请求到数据库中,给数据库系统造成很大的压力,可能造成系统的崩溃 - 解决方案
- 设置热点数据过期时间尽量分散,在原有基础上增加一个随机值
- 多线程加锁,其中一个线程发现cachemiss后进行加锁,从数据库获取到内容后放入缓存中,其他线程在获取锁失败阻塞数ms后再次访问时可直接从缓存中获取到值,这样可以降低访问数据库的线程数。需要注意的是单机和集群环境需要使用不同的锁,集群环境下需要使用分布式锁,同时由于锁的使用可能影响并发的效率
- 另外一种做法是在业务层对使用的热点数据查看是否即将过期,如果即将过期则去数据库获取最新的数据进行更新并延长该热点key在缓存系统中的时间,从而避免后面的过期cachemiss
网友评论