redis面试题

Posted 2549372994jing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis面试题相关的知识,希望对你有一定的参考价值。

1.Redis有什么优点?

  1. 速度快:数据存储在内存中,类似于HashMap,操作和查找的时间复杂度都是O(1);

  2. 支持数据类型丰富:有字符串string,字典hash,列表list,集合set,有序集合zset

  3. 支持持久化

2.Redis有什么缺点?

  1. 存储受内存大小限制;

  2. 持久化时占用cpu较高

3.为什么redis单线程的效率这么高?

  1. 操作的内存,本身速度快;

  2. 使用单线程,避免了上下文切换。

4.Redis有几种持久化方式?

有全量RDB持久化和增量AOF持久化。

  1. 全量RDB持久化,在指定时间,fork一个子进程,将数据写入到临时文件,完成后替换之前的文件,用二进制压缩存储。
    1.1 可以灵活设置备份频率和周期,适合冷备份,恢复快,性能最大化。
    1.2 在完成持久化之前宕机,会丢失数据;fork子进程占用资源。

  2. 增量AOF持久化,将每一个非读操作,记录到文件中,使用操作恢复。
    2.1 使用追加模式,不会影响以前的数据;丢失数据量少;文件过大会重写压缩;生成的文件格式清晰,易于理解;
    2.2 生成的文件要大,恢复速度慢于RDB;运行效率低于RDB;操作回放更加脆弱。

5.如何从一亿个key中找到以某个固定前缀开头的key?

使用keys指令,匹配固定前缀;
Redis是单线程的,keys指令会导致阻塞,是服务停顿,指令执行完毕才可以恢复。
可以使用scan指令,但是可能有一定的重复,需要客户端去重,划分时间。

6.redis如何实现分布式锁?

使用setnx来争抢锁,再用expire加一个过期时间,防止忘记释放锁;
如果在执行setnx之后,expire之前发生异常,就会死锁;可以将setnx和expire合成一条指令;

7.redis如何做队列?

list是双端操作的,可以使用list作为队列,一端作为生产者入队rpush,另一端作为消费者出队lpop;
实现延迟队列,可以使用zortedset,使用时间作为score,zadd生产消息,zrangbyscore指定获取描述的数据。
如何生产一次,消费多次?可以使用发布订阅模式;缺点是消费者下线,消息会丢失。

8.如果大量的key在同一时间过期,需要注意什么?

过期时间过于集中,可能会出现短暂卡顿,可以加一个随机值,使过期时间分散一些。

9.什么是缓存穿透?如何解决?

查询一个一定不存在的数据,缓存中不存在,则会去数据库中查询,数据库中不存在则不会写入缓存,这导致每次查询都会查询数据库,使缓存失去意义。
可以使用空对象,当查询为空时,设置一个特殊的值,和真正合法数据区分开,要有一个较短的过期时间。
使用过滤器,先查缓存,缓存存在key则返回;不存在则查询过滤器,过滤器存在则说明不存在值,直接返回空,否则查询数据库。

10.什么是缓存雪崩?如何解决?

缓存无法使用导致请求全部到达数据库,导致数据库崩溃。
缓存高可用,减少缓存不可用时间;数据库限流;服务降级;

11.什么是缓存击穿?如何解决?

某个key失效时,大量的请求进入,将数据库瞬间压垮。
使用锁,确保只有一个线程去查询数据库;手动过期,不设置过期时间,所有key手动过期。

12.redis默认有多少数据库,如何指定?

默认有16个数据库,下标默认从0开始。可以通过配置database选项指定。
可以通过select 下标 切换数据库。

13.过期键删除策略?

主动删除:

  1. 定时删除:创建定时器,在键过期的时候,删除键;占用cpu。

  2. 定期删除:每隔一段时间,删除过期键。
    被动删除:
    惰性删除:在取出键的时候检查是否过期;有些键不被使用,永远无法删除。

14.save和bgsave的区别?

save:由于redis是单线程的,save会造成阻塞,在rdb文件创建完成期间不处理任何请求。
bgsave:会创建子线程,完成rdb文件的创建工作,主线程正常执行。
   在执行bgsave期间,主线程会拒绝save和bgsave命令;bgrewriteaof命令会延迟到bgsave命令结束之后执行。

15.旧版Redis复制过程是怎样的?

  1. 同步
    1.1 从服务器向主服务器发送sync指令
    1.2 主服务器收到sync命令,执行bgsave,生成rdb文件,并使用一个缓冲区记录备份开始后     执行的所有命令。
    1.3 主服务器bgsave执行完成后,将rdb文件发送给从服务器,从服务器接受rdb文件并载入。
    1.4 主服务器将缓冲区中的所有写命令发送给从服务器,从服务器执行命令。

  2. 命令传播
    2.1 主服务器会将自己的写命令同步给从服务器,从服务器执行命令。

16.旧版同步可能的问题是什么?

同步分为初次同步和断线后同步。
初次同步,并没有任何问题,可以很好的完成任务。
断线后同步,从服务器会再次发送sync指令,重新进行一次完整的同步。
但是从服务器和主服务器之间的差异,只是断线期间的差异,进行完全同步,耗费资源。

17.新版复制如何解决问题?

新本复制psync分为完整重同步和部分重同步。
完整重同步和sync的同步过程一致。
部分重同步用于断线情况,主服务器只将断线期间的写命令发送给从服务器执行。

以上是关于redis面试题的主要内容,如果未能解决你的问题,请参考以下文章

redis 常见的面试题,既是面试题也是知识点

Redis面试题:持久化文件与淘汰策略

面试题:2018最全Redis面试题整理

锁屏面试题百日百刷-Redis篇

锁屏面试题百日百刷-Redis篇

50道Redis面试题及答案整理,史上最全!