redis常见面试题

Posted blackomen

tags:

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

MemCache与redis的区别

Memcache:代码层次类似于Hash

  • 支持简单数据类型
  • 不支持数据持久化存储
  • 不支持主动
  • 不支持分片

    Redis:键值对存储结构 类似HashMap

  • 数据类型丰富
  • 支持数据磁盘持久化存储
  • 支持主从
  • 支持分片

    Redis数据类型

  • String:最基本的数据类型,二进制安全
  • Hash:String元素组成的字典,适合于存储对象
  • List:列表,按照String元素插入顺序排序
  • Set:String元素组成的无序集合,通过哈希表实现,不允许重复
  • Sorted Set:通过分数来为集合中的成员进行从小到大的排序
  • 用于计数的HyperLongLog,用于支持存储地理位置信息的Geo

    Redis模糊匹配

  • keys k1* :从缓存库中全量查询出所有模糊匹配的key
  • scan 0 match k1* count 10 : 基于游标(首次查询游标为0)不定批量(10-)查询

    Redis实现分布式锁

    1.破坏原子性

  • SetNX key value:如果key不存在则创建并赋值
  • Expire key seconds:设置key的生存时间,解决SetNX长期有效的问题

    2.改进方案

  • set key value [EX seconds] [PX millSeconds] [NX] [XX]
    • 设置过期时间秒EX/毫秒PX
    • 当key不存在时才进行操作NX/key存在时才进行操作XX

      Redis异步队列

  • 使用list作为队列,rpush生产消息,lpop消费消息-->立即消费消息
  • blpop key timeout:阻塞直到队列有消息或者超时-->只能供一个消费者消费
  • pub/sub:主题/订阅模式-->消息发布是无状态的,无法保证消息是否可达

    Redis持久化策略 默认RDB+AOF

  • RDB:保存某个时间点的全量数据快照
    • Bgsave:检查进程中是否存在RDB/AOF子进程,没有则触发持久化rdbSaveBackground,系统调用fork创建进程,使用写时复制进行快照
  • AOF:记录除查询外的所有变更数据库状态指令,以append形式追加增量数据保存到AOF文件中
    • 指令可读 保存增量数据,使用日志重写解决AOF文件大小不断增加的问题

      pipeline:类似于linux中的管道,用于批量执行指令,节省多次IO往返时间

      Redis主动同步机制:master写操作/slave读操作 redis sentinel:解决主从同步master宕机后的主从切换问题

  • 全量同步机制(同步操作):将从服务器的数据库状态更新至主服务器当前所处的数据库状态
    • 从服务器向主服务器发送SYNC命令;
    • 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令;
    • 当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
    • 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
  • 增量同步机制(命令传播操作):在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态
    • 在执行完同步操作之后,如果主服务器执行了写操作,那么主服务器的数据库状态就会修改,并导致主从服务器状态不再一致。
      主服务器会将自己执行的写命令,也即是造成主从服务器不一致的那条写命令,发送给从服务器执行,当从服务器执行了相同的写命令之后,主从服务器将再次回到一致状态。

      缓存问题

  • 缓存穿透:访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。
    • 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
    • 访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间。
  • 缓存雪崩:大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。
    • 可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。
  • 缓存击穿:一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。
    • 在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。

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

面经 | Redis常见面试题

面经 | Redis常见面试题

Redis常见面试题

测开常见面试题什么是redis

redis集群的常见面试题

Redis常见面试题总结