美文网首页
redis常见面试题

redis常见面试题

作者: vincent浩哥 | 来源:发表于2019-10-20 20:51 被阅读0次
    缓存带来了什么回报?
    • 高速读写
      缓存加速读写速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、Ehcache缓存数据库结果

    • 降低后端负载
      后端服务器通过前端缓存降低负载: 业务端使用Redis降低后端MySQL负载等

    缓存带来了什么代价?
    • 数据不一致
      缓存层和数据层有时间窗口不一致,和更新策略有关

    • 代码维护成本
      原本只需要读写MySQL就能实现功能,但加入了缓存之后就要去维护缓存的数据,增加了代码复杂度。

    • 堆内缓存可能带来内存溢出的风险影响用户进程,如ehCache、loadingCache

    • 堆内缓存和远程服务器缓存redis的选择
      1)堆内缓存一般性能更好,远程缓存需要套接字传输
      2)用户级别缓存尽量采用远程缓存
      3)大数据量尽量采用远程缓存,服务节点化原则

    什么是缓存雪崩?你有什么解决方案来防止缓存雪崩?

    缓存雪崩:如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。 由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU 和内存造成巨大压力,严重的会造成数据库宕机。

    解决方法:

    • 加锁排队
      key: whiltList value:1000w个uid
      指定setNx whiltList value nullValue
      mutex互斥锁解决,Redis的SETNX去set一个mutex key, 当操作返回成功时,再进行load db的操作并回设缓存; 否则,就重试整个get缓存的方法

    • 数据预热
      缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key

    • 双层缓存策略(redis集群)
      C1为原始缓存,C2为拷贝缓存,C1失效时,可以访问C2,C1缓存失效时间设置为短期,C2设置为长期。

    • 定时更新缓存策略
      失效性要求不高的缓存,容器启动初始化加载,采用定时任务更新或移除缓存

    • 设置不同的过期时间,让缓存失效的时间点尽量均匀

    什么是缓存穿透?你有什么解决方案来防止缓存穿透?

    缓存穿透:指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候, 在缓存中找不到对应key的value,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次 无用的查询)。这样请求就绕过缓存直接查数据库。

    解决办法:

    • 采用布隆过滤器BloomFilter
      将所有可能存在的数据哈 希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

    • 缓存空值
      如果一个查询返回的数据为空(不管是数据不 存在,还是系统故障)我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 通过这个直接设置的默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库

    相关文章

      网友评论

          本文标题:redis常见面试题

          本文链接:https://www.haomeiwen.com/subject/tfmcpctx.html