文章目录
- 一、Redis的持久化
- 1、RDB和AOF持久化的区别是什么?
- 2、RDB和AOF的优缺点?
- 二、Redis的数据分配算法
- 1、redis使用的是什么数据分配算法?
- 2、虚拟槽的优点有哪些?
- 三、Redis应用过程中出现的热门问题
- 1、什么是缓存穿透?怎么解决?
- 2、什么是布隆过滤器?
- 3、什么是缓存击穿?怎么解决?
- 4、什么是缓存雪崩?怎么解决?
- 四、其他面试问题
- 1、redis是单线程的,为什么还这么快?
- 2、什么是多路I/O复用模型?
一、Redis的持久化
redis是基于内存的,内存优点是快,缺点就是容易丢失,持久化方案:一种是RDB方式,一种是AOF的方式
1、RDB和AOF持久化的区别是什么?
RDB是一个
快照文件
,它是将redis内存存储的数据写到磁盘上,当redis宕机时,方便从RDB的快照文件中恢复数据。
AOF的含义是追加文件
,当redis操作写命令时,会将这个命令写入到AOF中,当redis宕机时,会从AOF中重新执行一遍命令恢复数据。
2、RDB和AOF的优缺点?
RDB是二进制文件,在保存时
体积较小,恢复速度也比较快,但有可能丢数据
,通常在项目中会使用AOF恢复数据,虽然AOF恢复数据速度慢一点,但是丢数据的风险要小很多
二、Redis的数据分配算法
1、redis使用的是什么数据分配算法?
redis使用的是
虚拟槽分区算法
,也叫哈希槽分区算法,redis集群中有 16384 个虚拟槽,每个key值通过CRC16校验后对16384去模来决定放在哪个槽中,集群的每个节点负责一部分的虚拟槽。
2、虚拟槽的优点有哪些?
虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有数据映射到一个固定范围的整数集合中,而且虚拟虚拟槽分区的
扩展性好,方便添加和移除节点
。
三、Redis应用过程中出现的热门问题
1、什么是缓存穿透?怎么解决?
缓存穿透是指查询一个不存在的数据,这会导致每一次的请求都会到数据库中查询,压力过大会使数据库挂掉。这种情况大概率是遭到攻击了。
解决方案
:一般会缓存空数据,或者使用布隆过滤器来解决
2、什么是布隆过滤器?
布隆过滤器主要用于
检索一个元素是否在一个集合中
它的底层其实就是一块内存区域
,本质就是一个数组,数组中只有0和1,进入的key值经过三次hash计算,模余数组长度得到数组的下标,并将其从0变为1,这样三个数组的位置就能确定一个key是否存在。
当然,布隆过滤器存在一定的误判
,一般将误判率设置为5%,这是可以接受的
3、什么是缓存击穿?怎么解决?
缓存击穿的意思是 对于热门的key值在正需要的时候,突然失效了,导致同一时间,大量请求直逼数据库,数据库可能会在瞬间崩溃。
解决方案
有三种:
1、预先设置热门数据
:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长.
2、实时调整
:现场监控哪些数据热门,实时调整key的过期时长
3、使用锁
: 就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db。
4、什么是缓存雪崩?怎么解决?
缓存雪崩的意思是 针对多个key值,在同一时间,集体失效了。导致数据库的压力瞬间增大,数据库可能会在瞬间崩溃。
解决方案
有三种:
1、redis中的key值,设置不同的过期时间
,假如是批量设置,可以编写一个随机函数,让其在1~5分钟过期即可。
2、添加多级缓存
:nginx缓存 + redis缓存 +其他缓存(ehcache等)
3、还可以使用锁或者队列的方式
。
四、其他面试问题
1、redis是单线程的,为什么还这么快?
有以下原因:
1、完全基于内存的,是C语言编写的
2、采用单线程,不必考虑多线程的安全问题
3、采用多路I/O复用模型,而非阻塞I/O
2、什么是多路I/O复用模型?
多路I/O复用是指利用单个线程来同时监听多个socket,并在某个socket可读、可写时得到通知,从而避免无效的等待,充分利用cpu资源