Redis面试
# 基础
# 什么是 Redis?使用 Redis 的好处?
# Redis 相比 Memchached 的区别、优势
# 线程模型
# Redis 是单进程单线程的吗?为何还那么快那么高效
无论什么版本,工作线程只有一个!
6.x 高版本出现了 IO 多线程
单线程,保证 Redis 命令的原子操作。加入 IO 多线程后,并行执行输入输出,提高执行速度,更好利用多核优势
- 学习系统IO课,epoll操作,内核缓存、内核缓冲区
- mmap
# Redis 多线程是什么多线程?默认开启吗?你们生产中用了吗?
# 数据类型、数据结构、场景
# 你的项目中 Redis 的应用场景
- 从5 种基础数据类型说
- 基本上就是用于缓存,一般不会用于数据库!
- 使用 Redis 为的是解决 HTTP 的无状态(Token等);服务后台服务的无状态;
- 项目中的哪些数据结构
- 单机锁;多机分布式锁;无锁!
# Redis 的 5 种基础数据类型和 6 个数据结构
# BitMap、HyperLogLog、GEO、Stream 有接触过吗?什么时候用这些特殊数据结构?
# 跳表又是什么,画一下?为什么使用跳表?为什么不用红黑树?全局 Hash 表又是什么?如何扩容的?什么是渐进式 rehash?Redis 怎么做到的?IO 多路复用是什么?多路是什么?复用了什么?
# 一个 String 类型的值能存储最大容量是多少
"数据最大存储量512MB,也不可能存储这么大的值!"
# 自定义过 Redis 数据类型吗?自定义过 Redis 命令吗?
# "🔥【场景】分布式数据库主键 ID"(计数器)—string
# "🔥【场景】密码错误限制"—string
# "🔥【场景】实现用户登录会话"—hash
# "🔥【场景】电商网站购物车设计与实现"—hash
# "🔥【场景】限量抢购"—hash
# "🔥【场景】朋友圈点赞顺序列表"—list
# "🔥【场景】微博关注列表"—list
# "🔥【场景】最新的新闻或资讯"—list
# "🔥【场景】唯一计数器—网站访问量去重"—set(PV、UV、IP)
# "🔥【场景】网站黑、白名单"—set
# "🔥【场景】投票—点赞的多元化"—set
# "🔥【场景】社交关系"—set
# "🔥【场景】共同好友、关联搜索"
# "🔥【场景】排行榜"—zset
# "🔥【场景】时间线排序"—zset
# 持久化
# Redis 的持久化机制?各自优缺点?你们是怎么选的?
- RDB,快照
- AOF,每秒刷盘一次命令。aof日志可以得到所有命令,文件体积变大,需要 aof 重写当前内存中指令!4.x 新版本重写直接把 RDB 放到 AOF 文件,后续命令以 aof 命令追加
- 主从同步也算持久化
原理:
- fork + copyonwrit
# AOF 什么时候重写?为什么重写?
# 为什么 Redis 没有实现 WAL 机制?
# 集群
# Redis 主从是什么?主从从又是什么?
# 为什么主从从可以减少主库压力?从库可以设置可写吗?从库可写会带来什么问题?
# 🔥 主从什么时候会导致数据丢失?主从不一致?
Redis 默认是弱一致性,异步的同步
锁不能用主从结构,可以采用 单实例、分片集群、redlock。逻辑上使用 redisson 即可!
配置中提供了必须有多少个 client 连接才能同步,可以配置同步因子,趋向于强一致性
wait 2 0 小心
最后2点有点违背 redis 的初衷
# 主从复制用到了哪种日志?
# 主从复制过程说下。主从复制什么时候增量,什么时候全量?
# 主从复制第一次连接时,网络中断了怎么办?
# Redis 十万并发能支撑住吗?如何支撑十万以上并发?为什么操作大对象支持不了十万并发?
# 你说虚拟节点,说下如何实现?
# Codis 了解吗?
# 你们的 Redis 集群方案是什么?
# Redis 是如何保证高可用的?哨兵机制了解吗?
# 什么是主观下线什么是客观下线?选主的四个筛选条件优先级的条件依次递减分别是什么?打分又是什么?如何打分?
# 数据倾斜知道吗,如何解决?
# 分布式锁了解过吗?讲讲分布式锁实现原理?
# 分布式锁需要注意哪四个问题?
# Redisson 源码看过吗?它是如何实现的分布式锁?
# Lua 脚本保证原子性吗?
# 🔥 Redis 事务说下?事务 vs pipleline
Redis 单指令操作是原子的
pipleline 是一个客户端的指令集合(上车后统一发车)。节省网络开销!
Redis 事务执行时期是原子的,失败的就是失败,其他继续执行,没有回滚,需要手动设置!和 MySQL 完全不一样
在 6.0 后,由于 IO 多线程,所以发送到 Redis 服务器的命令可能是穿插的,但是!执行的时候,是根据 Redis 客户端来区分,来执行原子事务!
所以,尽量不要使用 Redis 的事务
# 其他
# 🔥 缓存雪崩、缓存击穿、缓存穿透说下?如何解决?
- "缓存雪崩—大量key"
- "缓存击穿—单个key"
- "缓存穿透—没有的key—网警"
以上问题,核心就是避免对 DB 的无效、重复请求
# 🔥 布隆过滤器又是什么?能手写个布隆过滤器吗 ?布谷鸟过滤器?
# 🔥 缓存预热?
"缓存预热"
如果是新的系统,总有无法预料的热点数据,所以必定会发生 缓存雪崩、缓存击穿、缓存穿透问题
# 🔥 如何淘汰数据的?分别是哪八种策略?
- "🔥过期键删除策略"
- "🔥逐出策略"——也称作淘汰策略,内存空间不足时产生
# Redis 对 lru 做了什么改变吗?lfu 又是什么?Redis 做了什么优化?
# 缓存污染知道是什么吗?
# 🔥 如何解决数据库和缓存数据不一致问题?双写一致性问题?
分布式事务!慎重选择,意义不大,性能太差!除非读多写少时!
首先明确一个问题!但单机下也不一定完全保证一致性!计算机任何地方都有缓存!除非为了一致性牺牲性能!
如何解决呢?看如下案例:
- 先删除 Redis,后更新 DB。但是容易发生那3个缓存问题
- Redis 是缓存,更倾向于有时差,不应该太过于追求强一致性。还是要减少 DB 操作。
- 🔥【推荐】使用 canal,同步 mysql 的 binlog。canal 能模拟为假的 mysql
- 通过 MQ 来,每次只发送消息,具体后续操作根据业务来消费!CQRS!了解!
# Pika 知道吗?Tendis 和它的区别 ?
# 如何实现一个 Key 千万并发?(Zoom 面试题)
# Redis 6 还有什么新特性?
# 哈哈哈
# Redis 的同步机制
# Redis 常见性能问题和解决方案
# Redis 的过期删除策略(回收策略、淘汰策略)
# Pipline 有什么好处?为什么要用 Pipline?
# 是否使用过 Redis 集群?集群的原理?
# Redis 集群方案什么情况下会导致整个集群不可用?
# Redis 集群之间是如何复制的?
# Redis 的主从复制模型是怎样的?
# Redis 集群会有写操作丢失吗?为什么?
# Redis 哈希槽?
# Redis 如何设置密码及验证密码?
# Redis 支持的 Java 客户端哪些?官方推荐哪个?
# Jedis 与 Redisson 对比有什么优缺点?
上次更新: 2021/06/21, 15:45:42