前言
本篇是整理自己遇到或看到关于redis相关的面试题,答案仅供参考。
`提示:写博客是自己对知识梳理,目前是写给自己看,算是自己学习后的作业,也是为了养成一个良好的习惯。
一、基础篇redis 为什么那么快? 1. Redis是单线程模型,没有上下文切换的开销; 2. 简单的数据类型,时间复杂度都是O(1); 3. 数据都在内存中,计算快; 4. 采用了多路复用机制使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。 为什么说redis是单线程? Redis是单线程主要是指 Redis的网络IO和键值对读写是由一个线程来完成的, 这也是Redis对外提供键值存储服务的主要流程。 既然redis是单线程为什么redis 6.0要改成多线程? 这个官网有原话,大概就是因为redis所有的操作都在内存中,则CPU不是redis瓶颈,随着 科技发展内存也不再那么昂贵,那么redis主要性能问题就是在单线程的IO同步阻塞问题,则在6.0时 对于持久化、异步删除、集群数据同步等同步阻塞功能支持了多线程处理,解决同步阻塞问题。 什么是IO多路复用?redis是那种reactor的模式? IO多路复用就是通过一种机制,一个线程可以监听多个描述符(socket), 一旦某个描述符就绪,就通知程序(handler)进行相应的读写操作。 redis是单线程的reactor的设计模式,具体请看下图:二、缓存问题篇 1.经典缓存问题
缓存穿透问题 场景:缓存中没有数据,DB中也没有数据,请求直接打在DB上。 方案:布隆过滤器;加强接口的校验,过滤掉无效的请求; 闪电缓存,设置短时间的过期key,key为请求唯一标识,值为null。 缓存击穿问题 场景:一般是热key刚好过期时,同时有大量请求直接打在了DB上。 方案:热key数据不设置过期时间;在数据层做互斥锁。 缓存雪崩问题 场景:缓存大面积失效,导致大量的请求直接打在DB上; 方案:缓存集中过期:将过期时间用随机数打散;服务宕机:采用高可用集群模式;服务做熔断降级保护 缓存污染问题 场景:热key和其他key没有分开,在高并发时会存在新的缓存将热key缓存淘汰掉,从而导致的缓存污染 方案:热key分开存放,保证缓存不被污染;淘汰策略由LRU关注于访问时间改为LFU关注于访问频率。2.缓存一致性问题
缓存和DB一致性问题 场景:保证缓存和DB数据一致性问题 方案:最终一致性--延迟双删,保证最多在延迟时间内数据不一致,具体的看下图的分析; 强一致性--读写串行,这种虽然保证了强一致性但是违背了使用缓存的初衷,不推荐。 但是在实际开发中用得最多的还是懒加载模式。三、性能优化篇
关于性能优化的一些问题我的上一篇已经有详细从 网络IO、内存利用率、单线程的同步阻塞等 多个维度思考、分析并给出了相关的方案,具体请参考我之前写 redis优化的思考。 相关问题有以下: 1. redis性能瓶颈在那?如何优化? 2. bigkey问题,如何探测bigkey,有哪些方案? 3. redis如何节约内存? 可以看一下以后这张图加强你对redis相关问题的思维导向。
redis优化的思考
四、集群篇谈谈常见redis集群有哪些?各自解决问题? 主从模式,关注于数据备份容灾问题,保证数据的高可靠,异常时需要人工接入; 哨兵模式,关注的是服务的高可用,即异常时自动切换主从; 切片模式(cluster),关注的是高性能,数据分片存储,支持横向扩展。 redis Cluster集群中,突然宕机了一台会发生什么? 1. 如果半数以上 Master 处于关闭状态那么整个集群处于不可用状态。 2. 关闭任意一对主从节点会导致部分(大约为整个集群的1/3)失败。 3. 关闭任意一主,会导致部分写操作失败,是由于从节点不能执行写操作, 在Slave升级为Master期间会有少量的失败。 4. 关闭从节点对于整个集群没有影响。总结
本来只是想写一下常见面试题,但是写着写着之前列举的大纲就变了,这个就不定期的更新补充吧,如果发现以上内容有问题请告知我,谢谢!



