Redis面试 - redis问题总结

Redis 面试会有哪些问题呢?或者学完整个体系,如何去用问题测试自己的理解呢? @pdai

常规问题

  • 什么是redis,为什么要使用它
  • redis一般有哪些使用场景
  • redis为什么快

数据类型和数据结构

  • redis有哪些数据类型
  • redis数据类型有哪些命令
  • 谈谈redis的对象机制(redisObject)
  • redis数据类型有哪些底层数据结构
  • 为什么要设计sds?
  • 一个字符串类型的值能存储最大容量是多少?512M
  • 为什么会设计Stream
  • Stream用在什么样场景
  • 消息ID的设计是否考虑了时间回拨的问题

持久化和内存

  • Redis 的持久化机制是什么?各自的优缺点?一般怎么用?
  • Redis 过期键的删除策略有哪些
  • Redis 内存淘汰算法有哪些
  • Redis的内存用完了会发生什么? 如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。
  • Redis如何做内存优化?
  • Redis key 的过期时间和永久有效分别怎么设置?

EXPIRE 和 PERSIST 命令

  • Redis 中的管道有什么用?

一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。

这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多 POP3 协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。

事务

  • 什么是redis事务
  • Redis事务相关命令
  • Redis事务的三个阶段
  • watch是如何监视实现的呢
  • 为什么 Redis 不支持回滚
  • redis 对 ACID的支持性理解
  • Redis事务其他实现

基于Lua脚本,Redis可以保证脚本内的命令一次性、按顺序地执行,其同时也不提供事务运行错误的回滚,执行过程中如果部分命令运行错误,剩下的命令还是会继续运行完

基于中间标记变量,通过另外的标记变量来标识事务是否执行完成,读取数据时先读取该标记变量判断是否事务执行完成。但这样会需要额外写代码实现,比较繁琐

集群

主从复制

  • Redis集群的主从复制模型是怎样的?
  • 全量复制的三个阶段?
  • 为什么会设计增量复制?
  • 增量复制的流程? 如果在网络断开期间,repl_backlog_size环形缓冲区写满之后,从库是会丢失掉那部分被覆盖掉的数据,还是直接进行全量复制呢?
  • 为什么不持久化的主服务器自动重启非常危险呢?
  • 为什么主从全量复制使用RDB而不使用AOF?
  • 为什么还有无磁盘复制模式?
  • 为什么还会有从库的从库的设计?

哨兵机制

  • Redis哨兵机制?哨兵实现了什么功能呢
  • 哨兵集群是通过什么方式组建的?
  • 哨兵是如何监控Redis集群的?
  • 哨兵如何判断主库已经下线了呢?
  • 哨兵的选举机制是什么样的?
  • Redis 1主4从,5个哨兵,哨兵配置quorum为2,如果3个哨兵故障,当主库宕机时,哨兵能否判断主库“客观下线”?能否自动切换?
  • 主库判定客观下线了,那么如何从剩余的从库中选择一个新的主库呢?
  • 新的主库选择出来后,如何进行故障的转移?

Redis集群

  • 说说Redis哈希槽的概念?为什么是16384个?

  • Redis集群会有写操作丢失吗?为什么?

Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。

应用场景

  • redis 客户端有哪些

Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

Redisson是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。

  • Redis如何做大量数据插入? Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作。

  • redis实现分布式锁实现? 什么是 RedLock?

  • redis缓存有哪些问题,如何解决

  • redis和其它数据库一致性问题如何解决

  • redis性能问题有哪些,如何分析定位解决

新版本

  • Redis单线程模型? 在6.0之前如何提高多核CPU的利用率?

可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的, 所以,如果你想使用多个CPU,你可以考虑一下分片(shard)。

  • 6.0版本中多线程