评论

收藏

[NoSQL] Redis高频面试点

数据库 数据库 发布于:2021-07-08 18:04 | 阅读数:410 | 评论:0

  0x01:内存淘汰策略

  •   noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键;
  •   allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键;
  •   volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键;
  •   allkeys-random:加入键的时候如果过限,从所有key随机删除;
  •   volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐;
  •   volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键;
  •   volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键;
  •   allkeys-lfu:从所有键中驱逐使用频率最少的键;
  0x02:过期策略
  Redis是key-value数据库,可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。

  •   定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  •   惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  •   定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。(expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)
  0x03:缓存穿透
  定义:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是***者,***会导致数据库压力过大。
  解决方案:

  •   接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  •   从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止***用户反复用同一个id暴力***;
  0x04:缓存击穿
  定义:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
  解决方案:

  •   设置热点数据永远不过期;
  •   加互斥锁;
  0x05: 缓存雪崩
  定义:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,        缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
  解决方案:

  •   缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生;
  •   如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中;
  •   设置热点数据永远不过期;
  0x06:部署方案

  •   单机模式
DSC0000.png


  •   主从模式
DSC0001.png


  •   哨兵模式
DSC0002.png


  •   集群模式
DSC0003.png

  对于Redis的集群模式,是Redis 3.0之后才推出cluster分布式集群方案;在Redis 3.0之前可以采用中间件代理的模式,例如使用Twemproxy、Codis和Nginx。
  0x07:持久化机制RDB和AOF
  RDB就像是一台给Redis内存数据存储拍照的照相机,生成快照保存到磁盘的过程。触发RDB持久化分为手动触发和自动触发。Redis重启读取RDB速度快,但是无法做到实时持久化,因此一般用于数据冷备和复制传输。
  优点:

  •   非常适合全量备份
  •   恢复速度比AOF快
  缺点:

  •   RDB方式没有办法做到实时持久化
  •   版本兼容RDB格式问题
  RDB方式不能提供强一致性,如果Redis进程崩溃,那么两次RDB之间的数据也随之消失。那么AOF的出现很好的解决了数据持久化的实时性,AOF以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令来恢复数据。AOF会先把命令追加在AOF缓冲区,然后根据对应策略写入硬盘(appendfsync)。
  优点:

  •   做到最多丢失1-2s内的数据(最多丢失2s数据,因为AOF追加阻塞)
  缺点:

  •   AOF文件比RDB文件大
  •   可能导致追加阻塞
  
0x08:Redis常用业务场景

  •   热点数据的缓存
  •   限时业务的运用
  •   计数器相关问题
  •   排行榜相关问题
  •   分布式锁
  •   延时操作
  •   分页、模糊搜索
  •   点赞、好友等相互关系的存储
  •   队列
DSC0004.jpeg
  
关注下面的标签,发现更多相似文章