redis准备
作为缓存中间件在项目中的普遍性,以及在面试中占据的高比重。
-
redis 使用场景 缓存、分布式锁、计数器、保存token、消息队列以及延迟队列实现等
-
其他面试问题 集群相关内容、redis实现的事务以及性能优势等
缓存相关面试题
缓存穿透、击穿、雪崩以及解决方案
双写一致问题
redis持久化问题
数据过期策略
数据淘汰策略
分布式锁也是面试常见内容
涉及redis实现的分布式锁及底层实现原理
setnx redission
消息队列、延迟队列
何种数据类型
缓存穿透概念:
根据文章id查询详情的需求; request --> redis(未查询到) ---> DB -->response (db中查询到,写入到redis)
常出现在有人故意攻击,故意使用些不存在的id伪造请求服务
数据库并发并不高,当请求到一定量时就会击垮数据库,导致宕机。
解决方案:
方案一:直接缓存null
缺点:缓存的压力变大,数据造成不一致
方案二:使用Bloom Filter
特性:查询快、可能出现假阳性(一个不在集合中元素时,可能出现错误地报告),无假阴性(如果布隆过滤器报告某个元素不存在时,那么可以确定该元素确实不存在)
缺点:存在误判率
实现方案:redisson、 guava
redisson 具体有布隆过滤器实现:
- 基础布隆过滤器
RBloomFilter:不支持删除,适用不需要删除元素的场景 - 计数器型布隆过滤器
RCountingBloomFilter:支持删除,使用计数器来跟踪每个位置被置为1的次数 - 布谷鸟布隆过滤器
RProbabilisticSet:支持删除,使用指纹来替代全量数据,通过布谷鸟机制解决哈希冲突。适用于需要删除操作且希望有较低空间开销的场景
guava 具体有布隆过滤器实现:
- 标准布隆过滤器:使用固定的位数组,不支持删除操作,适合不需要删除元素的场景、可以设置插入元素的数量和可接受的最大误报率
- 自定义哈希函数:需要特定哈希逻辑的场景
- 使用不同的数据类型:适用不同的数据类型的成员检查