面试点总结
主从关系的集群有哪些?
-
主从的特点就是数据可靠,低可用;
-
常见的zookeeper、redis的哨兵、主从复制;
-
只有一个写入点,所以数据可靠,不会数据覆盖;
-
即使加上哨兵,又有故障转移的时间,但是还是低可用;因为要主从同步,数据复制;
去中心化集群部署有哪些?
-
特点是数据不可靠,高可用;
-
有erueka和redis cluster,
-
因为有多个写入点,所以数据不可靠;因为去中心化所以高可用;
-
是一种局部的主从,正常主节点工作,主节点挂掉,从节点升级为局部主节点,继续完成集群事务;
-
Erueka的集群方式实际上是去中心化的方式;和redis一样,但是redis并不是传统的每个redis进行数据的同步,而是将16000个插槽分配到每一个redis,所以说并不是数据一致,而是算法一致,每个请求不管访问哪一个节点,都可以通过key找到他的value在哪个位置;
为什么Redis单线程还可以高性能
-
非阻塞的IO多路复用模型:

多路复用程序只负责监听连接,然后压到队列,不负责具体的处理,一个程序可以处理成百上千其请求; 所以称为非阻塞, 如果是阻塞的,那么监听程序会自己去处理每一个请求,没有完成前,其他请求等待;
-
问题来了,具体的事件处理器, 也是单线程的,他怎么有那么快可以一直处理呢?
- 因为是基于纯内存的操作, 效率性能非常高, 处理一个请求时间非常少, 即便队列塞得很快,这里处理也非常快;1s几万请求;
- 还避免了多线程频繁上下文切换的消耗问题;
redis数据结构及使用场景了解多少?
ps: 一定要结合业务场景说, 每个数据结构都有什么用;
- String:
- 就是普通的kv缓存,没什么好说的;
- hash:
- value类似于map的结构,主要用来存对象, 我们操作时,可以仅仅只操作value当中的一个值,其他不变;
- list:
- value是有序的列表; 有很棒的 命令lrange:可以从哪个元素开始查多少个;实现分页查;
- 比如某个微博下面的有很多粉丝,那么就可以将这些粉丝存到list,
- set:
- 无序,自动去重;
- 比如需要对数据进行实现快速去重, 当然java程序中可以使用hashset去重,但是如果数据存在多台机器的话,可以实现全局去重;
- 还可以做一些交集操作(百度),比如比较两个微博账号的共同好友有谁;
- sortset:
- 去重, 按分数排序;
- 最常见的最排行榜; 有重要的命令: 获取排名前几的用户(百度):
redis的过期策略,数据淘汰策略了解吗?手写LRU?
ps: 说到redis过期一定讲删除策略, 内存淘汰机制;最常用的lru;
-
我们存数据的时候可以设置过期时间;但是并不是时间一到直接删除:
-
采用定期删除和惰性删除结合;
-
定期: redis会默认每隔一段时间去检测一些过期的key去删掉;
-
惰性: 如果有些没被检测到,下次查这个过期的key时,会被删掉,返回null;
-
最后一定会保证删掉的,之所以会两种结合用, 而不用定时删除就是防止比如10万条数据,设置集中过期,那么redis得开销全花在删除上了;
-
比如有些场景,设置了过期时间,但是内存占用还很多,就是因为redis的删除机制,并不是到期准时全部删除;
-
-
但是. 如果数据大量堆积, 又必须请求一次才能删除, 导致内存一致占用怎么办?
-
走内存淘汰机制:
- allkeys-lru: 就是当内存不够用,就删除一些你最近最少未使用(不管设没设置过期);
- volatile-lru: 区别就是,只去删设置了过期时间的不常使用的key;(不怎么用,不适合);
- volatile-random: 内存不足时,在设置过期的key中随机删除一些;
- volatie-ttl: 内存不足,删除即将过期的key;
-
手写一个LUR:
-
操作系统原理的示例:
- 是假设内存是按照栈的方式来表示访问时间的;
-
基于hashmap和双向链表:
- 用hashmap存kv,能够保证时间复杂度为0(1);
- 用双向链表记录v的插入时间;新插入的放在头部;
- 链表长度表示内存大小,内存满了,就删除链表的尾部;
-
redis怎么保证高可用的?
ps: 集群相关的,主从复制原理,哨兵原理,cluster原理
redis挂掉数据能恢复吗?redis持久化讲讲:
ps: 持久化方式的比较, 最后是怎么用的, 两种方式的具体流程,会出现哪些问题;
雪崩和穿透怎么解决的:
- 雪崩是一个时间段内,缓存集体失效,但是全部压力落在数据库上;过期时间设置上作调整;
- 穿透:是指绕过redis,直接作用数据库,比如访问一个不存在的key;解决方案是,不存在、查出来为null,也存到redis中;
数据库缓存双写一致性:
先更新数据库,再删除缓存
redis并发竞争问题怎么解决:
ps:多个系统客户端连接redis更新key,导致顺序的问题;分布式锁解决;
- 用zookeeper做分布式锁来保证;确保同一时间只能有一个实例来操作key,其他不允许读写;
redis6为什么引入多线程:
而 Redis 引入多线程操作也是出于性能上的考虑,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率。
;
redis6为什么引入多线程:
而 Redis 引入多线程操作也是出于性能上的考虑,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率。
一句话讲完:之前用单线程是因为基于内存速度快,而且多路复用有多路复用的作用,也就是足够了,现在引入是因为在某些操作要优化,比如删除操作,因此引入了多线程。

本文总结了Redis的面试重点,包括主从集群、去中心化部署、单线程高性能原因、数据结构及其应用、过期策略与淘汰机制、高可用方案、持久化、雪崩和穿透的解决方案、数据库缓存一致性以及并发竞争问题的处理。详细解析了Redis的多种特性,帮助理解Redis的设计理念和实践技巧。
173万+

被折叠的 条评论
为什么被折叠?



