面试题答案
一键面试缓存穿透产生原因
- 查询不存在数据:应用程序频繁请求一个在数据库中不存在的数据,由于该数据在数据库和缓存中都不存在,每次请求都会绕过缓存直接查询数据库,若大量这种请求同时到来,就会对数据库造成巨大压力,可能导致数据库不堪重负甚至崩溃。
常见解决方案及原理
- 布隆过滤器(Bloom Filter)
- 原理:布隆过滤器是一个由二进制向量(位数组)和一系列哈希函数组成的数据结构。当一个元素加入布隆过滤器时,通过多个哈希函数将该元素映射到位数组的不同位置,并将这些位置设为1。查询时,对元素再次进行同样的哈希计算,查看对应位置是否都为1,如果有一个位置为0,则该元素一定不存在;如果都为1,则该元素可能存在(存在误判率)。在缓存穿透场景中,将数据库中所有存在的键值对的键先通过布隆过滤器进行处理。当有查询请求时,先经过布隆过滤器判断,如果布隆过滤器判定该键不存在,则直接返回,不再查询数据库;如果判定可能存在,再查询数据库并更新缓存。这样可以有效拦截大部分不存在数据的查询,避免穿透到数据库。
- 缓存空值
- 原理:当查询数据库发现数据不存在时,将这个空值也缓存起来,并设置一个较短的过期时间。下次再有相同的查询请求时,直接从缓存中获取这个空值并返回,避免再次查询数据库。这样可以防止大量对不存在数据的请求穿透到数据库。但需要注意设置合适的过期时间,若过期时间过长,在数据实际插入数据库后,应用程序可能还在返回缓存中的空值;若过期时间过短,则可能无法有效拦截重复的无效请求。