2018/4/16 15:09:05当前位置推荐好文程序员浏览文章

Redis有哪些数据结构?

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

假如你是Redis中高级消耗户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。

假如你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。

使消耗过Redis分布式锁么,它是什么回事?

先拿setnx来争抢锁,抢到之后,再消耗expire给锁加一个过期时间防止锁不记得了释放。

这时候对方会告诉你说你答复得不错,而后接着问假如在setnx之后执行expire之前进程意外crash或者者要重启维护了,那会怎样样?

这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,如同接下来的结果是你主动思考出来的,而后答复:我记得set指令有非常复杂的参数,这个应该是能同时把setnx和expire合成一条指令来消耗的!对方这时会显露笑容,心里开始默念:摁,这小子还不错。

如果Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,假如将它们一律找出来?

使消耗keys指令能扫出指定模式的key列表。

对方接着追问:假如这个redis正在给线上的业务提供服务,那使消耗keys指令会有什么问题?

这个时候你要答复redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才可以恢复。这个时候能使消耗scan指令,scan指令能无阻塞的提取出指定模式的key列表,但是会有肯定的重复概率,在客户端做一次去重即可以了,但是整体所花费的时间会比直接消耗keys指令长。

使消耗过Redis做异步队列么,你是怎样消耗的?

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

假如对方追问可不能不消耗sleep呢?list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。

假如对方追问可以不可以生产一次消费屡次呢?使消耗pub/sub主题订阅者模式,能实现1:N的消息队列。

假如对方追问pub/sub有什么缺点?在消费者下线的情况下,生产的消息会丢失,得使消耗专业的消息队列如rabbitmq等。

假如对方追问redis如何实现延时队列?我预计现在你很想把面试官一棒打死假如你手上有一根棒球棍的话,怎样问的这么详细。但是你很克制,而后神态自若的答复道:使消耗sortedset,拿时间戳作为score,消息内容作为key调消耗zadd来生产消息,消费者消耗zrangebyscore指令获取N秒之前的数据轮询进行解决。

到这里,面试官暗地里已经对你竖起了大拇指。但是他不知道的是此刻你却竖起了中指,在椅子背后。

假如有大量的key需要设置同一时间过期,一般需要注意什么?

假如大量的key过期时间设置的过于集中,到过期的那个时间点,redis可可以会出现短暂的卡慢现象。一般需要在时间上加一个随机值,使得过期时间分散少量。

Redis如何做持久化的?

bgsave做镜像全量持久化,aof做增量持久化。由于bgsave会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要aof来配合使消耗。在redis实例重启时,会使消耗bgsave持久化文件重新构建内存,再使消耗aof重放近期的操作指令来实现完整恢复重启之前的状态。

对方追问那假如忽然机器掉电会怎么?取决于aof日志sync属性的配置,假如不要求性可以,在每条写指令时都sync一下磁盘,就不会丢失数据。但是在高性可以的要求下每次都sync是不现实的,一般都使消耗定时sync,比方1s1次,这个时候最多就会丢失1s的数据。

对方追问bgsave的原理是什么?你给出两个词汇即可以了,fork和cow。fork是指redis通过创立子进程来进行bgsave操作,cow指的是copy on write,子进程创立后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐步和子进程分离开来。

Pipeline有什么好处,为什么要消耗pipeline?

能将屡次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使消耗redis-benchmark进行压测的时候能发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。

Redis的同步机制理解么?

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

能否使消耗过Redis集群,集群的原理是什么?

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

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

网友评论