一、Redis相关面试题
1.redis数据类型
答:string、Hash、list、无序集合、有序集合
2.redis过期策略?内存淘汰策略?
答:
过期策略:
1.定时删除:创建一个定时器,到时间立即执行删除操作(对内存友好,因为能保证过期了立马删除,但是对cpu不友好)
2.惰性删除:键过期不管,每次获取键时检查是否过期,过期就删除(对cpu友好,但是只有在使用的时候才可能删除,对内存不友好)
3.定期删除:隔一段时间检查一次(具体算法决定检查多少删多少,需要合理设置)
内存淘汰策略:
1.volatile-lru(当内存不足时,从设置了过期时间的key中使用LRU算法,选出最近使用最少的数据,进行淘汰)
2.allkeys-lru(当内存不足时,从所有的key中使用LRU算法,选出最近使用最少的数据,进行淘汰)
3.volatile-lfu(当内存不足时,从设置了过期时间的key中使用LFU算法,选出使频率最低的数据,进行淘汰)
4.allkeys-lfu(当内存不足时,从所有的key中使用LFU算法,选出使频率最低的数据,进行淘汰)
5.volatile-random(当内存不足时,从设置了过期时间的key中,随机选出数据,进行淘汰。)
6.allkeys-random(当内存不足时,从所有的key中,随机选出数据,进行淘汰。)
7.volatile-ttl(当内存不足时,从设置了过期时间的key中,选出即将过期的数据(按照过期时间的先后,选出先过期的数据),进行淘汰。)
8.noeviction(当内存不足时,禁止淘汰数据,写入操作报错默认策略,是Redis默认的内存淘汰策略)
3.什么是缓存雪崩、击穿、穿透?
答:
击穿:缓存某个热点失效,此时大量的访问该热点数据,导致数据库压力剧增,高并发冲垮数据库(解决办法:1、互斥锁,2.缓存永不过期)
穿透:当用户访问数据时既不在缓存中,也不在数据库中(解决办法:1、非法请求限制,2、缓存空值或者默认值、3、使用过滤器来判断)
雪崩:当大量的缓存失效或者redis宕机时,全部请求访问数据库导致数据库请求量过大,严重导致宕机。(解决办法:1、互斥锁 2、均匀设置过期时间)
二、Kafka相关面试题
1.如何提升Kafka的吞吐量
答:1.batch.size:批次大小,默认16k 2. linger.ms:等待时间,修改为5-100ms 3.compression.type:压缩snappy 4.RecordAccumulator:缓冲区大小,修改为64m
2.ACK应答级别
答:
acks=0,生产者发送过来数据就不管了,可靠性差,效率高;
acks=1,生产者发送过来数据Leader应答,可靠性中等,效率中等;
acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer应答,可靠性高,效率低;
在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用于传输和钱相关的数据, 对可靠性要求比较高的场景。
3.生产端如何保证数据可靠性?
答:
- ACK级别设置为-1
- 分区副本大于等于2
- 3. ISR里应答的最小副本数量大于等于2
4.Kafka如何解决数据重复?
答:Kafka运用了幂等性PID+Partition+SeqNumber 其中PID是Kafka每次重启都会分配一个新的;Partition 表示分区号;Sequence Number是单调自增的。(开启参数 enable.idempotence 默认为 true,false 关闭)
5.生产端如何保证数据有序?
答:
1)kafka在1.x版本之前保证数据单分区有序,条件如下:
max.in.flight.requests.per.connection=1(不需要考虑是否开启幂等性)。
2)kafka在1.x及以后版本保证数据单分区有序,条件如下:
(1)未开启幂等性
max.in.flight.requests.per.connection需要设置为1。
(2)开启幂等性
max.in.flight.requests.per.connection需要设置小于等于5。
原因说明:因为在kafka1.x以后,启用幂等后,kafka服务端会缓存producer发来的最近5个request的元数据, 故无论如何,都可以保证最近5个request的数据都是有序的。
6.borker端如选举Leader?
答:在isr中存活为前提,按 照AR中排在前面的优先。例如 ar[1,0,2], isr [1,0,2],那么leader就会按照1,0,2的顺序轮询