Redis面试题
1.说一下redis,在什么地方会用到它,为什么要用到它,用到它的好处?
1.数据缓存服务器
2.分布式锁
3.应对高速读写
4.分布式系统数据共享
5.消息发布订阅
2.Redis有哪些数据结构?
字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
3.使用过Redis分布式锁么,它是什么回事?
setnx可以使得只有一个线程可以设置key,我们使用expire给锁添加一个过期时间防止锁没有释放形成死锁
这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
那会造成再也没有线程可以拿到这把锁了,死锁;我们需要保证setnx和expire是一个原子性的操作,可以使用lua脚本实现
4.使用过Redis做异步队列么,你是怎么用的?能不能生产一次消费多次呢?
使用lpush和rpop进行出列入列的操作,考虑到CPU利用率的问题,使用阻塞消息,blpush和lrpop,但是需要注意如果redis连接闲置很久,会抛异常需要注意异常捕获以及重试机制;如果要消费多次可以使用pub/sub发布和订阅.功能,但是发布和订阅会导致如果消费者下线消息会丢失的情况,因此我们一般会使用专业的rabbitmq消息队列实现消息的发布和鼎业,如果要实现延迟队列的功能,可以使用list+zset,key是消息内容,score是要消费的时间戳,每秒扫描一次队列当时间戳小于当前时间就进行消费,实现了延迟队列的功能
5.如果有大量的key需要设置同一时间过期,一般需要注意什么?
在高并发环境下很可能会导致缓存雪崩的情况,当同一时间段内大量的key失效,所有的请求将达到底层存储系统,导致下层存储系统崩溃;所以我们在设置过期时间的时候一般会加入一个随机值使得过期时间散列,并且根据业务场景对具体的key进行设置具体值,实现服务的稳定;
6.Redis如何做持久化的?
Redis支持两种持久化方案,RDB和AOF
RDB是默认开启的采用dump.rdb作为持久化文件,15分钟一次,5分钟10次,1分钟1w次会触发bgsave做全量的持久化,直接存储数据
AOF默认是关闭的,需要手动开启,支持三种模式,使用appendonly.aof作为持久化文件,每秒钟写入,no不自动写入,需要手动调用save
Redis支持同时进行两种持久化,redis重新会先读取aof文件恢复,如果没有就使用rdb恢复
bgsave做镜像全量持久化,aof做增量持久化。因为bgsave会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要aof来配合使用。在redis实例重启时,优先使用aof来恢复内存的状态,如果没有aof日志,就会使用rdb文件来恢复。
如果再问aof文件过大恢复时间过长怎么办?
你告诉面试官,Redis会定期做aof重写,压缩aof文件日志大小。
如果面试官不够满意,再拿出杀手锏答案,Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。这个功能甚至很多面试官都不知道,他们肯定会对你刮目相看。
如果对方追问那如果突然机器掉电会怎样?取决于aof日志sync属性的配置,如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。
7.Redis的同步机制了解么?
Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
8.是否使用过Redis集群,集群的原理是什么?
redis的集群分为两种
1.主从复制读写分离
主从复制中,集群中会有一台Maste主机,专门处理写操作,其他为Slave从机,用于处理读操作,当主机宕机,哨兵会发起投票,重新选举master实现从机上位,其他从机跟随,实现集群的高可用,因此很明显redis的设计是AP设计
2.Cluster提高redis的存储容量,备机实现高可用
Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。
Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。
9.什么是Redis?
10.使用Redis有哪些好处?
(1) 速度快,因为数据存在内存中
(2) 支持丰富数据类型,支持string,list,set,zset,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
12.为什么redis需要把所有数据放到内存中?
因为内存的读写速度远高于磁盘,而redis就是用来解决高速读写的问题的;
13.redis内存回收策略
noeviction拒接访问
lru最近最少访问
random随机
ttl失效时间最短
allkey所有的key
volitial设置了失效时间的key
14.假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
使用keys指令可以扫出指定模式的key列表。
对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。
15,redis相比memcached有哪些优势?
(1) 数据类型丰富
memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) 速度快
redis的速度比memcached快很多
(3) 支持持久化
redis可以持久化其数据
(4) 部分支持事务
(5)value大小
redis最大可以达到1GB,而memcache只有1MB
16.redis常见性能问题和解决方案:
(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…
这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。