1 大量key需要同一时期设置过期需要注意什么?
- 如果大量的key过期时间设置的过于集中,到过期的那个时间点,Redis可能会出现短暂的卡顿现象,严重的话会出现缓存雪崩,我们一般需要在时间上加一个随机值,使得过期时间分散一些;
- 电商首页经常会使用定时任务刷新缓存,可能大量的数据失效时间都十分集中,如果失效时间一样,又刚好在失效的时间点大量用户涌入,就有可能造成缓存雪崩。
2 Redis分布式锁
- 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
3 如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
- set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的。
4 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?
- 使用keys指令可以扫出指定模式的key列表。
5 如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
- Redis的单线程的;keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复;这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长;
- 不过,增量式迭代命令也不是没有缺点的;举个例子,使用SMEMBERS命令可以返回集合键当前包含的所有元素,但是对于SCAN这类增量式迭代命令来说,因为在对键进行增量式迭代的过程中,键可能会被修改,所以增量式迭代命令只能对被返回的元素提供有限的保证 。
6 Redis做异步队列
- 一般使用list结构作为队列,rpush生产消息,lpop消费消息;当lpop没有消息的时候,要适当sleep一会再重试;
- 不用sleep时,list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来;
- 生产一次,消费多次:使用pub/sub主题订阅者模式,可以实现1:N的消息队列;
- pub/sub缺点:在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如RocketMQ等。
7 Redis如何实现延时队列
- 使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。
8 Redis如何持久化?服务主从数据怎么交互?
- RDB做镜像全量持久化,AOF做增量持久化;
- 因为RDB会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要AOF来配合使用;
- 在redis实例重启时,会使用RDB持久化文件重新构建内存,再使用AOF重放近期的操作指令来实现完整恢复重启之前的状态;
- Redis本身的机制是AOF持久化开启且存在AOF文件时,优先加载AOF文件;
- AOF关闭或者AOF文件不存在时,加载RDB文件;
- 加载AOF/RDB文件后,Redis启动成功;
- AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。
9 突然停电
- 取决于AOF日志sync属性的配置,如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据;
- 但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。
10 RDB原理
- fork和cow;
- fork是指redis通过创建子进程来进行RDB操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。
11 Pipeline
- 可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性;
- 使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。
12 Redis同步机制
- Redis可以使用主从同步,从从同步;
- 第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将RDB文件全量同步到复制节点,复制节点接受完成后将RDB镜像加载到内存;
- 加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程;
- 后续的增量数据通过AOF日志同步即可,有点类似数据库的binlog。
13 Redis集群
- Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务;
- Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。