Redis的篇幅会比较小一些,面试中更多的是在实战中怎么灵活地使用去解决现实问题。

Redis

常用的数据结构

Redis 有5种基础数据结构,分别为 string、list、hash、set、zset。

string 的扩容和 go 的切片扩容很相似,当字符串长度小于1M 时,扩容都是加倍现有的空间,如果超过1M,每次扩容会扩容1M,最大长度为512M。

list 可以用来做简单的队列使用,如果你对数据丢失容忍度比较高的话。

如果你的 Redis 集群是分片的,那么一定小心不要让你的 map 太大,容易造成负载不均衡。

zset 底层使用的一个 hash 再加一个跳表来实现的。

跳表时怎么实现的,Redis 又做了什么优化

跳表中是分层的,每个元素在被加入进去的时候,都会使用一个随机算法给它分配一个合理的层数,然后再将这个节点同搜索路径上的前后节点通过指针相关串起来。
更新的方式是先讲这个元素,再重新加入。
因为 Redis 的 Zset 是可以返回排名的,所以 Redis 在跳表的基础上,记录了从当前节点跳到下一节点中间节点的数量。

RDB AOF

RDB 和 AOF 是 Redis 实现持久化的两个方案

Redis 有两个指令可以生成 RDB 文件,一个是 SAVE 一个是 BGSAVE

  1. SAVE:redis在执行 SAVE 指令的时候,会阻塞住服务器进程,在 RDB 文件创建完成之前,不可以处理任何命令请求
  2. BGSAVE:redis 可以用这个命令派生出一个子进程,子进程来生成 RDB 文件,父进程继续处理命令,不会阻塞进程。运用 COW(写时复制)的原理进行快照的生成。

AOF 日志存储的是 Redis 服务器的会对内存进行修改的顺序指令记录。通过调用 fsync 保存进磁盘(很费时),所以一般生产环境会选择让操作系统决定何时同步磁盘。所以极端情况下是会丢数据的。

一般来说,现在会采用 RDB+AOF 的混合持久化。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

2020年年中面试-MySQL 下一篇

 目录