面试题答案
一键面试1. 缓存穿透的定义
缓存穿透指的是客户端请求的数据在缓存中不存在,并且在数据库中也不存在,导致请求直接穿透到数据库,给数据库带来压力。例如,恶意用户不断请求一个不存在的商品ID,每次请求都绕过缓存去查询数据库。
2. 对Redis缓存一致性的影响
- 缓存无数据:由于请求的数据在缓存中不存在,Redis无法提供数据给客户端,请求继续访问数据库。
- 数据库无数据:数据库中也不存在该数据,导致每次请求都会对数据库进行无效查询,增加数据库压力,同时Redis中始终不会存入该数据,破坏了缓存与数据库之间的数据一致性关系。
3. 解决方案及优缺点
(1)布隆过滤器(Bloom Filter)
- 原理:布隆过滤器是一个基于概率的数据结构,它通过多个哈希函数将一个元素映射到一个位数组的不同位置并置为1。当查询一个元素时,若对应位置不全为1,则该元素一定不存在;若全为1,则大概率存在。
- 优点:
- 空间效率高,相比于其他数据结构,布隆过滤器占用的空间较小。
- 查询效率高,能快速判断一个元素是否存在,减少无效的数据库查询。
- 缺点:
- 存在误判率,即可能把不存在的元素误判为存在,但可以通过调整哈希函数个数和位数组大小来降低误判率。
- 布隆过滤器一旦生成,不能删除其中的元素,若有元素删除需求,需要使用计数布隆过滤器等变体,但这会增加空间复杂度。
(2)缓存空值
- 原理:当查询数据库发现数据不存在时,在Redis中缓存一个空值(例如null),并设置一个较短的过期时间。后续相同的请求过来时,直接从缓存中获取空值,避免再次查询数据库。
- 优点:
- 实现简单,不需要引入额外的组件,直接在业务代码中进行处理即可。
- 可以有效拦截对不存在数据的请求,减轻数据库压力。
- 缺点:
- 缓存空值会占用额外的缓存空间,若大量数据不存在,可能导致缓存空间浪费。
- 空值设置的过期时间较难把握,若过期时间过长,新数据写入后,旧的空值缓存可能还存在,影响数据一致性;若过期时间过短,则不能很好地拦截后续请求,增加数据库压力。