Redis常见面试题

前言说明

学习和整理 Redis 相关的知识当中,这里汇总了一下经常被问到的 Redis 面试题

Redis 的八股无外乎这三个:缓存穿透、缓存击穿、缓存雪崩。

分片集群问题

1.Redis的多数据机制了解多少

1.Redis支持多个数据库,单机模式下有从db0到db15, 数据库之间不能共享
2.分片集群中只有一个数据库空间,不会使用到Redis的多数据库

2.懂Redis的批量操作吗

1.有mget,mset,hmget,hmset,hgetall,hvals,
2.分片集群中, 不同的key会分到不同的slot中, 不能直接使用mget,mset
如何解决: 加上相同的前缀,用大括号{}包裹

3.Redis的集群机制中, 你觉得有什么不足的地方吗?

1.如果value是hash类型, 对象非常大, 即对应属性非常多, 也只能存入一个集群的节点中
2.批量操作也很麻烦, 属性太多写得很长

4.在Redis集群模式下, 如何进行批量操作?

1.如何执行的key数量很少, 串行get操作
2.如果一定要批量操作, 加上相同的前缀,前缀用{}包裹

4.5 什么是Redis的事务

1.Redis事务是一些命令的集合, 执行的时候是串行执行
2.分片集群中,不同的key可能会被分到不同的slot中, Redis的事务不生效
3.Redis的事务不支持回滚操作, 基本用不上.

其它问题

5.什么是缓存穿透,如何解决

现象:
客户端高并发不断向Redis请求一个不存在的Key,MySQL中也没有
由于Redis没有,导致这个并发全部落在MySQL上

解决
1.对于那些每秒访问频次过高的IP进行限制,拒绝访问
2.如果第一次redis中没有,读MYSQL,MySQL也没有,在Redis中设置一个==临时==默认值
3.利用BitMap类型构建布隆过滤器**(只保证MySQL数据库没有这个数据, 不保证一定有)**

6.什么是缓存击穿,如何解决

现象:
有一个Key,经常需要高并发的访问,这个Key有过期时间的,一旦达到过期时间==,这个Key被删除,所有高并发落到了MySQL中,被击穿了

解决
1.资源充足的情况下,设置永不过期
2.对这个Key做一个互斥锁,只允许一个请求去读取,其他的所有请求先阻塞掉
	第一个请求redis中没有读取到,读了MySQL,再将这个数据放到Redis中
	释放所有阻塞的请求

7.什么是缓存雪崩 ,如何解决

现象:
大量的Key在同一个时间段过期,大量的Key的请求在Redis中都没有,都去请求MySQL,导致MySQL奔溃

解决
1.资源充足允许的情况下,设置大部分的Key不过期
2.给所有Key设置过期时间时加上随机值,让Key不再同一时间过期

8.Redis中的Key如何设计?

1.使用统一的命名规范
2.一般使用业务名(或数据库名)为前缀,用冒号分隔,例如,业务名:表名:id。
例如:shop:usr:msg_code(电商:用户:验证码)
4.控制key名称的长度,不要使用过长的key
5.在保证语义清晰的情况下,尽量减少Key的长度。有些常用单词可使用缩写,例如,user缩写为u,messages缩写为msg
6.名称中不要包含特殊字符、包含空格、单双引号以及其他转义字符

9.为什么Redis是单线程的?

1.因为Redis是基于内存的操作,CPU不是Redis的瓶颈
2.Redis的瓶颈最有可能是机器内存的大小或者网络带宽
3.单线程容易实现,而且CPU不会成为瓶颈,所以没必要使用多线程增加复杂度
4.可以使用多Redis压榨CPU,提高性能

10.为什么Redis的性能很高?

1.基于内存操作, 快
2.用C语言编写, 数据结构简单, 对数据操作也简单
3.采用单线程, 避免不必要的线程切换和资源抢占
4.IO多路复用模型, 非阻塞IO

Redis常见面试题
https://jface001.github.io/2021/01/07/Redis常见面试题/
作者
惊羽
发布于
2021年1月7日
许可协议