Redis系列2——常见面试题

一、Redis常见面试题

  1. redis基本数据类型

    有String,Hash,List,Set,Sort,SortedSet五种基本的数据结构,除此以外,还有HyperLogLog,Geo,Pub/Sub三种,还有Redis Module像BloomFilter,RedisSearch,Redis-ML。

  2. 大量key过期时间设置同一个时间过期,一般需要注意什么?

    如果大量的key过期时间设置的过于集中,到过期的时间点时,redis可能会出现短暂的卡顿现象。严重的话会出现缓存雪崩,一般需要在过期时间上加一个随机值,使得过期时间分散一些。
    加上首页经常会使用定时任务刷新缓存,可能大量的数据失效时间都十分集中,如果失效时间一样,又刚好卡在失效的时间点大量用户涌入,就有可能造成缓存雪崩。

  3. 使用过redis分布式锁吗?是怎么回事?

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

  4. 如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?

    使用set指令可以把setnx和expire合成一条指令使用。

  5. 假入redis中有1亿个key,其中有10W个key是以某个固定的已知的前缀开头的,如何将他们全部找出来?

    使用keys指令可以扫出指定模式的key列表。

  6. 如果redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

    redis是单线程,keys指令会导致线程阻塞一段时间,线上服务会停顿,指导指令执行完毕,服务才能恢复。这个时候可以试用scan指令,scan指令可以无责色的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。
    不过,增量式迭代命令也不是没有缺点的:试用SMEMBERS命令可以返回集合键当前包含的所有元素,但是对于scan这类增量式迭代命令来说,因为在对键进行增量式迭代的过程中,键可能会被修改,所以增量式迭代命令只能对被返回的元素提供有限的保证。

  7. 使用过redis做异步队列吗?是怎么使用的?

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

  8. 如果不使用sleep呢?

    list有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。

  9. 能不能一次消费多次?

    使用pub/sub主题订阅者模式,可以实现1:N的消息队列。

  10. pub/sub有什么缺点?

    在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如RocketMQ等。

  11. Redis如何实现延时队列?

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

  12. Redis是怎么持久化的?服务主从数据怎么交互的?

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

  13. 如果突然机器掉电会怎样?

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

  14. RDB的原理是什么?

    fork和cow,fork指redis通过创建子进程来进行RDB操作,cow指copy onwrite,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

  15. Pipeline有什么好处,为什么要用pipeline。

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

  16. Redis的同步机制有了解么?

    Redis可以使用主从同步、从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将RDB文件全量同步到复制节点,复制节点接受完成后将RDB镜像加载到内存。加载完成后。在通过主节点将期间修改的操作记录同步到负直节点进行重放就完成了同步过程。后续的增量数据通过AOF日志同步即可。有点类似数据库的binlog。

  17. 是否使用过redis集群,集群的高可用怎么保证,集群的原理是什么?

    Redis Sentinal 着眼于高可用,在master宕机时会自动将salve提升为master,继续提供服务。
    Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。

  18. Redis 数据淘汰策略

    系统默认 no-eviction
    voltile-lru 在设置了过期时间的数据中, 淘汰最近最少使用的数据
    voltile-ttl 淘汰将设置了过期时间的数据, ttl大的优先淘汰 (即最接近过期的)
    voltile-random 随机淘汰设置了过期时间的数据
    allkeys-lru 淘汰最近最少使用的数据
    allkeys-random 任意选择淘汰
    no-eviction 禁止淘汰, 当内存不足时写入数据, 会返回错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值