让开发
成为一种享受!

2020 Redis 面试题整理

缓存穿透、击穿、雪崩区别

缓存穿透

描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案:接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;

从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

缓存击穿

描述:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

解决方案:设置热点数据永远不过期。加互斥锁

缓存雪崩

描述:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是:缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。

设置热点数据永远不过期。

过期数据的处理策略

主动处理(redis主动触发检测key是否过期)每秒执行10次。过程如下

  1. 从具有相关过期的密钥集中测试20个随机密钥
  2. 删除找到的所有已过期密钥
  3. 如果测试的密钥中25%已过期,则会从步骤1重新开始

被动处理

每次访问key的时候,发现超时后被动过期,清理掉。

过期数据在数据恢复阶段的处理策略

  • RDB方式过期的key不会被持久化到文件中。载入时过期的key,会通过redis的主动和被动方式清理掉。
  • AOF方式当redis使用AOF方式持久化时,每次遇到过期的key,redis会追加一条del命令道AOF文件,也就是说只要顺序载入执行AOF命令文件就会删除过期的键。

缓存淘汰策略

FIFO 先进先出(First In First Out)是一种简单的淘汰策略,缓存对象以队列的形式存在,如果空间不足,就释放队列头部的(先缓存)对象。一般用链表实现。

LRU 最近最少使用(Least Recently Used),这种策略是根据访问的时间先后来进行淘汰的,如果空间不足,会释放最久没有访问的对象(上次访问时间最早的对象)。比较常见的是通过优先队列来实现。

LFU 最不频繁使用(Least Frequently Used),这种策略根据最近访问的频率来进行淘汰,如果空间不足,会释放最近访问频率最低的对象。这个算法也是用优先队列实现的比较常见。

RANDOM

在所有key里随机回收;在已经过期的key里随机回收

TTL

回收已经过期的key,并且优先回收存活时间较短的键

Redis主从复制流程

  1. 从服务器通过psync命令发送服务器已有的同步进度(同步源ID、同步进度offset)
  2. master收到请求,同步源为当前mater,则根据偏移量增量同步
  3. 同步源非当前master,则进入全量同步,master生产rdb,传输到slave,加载到slave内存

Redis内存不足,如何解决

  • 增加内存
  • 执行淘汰策略
  • 搭建Redis集群或增加集群实例数

哨兵机制核心作用

服务发现和健康检查、故障转移(主从切换 )

服务发现和健康检查流程

搭建redis主从集群 -> 启动哨兵(客户端通过哨兵发现Redis实例信息) -> 哨兵通过连接master发现主从集群内的所有实例信息 -> 哨兵监控Redis实例的健康状态

故障转移流程

哨兵一旦发现master不能正常提供服务,则通知给其他哨兵 -> 当一定数量的哨兵都认为master挂了 -> 选举一个哨兵作为故障转移的执行者 -> 执行者在slave中选取一个作为新的master -> 将其他slave重新设定为新的master的从属

哨兵如何知道Redis主从信息(自动发现机制)

扫码关注公众号:Java开发乐园

在聊天窗口回复:vip

输入验证码,即可永久解锁本站全部文章

扫码关注【Java开发乐园】

Java开发乐园

扫码关注【东方】

微信:东方

验证码:
赞(0) 打赏
转载请注明出处:Java开发乐园 » 2020 Redis 面试题整理

来评论一下嘛~ 抢沙发

评论前必须登录!

 

我愿终生等候,换你刹那凝眸

留点🐾印

打赏即是一种肯定,谢谢您的肯定

支付宝扫一扫打赏

微信扫一扫打赏