【redis】- 问答

10/31/2022 reds

redis被问烂的面试题来喽

# 缓存雪崩

定义:redis缓存中大量的key同时失效,此时又刚好有大量的请求打进来,直接打到数据库层,造成数据库阻塞甚至宕机。
解决办法:缓存雪崩的事前事中事后的解决方案如下:

  • 事前:
    1、Redis的高可用,搭建redis集群+哨兵模式。
    2、缓存预热。
    3、热点key设置永不过期。
  • 事中:
    1、我们可以使用本地缓存避免所有的请求都发送到数据库。
  • 事后:
    1、如果缓存服务宕机了,这里我们可以开启「Redis」 持久化

# 缓存穿透

定义:在正常的情况下,用户查询数据都是存在的,但是在异常情况下,缓存与数据都没有数据,
但是用户不断发起请求,这样每次请求都会打到数据库上面去,这时的用户很可能是攻击者,
攻击会导致数据库压力过大,严重会击垮数据库。
解决办法

  • 我们可以在接口层添加校验,不合法的直接返回即可,没必要做后续的操作。
  • 进行key的缓存空值。下次查询就不会到数据库中去查询。
  • 进行添加布隆过滤器(Bloom Filter)

# 缓存击穿

定义:我们在平常高并发的系统中,大量的请求同时查询一个key时,假设此时,这个key正好失效了,
就会导致大量的请求都打到数据库上面去,这种现象我们称为击穿。
击穿是对于单个key值的缓存失效过期,雪崩则是大面积key同时失效

解决办法:

  • 直接让热点数据永远不过期,定时任务定期去刷新数据就可以了。
  • 添加互斥锁,为了避免出现缓存击穿的情况,我们可以在第一个请求去查询数据库的时候对他加一个互斥锁,
    其余的查询请求都会被阻塞住,直到锁被释放,后面的线程进来发现已经有缓存了,就直接走缓存,从而保护数据库。
    但是也是由于它会阻塞其他的线程,此时系统吞吐量会下降。需要结合实际的业务去考虑是否要这么做。

# 持久化

RDB

Redis会将数据集的快照dump到dump.rdb文件中。 此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率

save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 300 100 #在300秒(5分钟)之后,如果至少有100个key发生变化,则dump内存快照。

save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
1
2
3
4
5

img_18

AOF

aof 默认是不开启的

img_17

appendonly no # 默认是关闭的,如果开启设置为yes就ok了
1

在Redis的配置文件中存在三种同步方式,它们分别是:

appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。
1
2
3

img_16

Last Updated: 11/17/2022, 2:12:12 PM