• redis缓存 面试总结


    缓存的收益和成本

    1、缓存带来的回报

    高速读写:缓存加速读写速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、Ehcache缓存数据库结果

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

    2、缓存带来的代价

    数据不一致:缓存层和数据层有时间窗口不一致,和更新策略有关    

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

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

    堆内缓存是由jvm分配的缓存

    • jvm运行时数据区:堆、java虚拟机栈、方法区、本地方法栈、程序计数器

    堆内缓存和远程服务器缓存redis的选择

    • 堆内缓存一般性能更好,远程缓存需要套接字传输
    • 用户级别缓存尽量采用远程缓存
    • 大数据量尽量采用远程缓存,服务节点化原则

    redis的特性

    redis有哪些特性

    • 丰富的数据类型
    • 可用于缓存,消息按key设置过期时间,过期后自动删除   setex  set expire时间
    • 支持持久化方式rdb和aof
    • 主从分布式,redis支持主从支持读写分离 redis cluster,动态扩容方式。

    你用过redis的哪几种特性

    • 用sorted Set实现过排行榜项目
    • 用过期key结合springboot cache实现过缓存存储
    • redis实现分布式环境seesion共享
    • 用布隆过滤器解决过缓存穿透
    • redis实现分布式锁
    • redis实现订单重推系统

    redis缓存雪崩

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

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

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

    1、数据预热

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

    2、双层缓存策略

    C1为原始缓存,C2为拷贝缓存,C1失效时,可以访问C2,C1缓存失效时间设置为短期,C2设置为长期

    3、定时更新缓存策略

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

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

    redis的缓存穿透

    什么是缓存穿透?

    缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

    防止缓存穿透的解决方案

    • 缓存空值

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

    • 采用布隆过滤器BloomFilter->优势占用内存空间很小,bit存储。性能特别高。

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

     

  • 相关阅读:
    动态代理,反射的用途及实现
    谈一谈web.xml中的context-param和init-param
    后端程序员需要了解的前端知识(持续更新中)
    angularJS要点记录,$location,$http等等
    HTTP1.0和HTTP2.0的区别,以及HTTP和HTTPS的区别
    浅谈Fork/Join框架
    ConcurrentHashMap 的工作原理及源码分析,如何统计所有的元素个数
    HTTP协议常见的状态码
    图解HTTP,状态码,TCP、UDP等网络协议相关总结(持续更新)
    jmeter(五)JDBC Request
  • 原文地址:https://www.cnblogs.com/xbwang520/p/11520973.html
Copyright © 2020-2023  润新知