面试题答案
一键面试缓存穿透产生原因
- 查询不存在数据:应用程序请求查询一个在数据库和缓存中都不存在的数据。由于缓存中没有命中,就会直接查询数据库,而数据库也无此数据,每次这类请求都会穿过缓存直接打到数据库,当大量此类请求并发时,就会给数据库造成巨大压力,甚至导致数据库崩溃。
常见防御措施及优缺点
-
布隆过滤器
- 优点:
- 高效性:布隆过滤器可以在内存中快速判断一个元素是否存在,时间复杂度接近常数级,对于大规模数据的快速过滤效果显著,能有效拦截大量不存在的数据请求,减少数据库压力。
- 节省空间:相比于直接存储所有可能的键值,布隆过滤器通过位运算来表示数据,占用的内存空间非常小,适合海量数据场景。
- 缺点:
- 误判率:布隆过滤器存在一定的误判率,即可能会把不存在的数据误判为存在,但不会把存在的数据误判为不存在。这意味着仍可能有少量无效请求穿透到数据库。
- 维护成本:如果数据动态变化频繁,如频繁新增或删除数据,布隆过滤器的维护成本较高,因为需要重新构建过滤器以保证准确性。
- 优点:
-
缓存空值
- 优点:
- 实现简单:只需在数据库查询到不存在数据时,将空值(如null)也缓存起来,并设置一个较短的过期时间,实现起来代码改动较小,容易部署。
- 即时生效:对于首次查询不存在的数据,能立即将其缓存,后续相同请求直接从缓存获取空值,避免重复查询数据库。
- 缺点:
- 缓存浪费:缓存空值会占用一定的缓存空间,如果此类不存在数据的请求较多,会浪费较多缓存资源。
- 数据一致性:由于设置了过期时间,在过期后可能又会有请求穿透到数据库,并且如果数据库中数据发生变化(如原本不存在的数据后来插入了),但缓存空值未及时更新,可能导致短暂的数据不一致问题。
- 优点: