面试题答案
一键面试缓存穿透原理
缓存穿透指的是客户端请求的数据在缓存中不存在,并且在数据库中也不存在,导致请求每次都会穿透到数据库,给数据库带来压力。例如,恶意用户频繁请求一个不存在的 key,缓存因为没有命中就会去查询数据库,而数据库也查不到数据,每次查询都会给数据库造成负担。
可能带来的危害
- 数据库压力增大:大量无效请求直接打到数据库,可能导致数据库性能下降甚至崩溃。
- 服务可用性降低:数据库响应缓慢或不可用,会影响整个系统的正常运行,导致服务无法正常提供给用户。
解决方案
- 布隆过滤器
- 原理:布隆过滤器是一个二进制向量和一系列随机映射函数。当一个元素被加入集合时,通过多个哈希函数将这个元素映射成一个位数组中的若干个点,将这些点置为 1。查询时,只要这些点有一个为 0 则表示该元素一定不在集合中,如果都是 1 则该元素很可能在集合中。
- 优点:空间效率和查询时间都远远超过一般的算法,能快速判断一个元素是否在集合中。
- 缺点:存在误判率,即可能会把不在集合中的元素误判为在集合中,但不会把在集合中的元素误判为不在集合中。
- 缓存空值
- 原理:当查询数据库也没有查到数据时,在缓存中设置一个空值,并设置一个较短的过期时间。下次再查询同样的数据时,缓存命中,直接返回空值,避免穿透到数据库。
- 优点:实现简单。
- 缺点:会额外占用缓存空间,并且如果过期时间设置不合理,可能会在过期后短暂时间内再次出现缓存穿透。
方案优化以适应高并发且数据规模较大的业务场景
- 布隆过滤器优化
- 动态调整布隆过滤器大小:根据数据规模的增长动态调整布隆过滤器的大小,以控制误判率。例如,当数据量接近布隆过滤器的容量上限时,重新构建一个更大的布隆过滤器,并将原数据重新插入。
- 多布隆过滤器结合:可以使用多个布隆过滤器,每个布隆过滤器负责一部分数据范围,这样可以减少单个布隆过滤器的压力,提高查询效率。
- 缓存空值优化
- 分布式缓存一致性:在高并发分布式系统中,确保缓存空值的一致性。可以使用分布式锁,在设置缓存空值时先获取锁,避免多个节点同时设置不同的空值。
- 智能过期时间:根据业务特点,采用智能算法来设置过期时间。例如,对于访问频率较低的不存在数据,设置较短的过期时间;对于访问频率较高的不存在数据,适当延长过期时间,以减少缓存穿透的概率。