1、Redis为什么这么快?
https://juejin.cn/post/6978280894704386079
基于内存实现省去了磁盘IO的消耗
底层实现了高效的数据结构
合理的数据编码
合理的线程模型
单线程(避免了上下文切换和竞争锁的切换):是指Redis网络IO和键值对读写是由一个线程来完成的,其他诸如持久化、异步删除、集群数据同步由额外的线程执行
I/O多路复用
I/O:网络IO
多路:多个网络连接
复用:复用同于一个线程
是一种同步的IO模型,实现一个线程可以监视多个文件句柄
虚拟内存机制
2、Redis的数据类型有哪些,底层怎么实现?
- 字符串:整数值、embstr编码的简单动态字符串、简单动态字符串(SDS)
- 列表:压缩列表、双端队列
- 哈希:压缩列表、字典
- 集合:整数集合、字典
- 有序集和:压缩列表、跳跃表、字典
3、Redis是单线程的,但是为什么这么高效呢?
虽然Redis文件事件处理器以单线程方式运行,但是通过使用I/O多路复用程序来监听多个套接字
文件事件处理器既实现了高性能的网络通信模型,又可以很好地与Redis服务器中其他同样以单线程运行的模块进行对接,这保持了Redis内部单线程设计的简单性
4、如何保证Redis的高可用
单点故障:
实际生产中,如果 redis 只部署一个节点,当机器故障时,整改服务都不能提供服务了
部署了多台,一台故障时,整个系统依然对外提供服务,这样就提高了服务的可用性
redis 高可用的三种模式:主从模式、哨兵模式、集群模式
(1)主从模式
优点:
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
- 为了分载 Master 的读操作压力,Slave 服务器可以为客户端提供只读操作的服务,写服务依然必须由 Master 来完成
- Slave 同样可以接受其他 Slaves 的连接和同步请求,这样可以有效地分载 Master 的同步压力
- Master 是以非阻塞的方式为 Slaves 提供服务。所以在 Master-Slave 同步期间,客户端仍然可以提交查询或修改请求
- Slave 同样是以阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis 则返回同步之前的数据
缺点:
- Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的 IP 才能恢复
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,降低了系统的可用性
- 如果多个 Slave 断线了,需要重启的时候,尽量不要在同一时间段进行重启。因为只要 Slave 启动,就会发送 sync 请求和主机全量同步,当多个 Slave 重启的时候,可能会导致 Master IO 剧增从而宕机
- Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂
- Redis 的主节点和从节点中的数据是一样的,降低的内存的可用性