Redis面试三板斧(一)

1.Redis有哪些数据结构?

        字符串String,字典Hash,列表List,集合Set,有序集合SortedSet。

        中高级 HyperLogLog,Geo,Pub/Sub

2.使用过Redis分布式锁嘛?

        先拿setnx来争抢锁,再用expire给锁增加一个过期时间防止锁忘记释放,如果再setnx之后,expire之前出现异常,我们可以通过set指令可以同时把setnx和expire合成一条指令来执行

3.如果redis里面有1个亿的key,其中10W个是相同前缀开头的,如何将他们查找出来

使用keys指令,如果redis正在线上,就不能用keys,因为redis是单线程的,keys命令会导致线程阻塞一段时间,直到查出数据为止。这个时候可以使用scan命令,但是会有一定重复的概率,在客户端进行一次去重即可。

4.redis的异步队列

一般使用list作为队列,rpush生产消息,lpop消费消息,当lpop没有消息的时候,要适当的sleep一会重试

对方追问,可不可以不使用sleep 有一个指令是blpop在没有消息的时候,他会阻塞住直到消息到来

怎么实现一次生产多次消费呢?可以使用pub/sub主题订阅模式,可以实现1:N的消息队列

pub/sub有什么缺点呢?

在消费车下线的情况下,生产的消息会丢失,需要使用专业的mq

对方如果问如何实现延时队列?

        使用sortedset 拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。

5.如果有大量的key需要设置同一时间过期需要注意什么?

一般需要在时间上加上一个随机值,使过期时间分散。

6.Redis如何做持久化

bgsave做镜像全量持久化,aof做增量持久化。因为bgsave比较耗费时间,不够实时,在停机的时候会导致大量丢失数据,所以需要aof配合使用,在redis重启后,优先使用aof来恢复内存的状态,如果没有aof日志,就会使用rdb文件来恢复。

如果aof文件过大,恢复时间过长怎么办?

Redis会定期对aof进行重写,压缩aof日志的大小,同时Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增江做了融合处理,这样保证了恢复的效率又兼顾了数据的安全性,

如果突然机器掉电会怎样?取决于aof日志sync属性的配置,如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。

bgsave的原理是什么?

fork和row fork是指redis通过创建子进程来进行bgsave操作,cow是指copy on write,子进程创建之后,父进程继续提供读写服务,写脏的数据会逐渐和子进程分开

7.Pipeline有什么好处?

可以将多次IO操作缩减为一次,前提是pipeline执行的指令之间没有因果关系,使用redis-benchmark进行压力测试的时候可以发现影响redis的QPS峰值一个重要因素就是pipeline批次指令的数目。

8.Redis的同步机制了解过么?

Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

9.是否使用过Redis集群,集群的原理是什么?

Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。

Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。

猜你喜欢

转载自blog.csdn.net/Chen_leilei/article/details/120510768