面试必问之缓存

1.缓存有哪些类型?

  • 本地缓存:在进程中的内存中缓存,没有远程交互,但缓存较小无法扩展,可使用Ehcache实现
  • 分布式缓存:分布式系统下的缓存系统,需要远程请求,性能不如本地缓存
  • 多级缓存:本地缓存只保存访问频率最高的热点数据,其他的放在分布式缓存

2.缓存淘汰策略有哪些?

  • FIFO先进先出:利用双向链表来保存数据,新数据添加到链尾,Cache满后删除链表头部数据
  • LFU最少使用:新数据添加队列尾部,缓存命中引用计数增加,队列重新排序,Cache满后删除队列尾部数据
  • LRU使用率低:新数据添加链表头部,缓存命中将数据移到头部,Cache满后删除链表尾部数据

3.常用缓存Redis、Memcache

  Redis

  • 单线程处理请求,采用了非阻塞异步处理机制,并且是内存操作IO时间不会太长,避免上下文切换产生的代价,支持持久化和多种数据格式,提供主从同步机制,Cluster集群部署能力,实现高可用,但依然会有缓存雪崩、缓存穿透、缓存击穿

  Memcache

  • 将数据全部存在内存中,数据不能超过内存大小且不能持久化,只能存字符串,只能存KeyValue,没有赋值和同步机制

 

Redis详解

  • 八种数据结构:String、Set、List、Hash、Sorted set、Bitmaps(可实现布隆过滤器)、HyperLogLog(可实现去重统计)、Geo(实现保存地理位置)
  • 持久化:支持RDB内存快照和AOF日志文件
  • 主从架构:一主多从,主负责写,并将数据复制到从节点,从负责读,读写分离
  • 主从同步:1.当启动 Slave Node时,会发送 PSYNC 命令到 Master Node

                2.初次连接会触发一次全量复制并启动一个后台线程生成RDB快照,同时将所有写命令缓存在内存

        3.RDB生成完后,会发送给Slave,Slave写入磁盘后从磁盘加载到内存中

        4.Master在将内存中的命令发送给Slave,并同步这些数据

        5.如因断网或机器宕机导致Master和Slave断开连接,会自动重连并断点续传

          注意:在Redis2.8版本之前,同步采用SYNC命令,复制功能分为同步和命令传播,针对断点续传效率很低,

             在2.8版本之后解决了这个问题,PSYNC具有完整同步和部分同步两种模式,具体详解请参照官网

  • 哨兵集群:集群监控、消息通知、故障转移、配置中心  一般都是配置3个哨兵节点
  • 集群监控:哨兵会不断检查 Master 和 Slave是否正常
  • 消息通知:当被监控的某个节点出现问题,哨兵会通过API发送通知到管理员
  • 宕机类别:主观下线为单个哨兵对 Master 做出的下线判断,客观下线为多个哨兵对 Mster 做出SDOWN判断,并通过SENTINEL is-master-down-by-addr命令相互交流后做出的下线判断
  • 故障转移:当Master 宕机后哨兵之间会进行选举,推选一个哨兵成为新的 Master,当客户端连接失效的 Master 时,集群会返回新的 Master 地址,Master 的配置文件也会发生改变,哨兵的监控目标也会                        变为新Master
  • 缓存更新:主动更新能够很大保证数据一致性问题,即更新完数据库在更新缓存;其次是超时剔除,对数据设置过期时间,超过过期时间自动删除,然后再次进行缓存;淘汰策略算法
  • 缓存穿透:在缓存和数据库中均查不到数据,造成大量请求数据库,导致数据库宕机
      •   解决方案:1.在数据库查不到直接在缓存中赋值空值并设置过期时间

              2.布隆过滤器,将数据库数据哈希映射到过滤器,不存在直接返回,存在再去查缓存

  • 缓存雪崩:当缓存服务器重启或大量缓存集体失效,造成大量请求数据库,导致数据库宕机
      •   解决方案:1.双机房部署以及主从+哨兵机制,设置Redis节点避免全盘崩溃

                  2.设置本地缓存、限流降级请求默认数据

                                   3.优化缓存过期时间或设置缓存不过期

  • 缓存击穿:某个热点数据失效时,大量针对这个数据的请求会穿透到数据库
      •   解决方案:1.互斥锁或JVM锁,只有第一个线程能拿到锁执行数据库查询,其他线程阻塞等待,等第一个线程将数据写入缓存,其他线程直接走缓存

                                   2.设置热点不过期,异步加载数据更新缓存,但会导致短时间内数据不一致,如果缓存刷新不上还会产生脏数据   

                                   3.缓存自动续期、二级缓存等,但在没有发生时会造成资源浪费

  • 待补充......
posted @ 2022-03-23 21:04  王嗡嗡  阅读(116)  评论(0)    收藏  举报