Redis 面试题
1 缓存穿透
直接查询一个不存在的数据,MySQL 查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库。
方案一:缓存空数据,查询返回的数据为空,仍把这个结果进行缓存
- 优点:简单
- 缺点:消耗内存,可能会发生不一致的问题
方案二:布隆过滤器
布隆过滤器
bitmap(位图):相当于是一个以 bit 为单位的数组,数组中每个单元只能存储 0 或 1
布隆过滤器作用:可以用于检索一个元素是否在一个集合中
- 存储数据:通过多个 hash 函数获取 hash 值,根据 hash 计算数组对应位置改为 1
- 查询数据:使用相同 hash 函数获取 hash 值,判断对应位置是否都为 1
误判率:数组越大,误判率越小
2 缓存击穿
当一个热点 key 过期的时候,恰好这个时间点对这个 key 有大量的并发请求过来,这些并发的请求可能会瞬间把 DB 压垮
- 方案一:互斥锁
- 方案二:逻辑过期