辛德蕾拉|面试官:Redis缓存了解吗?面对这11道题是否有很多问号?( 六 )

  • AOF 日志文件即使过大的时候 , 出现后台重写操作 , 也不会影响客户端的读写 。 因为在 rewrite log的时候 , 会对其中的指令进行压缩 , 创建出一份需要恢复数据的最小日志出来 。 在创建新日志文件的时候 , 老的日志文件还是照常写入 。 当新的merge后日志文件ready的时候 , 在交换新老日志文件即可 。
  • AOF 日志文件的命令通过非常可读的方式进行记录 , 这个特性非常适合做灾难性的误删除的紧急恢复 。 比如某人不小心用 flushall 命令清空了所有数据 , 只要这个时候后台 rewrite 还没有发生 , 那么就可以立即拷贝 AOF 文件 , 将最后一条 flushall 命令给删了 , 然后再将该 AOF 文件放回去 , 就可以通过恢复机制 , 自动恢复所有数据 。
  • 对于同一份数据来说 , AOF 日志文件通常比 RDB 数据快照文件更大 。
  • AOF 开启后 , 支持的写 QPS 会比 RDB 支持的写 QPS 低 , 因为 AOF 一般会配置成每秒 fsync 一次日志文件 , 当然 , 每秒一次 fsync , 性能也还是很高的 。 (如果实时写入 , 那么 QPS 会大降 , redis 性能会大大降低)
  • 以前 AOF 发生过 bug , 就是通过 AOF 记录的日志 , 进行数据恢复的时候 , 没有恢复一模一样的数据出来 。 所以说 , 类似 AOF 这种较为复杂的基于命令日志 / merge / 回放的方式 , 比基于 RDB 每次持久化一份完整的数据快照文件的方式 , 更加脆弱一些 , 容易有 bug 。不过 AOF 就是为了避免 rewrite 过程导致的 bug , 因此每次 rewrite 并不是基于旧的指令日志进行 merge 的 , 而是基于当时内存中的数据进行指令的重新构建 , 这样健壮性会好很多 。
  • RDB 和 AOF 到底该如何选择
    • 不要仅仅使用 RDB , 因为那样会导致你丢失很多数据;
    • 也不要仅仅使用 AOF , 因为那样有两个问题:第一 , 你通过 AOF 做冷备 , 没有 RDB 做冷备来的恢复速度更快;第二 , RDB 每次简单粗暴生成数据快照 , 更加健壮 , 可以避免 AOF 这种复杂的备份和恢复机制的 bug;
    7、redis 集群模式的工作原理能说一下么?在集群模式下 ,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了 解一致性 hash 算法吗?面试官心理分析在前几年 , redis 如果要搞几个节点 , 每个节点存储一部分的数据 , 得借助一些中间件来实现 , 比如说有codis , 或者 twemproxy , 都有 。 有一些 redis 中间件 , 你读写 redis 中间件 , redis 中间件负责将你的数据分布式存储在多台机器上的 redis 实例中 。
    这两年 , redis 不断在发展 , redis 也不断有新的版本 , 现在的 redis 集群模式 , 可以做到在多台机器上 , 部署多个 redis 实例 , 每个实例存储一部分的数据 , 同时每个 redis 主实例可以挂 redis 从实例 , 自动确保说 , 如果 redis 主实例挂了 , 会自动切换到 redis 从实例上来 。
    现在 redis 的新版本 , 大家都是用 redis cluster 的 , 也就是 redis 原生支持的 redis 集群模式 , 那么面试官肯定会就 redis cluster 对你来个几连炮 。 要是你没用过 redis cluster , 正常 , 以前很多人用 codis 之类的客户端来支持集群 , 但是起码你得研究一下 redis cluster 吧 。
    如果你的数据量很少 , 主要是承载高并发高性能的场景 , 比如你的缓存一般就几个 G , 单机就足够了 , 可以使用 replication , 一个 master 多个 slaves , 要几个 slave 跟你要求的读吞吐量有关 , 然后自己搭建一个 sentinel 集群去保证 redis 主从架构的高可用性 。
    redis cluster , 主要是针对海量数据+高并发+高可用的场景 。 redis cluster支撑N个 redis master node , 每个master node都可以挂载多个slave node 。 这样整个redis就可以横向扩容了 。 如果你要支撑更大数据量的缓存 , 那就横向扩容更多的master节点 , 每个master节点就能存放更多的数据了 。


    推荐阅读