1.Rdis常见的使用场景
- 缓存
- 分布式锁(redision,setnx)
- 计数器
- 保存token
- 消息队列
- 延迟队列
2.说明一下缓存雪崩,缓存穿透和缓存击穿以及解决方式
1.缓存雪崩
定义: 缓存雪崩指的是当大量的缓存数据同时失效,或者Redis服务器突然宕机,导致后端数据库突然承受大量请求的压力,从而可能导致数据库崩溃的情况。
解决:
1. 分散缓存过期时间:给缓存设置不同的过期时间,避免同时失效。
2. 使用Rdis集群: 如果是Redis服务器突然宕机导致的雪崩,可以使用Redis集群提高服务的可用性,如(哨兵模式或集群模式)
3. 限流降级:在访问量剧增时,采用限流策略,限制数据库的请求频率;或者采用降级策略,返回备选数据或默认值。
2.缓存穿透
定义:缓存穿透指的是查询一个一定不存在的数据,该数据不存在,每次请求都要到数据库去查询取数据并返回空值。
解决:
1. 布隆过滤器(Bloom Filter):预先判断key是否可能存在,如果布隆过滤器判断key不存在,则直接返回,减少无效查询。
2. 缓存空值:对于查询不存在的数据,也设置一个空值缓存,并设置合理的过期时间。
3. 缓存击穿
定义:缓存击穿是指缓存中某个key在失效的一瞬间,有大量的并发请求过来,这些请求发现缓存过期,就直接请求数据库,从而给数据库带来很大压力。
解决:
1.互斥锁:使用如Redis的setnx命令或其他方式来实现分布式锁,确保同一时间内只有一个线程去加载数据。
2.设置热点数据永不过期:对于热点数据,可以考虑设置永不过期,或者设置一个逻辑过期时间,如果查询发现数据逻辑过期,返回逻辑过期数据,同时开启互斥锁,另起一个线程更新最新热点数据,更新完毕释放锁。
3. 介绍一下双写一致性,并回答如何保证Redis和数据库双写一致性
双写一致性: