问1: 什么是缓存穿透
答:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库
解决方案一:缓存空数据(优点:简单;缺点:消耗内存,可能发生数据不一致的问题)
解决方案二:布隆过滤器(优点:内存占用较少,没有多余key;缺点:实现复杂,存在误判)
问1: 什么是布隆过滤器
答:布隆过滤器主要是用于检索一个元素是否在一个集合中。
一般使用的是redisson实现的布隆过滤器。它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在。
问2: 什么是缓存击穿
答:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮
解决方法一:缓存失效时先使用redis的setnx去设置一个互斥锁,成功去load db并回设缓存,否则重试get缓存的方法(强一致,性能差)
解决方法二:设置当前key逻辑过期,设置key时同时设置一个过期时间字段一块存入缓存中,查询时取出判断是否过期,如果过期则开通另一线程进行数据同步,当前线程正常返回旧数据(高可用,性能优,不能保证数据绝对一致)
问3: 什么是缓存雪崩
答:在同一时段大量的缓存key同时失效或者redis服务宕机,导致大量请求到达数据库,带来巨大压力
解决方法:将key的缓存失效时间分散开,可以在原有失效时间基础上增加一个随机值(设置redis集群,添加多级缓存Guava或Caffeine)
处理三大问题的保底策略:降级限流策略
问4: Redis的优缺点
答:优点:1、速度快:基于内存的数据库,读写速度非常快
2、支持多种数据结构:String(存储简单的字符串数据),List(存储有序的元素列表,支持排序和去重),Hash(存储对象和映射关系,哈希可以将一个对象的多个属性存储在一个键值对中,并且可以快速地根据某个属性进行查询),Set(存储不重复的元素集合),Zset(Sorted Set)(存储有序的元素集合)
3、高可用:支持主从复制,哨兵模式,集群
4、支持事务:保证一组操作的原子性
5、可扩展性:支持水平扩展,通过增加节点来提高系统的并发能力和存储能力
缺点:1、数据易丢失:如果服务器重启或关闭,数据将会丢失,需要使用持久化来保证数据的安全性
2、内存占用大:数据存储在内存中,数据量较大会占用较多的内存空间
3、不支持复杂查询:不支持复杂的查询操作,如关联查询,聚合查询等
4、性能受网络影响:如果网络延迟较大,可能会影响redis的性能