redis学习笔记

1、redis过期键的删除策略

1、惰性过期:只有去访问一个key时,才会去判断key是否已过期,过期则清除
节省cpu资源,但是可能会有大量的过期key没有访问,会浪费内存
2、定期过期:每隔一段时间会去扫描一定数据的expires字典中一定数量的key并清除其中已过期的key,并清除其中已过期的key
redis中同时使用了惰性过期和定期过期两种方案

2、缓存雪概念和解决方案?

缓存雪崩:是指同一时间缓存大面积失效,后面的请求都会落到数据库,致使数据库短时间承压太高而崩掉
解决方案:
1、缓存数据的过期时间设置随机,防止同一时间缓存大面积失效
2、缓存预热,提前将部分热点数据放入缓存
3、加锁,用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。

3、、缓存穿透概念和解决方案?

缓存穿透:缓存和数据库中都没有的数据,导致所有请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉
解决方案:
1、缓存空值
如果一个查询返回的数据为空,(查询为空的数据,在Redis也查不到)仍然把这个空结果(null)进行缓存,设置短一点的空结果过期时间,之后再次访问这个数据将会从缓存中获取,保护了后端数据源。
2、布隆过滤器
布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,控制层先进行校验,可以检索一个元素是否在一个集合中;不符合则就丢弃,从而避免对底层存储系统的查询压力。一定不存在的数据会被拦截掉

4、缓存击穿概念和解决方案?

缓存击穿:是指缓存中没有但数据库中有的数据(一般是缓存时间到期),此时由于并发量太大,同时都缓存没读到数据,又同时去数据库读,引起数据库瞬间压力过大
解决方案:
1、设置热点数据永不过期
2、使用锁。查询redis如果返回的数据为空,设置排它锁。由于排它锁同一时间只能有一个线程持有,如果设置成功,则查询数据库。设置失败,休眠一段时间再差

5、用ZK实现分布式锁的原理

(1)创建一个目录mylock;
(2)线程A想获取锁就在mylock目录下创建临时顺序节点;
(3)获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;
(4)线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点;
(5)线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。

6、消息队列的作用(为什么要使用消息队列)

削峰 异步 解耦
解耦例子:A系统需要发送数据到BCD系统,通过接口调用的方式,如果需求变动,不需要发送数据到B系统,需要发送数据到EF系统,这时候由于A系统与其他系统严重耦合,导致维护困难。此时如果使用MQ,把数据发送到MQ,如果其他系统需要,就去消费MQ数据,不需要则取消
异步例子:比如业务系统调用风控,调用成功以后风控返回业务系统调用成功。然后风控起异步线程去执行风控流程,风控流程执行完成以后发消息通知业务系统风控结果
削峰例子:例如A系统每秒最多处理2k个请求,再多系统就会奔溃。在高峰期的时候每秒会有6k请求进来,此时可以使用mq,将请求写入到mq,设置A系统每秒从mq拉取请求的格式为2k个,这样A系统就会逐渐把高峰期的请求转移到峰谷时处理

7、消息队列的缺点

(1、系统可用性降低。mq挂掉会影响所有系统(镜像集群模式)
(2、系统复杂度提高。消息是否重复消费、怎么处理消息丢失、消息传递顺序
(3、数据一致性问题。如果多个系统消费同一个消息,有的处理成功了 有的处理失败

8、消息堆积

先修复 consumer 的问题,确保其恢复消费速度,然后将现有 consumer 都停掉。
新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量。
然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue。
接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。这种做法相当于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常的 10 倍速度来消费数据。
等快速消费完积压数据之后,得恢复原先部署的架构,重新用原先的 consumer 机器来消费消息。

9、如何避免消息重复投递或重复消费

生产者投递:
MQ-client生成inner-msg-id,保证上半场幂等。
这个ID全局唯一,业务无关,由MQ保证。
消费者消费:
业务发送方带入biz-id,业务接收方去重保证幂等。
这个ID对单业务唯一,业务相关,对MQ透明。

10、那如果消息积压达到磁盘上限,消息被删除了怎么办?

我们发送的消息记录是落库保存了的,而转发发送的数据也保存了,那么我们就可以通过这部分数据来找到丢失的那部分数据,再单独跑个脚本重发就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值