凉凉!面试阿里我被Redis技术专题给弄死了~
📚我本以为我可以像是别的博主一样去阿里面试随随便便,因为Redis,我直接被阿里大佬淦翻在地上
好了不装了 没过没关系 我总结了一些这些最难的知识点!!!!然后自己总结归类再去百度查询了一些 最终得出这份Redis技术专题
题目开淦
Redis集群的主从复制模型是怎样的?
为了是在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群是用了主从复制模型,每个节点都会有N-1个复制品
Redis集群会有写操作丢失吗?为什么?
Redis并不能保证数据强一致性,这意味着在实际中集群在特定的条件下可能会丢失写操作
Redis集群之间是如何复制的
异步复制
Redis如何做内存优化
尽可能使用散列表(hashes),散列表(是说列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面,比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户所有信息存储到一张散列表中
Redis回收进程如何工作?
一个Client运行了新的命令,添加了新的数据,Redis会检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收
Redis支持哪几种常用数据类型?
- String(字符串)
- List(列表)
- Set(集合)
- Sorted Set(有序集合)
- hash(哈希表)
Redis 与 memcached 相比有哪些优势?(主要是Redis的优势)
- 1.memcached所有的值均是简单的字符串,redis支持更为丰富的数据类型。
- 2.redis的速度比memcached快很多,redis的速度比memcached快很多(有争议,考虑到Memache多线程可以充分利用多核,在考虑6.0后的Redis支持多线程,所以存在版本的概念)。
- 3.redis可以持久化其数据redis可以持久化其数据,数据的可靠性和一致性更高。
- 4.redis单个key存储的value可以达到1G而Memcache只有1M存储大小。
- 5.redis对集群情况下的高可用支持的方案很多,所以集群情况下高可用更好。
- 6.针对于第一条的补充,包含功能场景的丰富化,比如,消息队列、原子操作处 理(Lua脚本以及自增自减的操作)、事务机制和延时队列机制等等功能。
- 7.采用的网络模型非常好(epoll机制)摈弃给纯内存考虑,并且采用了内部共享内存池机制(可以复用内存,惰性分配),采用单线程机制减少用户态和内核态的切换以及线程之间上下文的切换。
Redis 集群方案应该怎么做?都有哪些方案?
- codis目前用的最多的集群方案,属于一个基于服务端操作的负载均衡机制属于代理后端服务实例的机制,可以支持1024的集群节点,但它支持在节点数量改变情况下,旧节点数据可恢复到新hash(CRC32算法)节点。//加入Java开发交流君样:756584822一起吹水聊天
- twemproxy ,基本和codis一致的效果,但是对于节点变化的情况处理不是很好,所以性能方面来讲依赖于twemproxy的节点的吞吐能力。
- redis cluster3.0 自带的集群,特点在于他的分布式算法不是一致性hash,而是 hash槽(slot)的概念,以及自身支持节点设置从节点,并且节点之间都有引用链接关系帮助定位hash槽的数据,支持节点达到16384个节点。
(Redis)什么是缓存击穿?如何避免?
高并发的系统中,大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿。
📚如何避免?
- 1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。
- 2:做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置为短期,A2 设置为长期,牺牲一致性,提高可用性
- 3:设置热点数据永远不过期(不推荐哦)。
Redis如何实现高可用呢?
Redis实现高可用主要有三种方式:主从复制、哨兵模式,以及 Redis 集群。
📚主从复制
将从前的一台 Redis 服务器,同步数据到多台从 Redis 服务器上,即一主多从的模式,这个跟MySQL主从复制的原理一样。
📚主从复制哨兵模式
使用 Redis 主从服务的时候,会有一个问题,就是当 Redis 的主从服务器出现故障宕机时,需要手动进行恢复,为了解决这个问题,Redis 增加了哨兵模式(因为哨兵模式做到了可以监控主从服务器,并且提供自动容灾恢复的功能)。
📚Redis Cluster(集群)
Redis Cluster 是一种分布式去中心化的运行模式,是在 Redis 3.0 版本中推出的 Redis 集群方案,它将数据分布在不同的服务器上,以此来降低系统对单主节点的依赖,从而提高 Redis 服务的读写性能。
使用哨兵模式在数据上有副本数据做保证,在可用性上又有哨兵监控,一旦master宕机会选举slave节点为master节点,这种已经满足了我们的生产环境需要,那为什么还需要使用集群模式呢?
哨兵模式归根节点还是主从模式,在主从模式下我们可以通过增加slave节点来扩展读并发能力,但是没办法扩展写能力和存储能力,存储能力只能是master节点能够承载的上限。所以为了扩展写能力和存储能力,我们就需要引入集群模式。
Redis为何那么快???
Redis的快速很多人都知道是因为基于内存,但这只是一方面,其实redis在底层是一套很完善的多路复用事件处理机制来保证执行的高效的
线程模型
redis内部使用文件事件处理器file event handler,它包含如下几个部分
- 多个socket
- IO多路复用程序
- 文件事件分派器
- 事件处理器(连接应答处理器,命令请求处理器,命令回复处理器)
之所以说redis是单线程其实是指这个文件事件处理器是单线程的,它采用多路复用的方式监听系统上多个socket,将socket上产生的事件压入队列中,由文件事件分派器从队列中取出一个socket根据事件类型发给相应的事件处理器
整个处理过程如图:
处理过程可以分为以下几个步骤:
- 客户端向redis发起一个socket请求,向redis的server socket请求连接,这里命名为socket01
- server socket产生一个AE_READABLE事件,IO多路复用程序监听到事件后将这个socket01压入队列
- 文件事件分派器从队列中取出socket01,交给连接应答处理器
- 连接应答处理器会将socket01的AE_READABLE事件与命令请求处理器相关联
- 假设客户端执行set操作,这时命令请求处理器会从socket01读取key value,在内存中完成key value的设置
- 在内存中完成设置后,会将socket01的AE_WRITEABLE事件与命令回复处理器相关联,然后压入队列中
- 事件分派器拿到socket01后,交给命令回复处理器,由命令回复处理器向socket01写入本次操作的结果,比如OK,之后解除关联
以上就是一个命令在redis中执行的过程
总结一下效率高的原因
- 内存操作
- IO多路复用机制,减少了阻塞
- 单线程避免了线程切换的开销和竞争问题
- 最最根本的redis是用C语言写的,本来就直接跟操作系统交互,命令执行快得飞起