Redis, MQ相关高频知识点

1.缓存雪崩,缓存穿透,缓存击穿?

缓存雪崩:

        Redis中大量数据过期了,如果有大量的请求查询这些数据,导致请求全部打到mysql上,导致mysql宕机。

        解决方案:

             1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

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

缓存穿透:

         用户发送恶意请求,查询key(将id作为数据的key, id=负数) 肯定不存在的数据,导致请求一定会查询mysql,在高并发的情况下导致mysql宕机。

        缓存空结果。

        使用布隆过滤器

              1.在项目启动后,需要将mysql中数据,存储到布隆过滤器。

              2.先查询布隆过滤器中是否有数据

                  没有:直接响应数据不存在

                  有: 查询redis -------》 mysql

             注意点: 当mysql中数据发生变化(添加),向布隆过滤器中添加数据。

                            当mysql中数据发生变化(删除),不删除布隆过滤器中数据。

缓存击穿:

          某个热点key过期了,有大量请求 请求该热点key,这些请求一定会查询mysql,在高并发的情况下导致mysql宕机。

          热点数据永远不过期(不推荐)

          查询mysql加锁,并且进行双重检查

2.什么是布隆过滤器?

     概述: 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上由一个很长的二进制向量(二进制数组)和一系列随机映射函数(hash函数)。

     作用:布隆过滤器可以用于检索一个元素是否在一个集合中。

     判断数据是否存在: 使用相同的hash函数对数据进行哈希运算,得到哈希值。然后判断该哈希值所对应的数组位置是否都为1,如果不都是则说明该数据肯定不存在。如果是说明该数据可能存在,因为哈希运算可能就会存在重复的情况。

     误判率:数组越小误判率就越大,数组越大误判率就越小,但是同时带来了更多 的内存消耗。

    

3.Redis的数据持久化策略有哪些 ?

在Redis中提供了两种数据持久化的方式: 1.RDB  2.AOF

RDB

        定期更新,定期将Redis中的数据生成的快照同步到磁盘等介质上,磁盘上保存的就是Redis的内存快照。

        使用命令: save bgsave;

        使用配置的方式自动进行:

                       save 3600 1

                       save "" 禁用

                      rdbcompression yes

                      dbfilename dump.rdb

        优点: 数据文件的大小相比于aof较小,使用rdb进行数据恢复速度较快

        缺点: 比较耗时,存在丢失数据的风险

AOF

       将Redis所执行过的所有指令都记录下来,在下次Redis重启时,只需要执行指令就可以了

       appendonly no

       appendfsync always | everysec | no

       appendfilename "appendonly.aof"

       dir ./

       优点: 追求数据极致安全使用 AOF

       缺点: 数据文件的大小相比于rdb较大,使用aof文件进行数据恢复的时候速度较慢

4.Redis的数据过期策略有哪些?

      数据删除策略:Redis中可以对数据设置数据的有效时间,数据的有效时间到了以后,就需要将数据从内存中删除掉。而删除的时候就需要按照指定的规则进行删除,这种删除规则就称之为数据的删除策略。

     1.惰性删除

      概述:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key.

      优点:对CPU友好,我们只会在使用改键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。

      缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放。

      set name zhangsan 10

      get name 发现name过期了,直接删除key

     2.定期删除

     概述:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键)。

     优点:可以通过限制删除操作执行的市场和频率来减少删除操作对CPU的影响。另外定期删除,也能有效释放过期键占用的内存。

     缺点:难以确定删除操作执行的时长和频率。如果执行的太频繁,对CPU不好,执行的太少,过期键占用的内存不会得到及时释放。

另外重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务无法接受的。

      定期删除的两种模式:

  •  SLOW模式是定时任务,执行频率默认10hz,每次不超过25ms,以通过修改配置文件redis.conf的hz选项来调整这个次数
  •  FAST模式执行频率不固定,每次时间循环会尝试执行,但两次间隔不低于2ms,每次耗时不超过1ms

Redis的过期删除策略:惰性删除 + 定期删除 两种策略进行配合使用定期删除函数的运行频率

5.Redis的数据淘汰策略有哪些?

数据的淘汰策略:当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则就是内存的淘汰策略。

  1. 优先使用allkeys-lru策略。充分利用LRU算法的优势,把最近最长访问的数据留在缓存中。如果业务有明显的冷热数据区分,建议使用。
  2. 如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用allkeys-random,随机选择淘汰。
  3. 如果业务中有置顶的需求,可以使用volatile-lru策略,同时置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据。
  4. 如果业务中有短时高频访问的数据,可以使用allkeys-lfu 或 volatile-lfu策略。

 6.Redis的事务?

        简单来说,Redis事务就是一次性,顺序性,排他性的执行一个队列中的一系列命令。Redis中,单条命令式原子性执行的,但事务不保证原子性,且没有回滚

      

7.Redis是单线程的,但是为什么还那么快?

    Redis总体快的原因:

    1. 完全基于内存的,C语言编写

    2. 采用单线程,避免不必要的上下文切换可竞争条件

    3. 数据简单,数据操作也相对简单

    4. 使用多路 I/O 复用模型,非阻塞IO

8.RabbitMQ如何保证消息不丢失?

     消息从发送,到消费者接收,会经历多个过程,其中的每一步都可能导致消息丢失

   

 针对这些问题,RabbitMQ分别给出了解决方案:

 

 

9.消息的重复消费问题如何解决?

    在使用RabbitMQ进行消息收发的时候,如果发送失败或者消费失败会自动进行重试,那么就有可能会导致消息的重复消费。

    解决方案: 

          每条消息设置一个唯一的标识id

          幂等方案:

                       1.token + redis

                       2.分布式锁

                       3.数据库锁(悲观锁,乐观锁)

10.如果有100万消息堆积在MQ,如何解决?

     1.提高消费者的能力: 使用多线程消费

     2.增加更多消费者,提高消费速度,使用工作队列模式,设置多个消费者消费同一个队列中的消息。

     3.扩大队列容积,提高堆积上限:

             使用RabbitMQ惰性队列

             惰性队列:

                   1 接收到消息后直接存入磁盘而非内存

                   2 消费者要消费消息时才会从磁盘中读取并加载到内存

                   3 支持数百万条的消息存储

11.MQ延时队列

12.幂等性

13.MQ如何保证消息消费的顺序性

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值