redis八股--1
什么是redis
redis是一种基于键值对的NoSQL存储数据库
value支持hash,string,list,set,zset,bitmaps等等多种数据结构
redis的作用
1.缓存:这是redis应用最广泛的地方,基本所有的web应用都会使用redis作为缓存来降低数据压力
2.计数器:天然支持计数功能
3.排行榜:提供了列表和有序集合数据结构
4.消息队列;redis提供了发布订阅和阻塞队列的功能
5.分布式锁:redis实现了分布式锁机制
redis为什么快
1. 完全基于内存操作
2. 使用单线程,避免线程切换和竞态消耗
3. 基于非阻塞IO的多路复用
IO多路复用:
形象上来讲,就是你在讲台上讲,谁解答完谁举手,如果此时A,B举手,那么你就下去检查AB的答案,然后继续回到讲台上讲
Linux系统存在三种方式实现IO多路复用:select,poll,epoll
select:服务员每隔1分钟就跑到每个餐桌前问一遍且最多只能服务1024桌
poll:服务员依然挨桌询问需求,可以服务超过1024桌
epoll:客人桌上有个服务按钮,当需要服务时主动亮灯,服务员只需要查看亮灯的桌子
- 时间复杂度O(1):只处理有需求的桌子
- 没有连接数限制
- 内存映射减少数据拷贝
epoll工作模式分为两种:水平触发和边缘触发
-
水平触发(LT):只要状态满足就持续通知
就像服务员看到亮灯后,如果不处理,灯会一直亮着 -
边缘触发(ET):仅在状态变化时通知一次
类似按钮按下后自动熄灭,需要一次性处理完所有需求
例如epoll方式就是用户socket对应的fd注册进epoll,然后让epoll检测是否socket上有消息到达
这样,整个进程只有再进行select,poll,epoll调用的时候才会被阻塞
redis6.0使用多线程是怎么回事
其多线程是使用多线程来处理数据读写和协议解析的,但是redis执行命令依旧是单线程
因为CPU成为redis瓶颈的情况很少,所以使用单线程
redis持久化的方案有哪些,有什么区别
这里先介绍一下什么叫做redis持久化
Redis是内存数据库,所有数据存储在内存中。就像把重要笔记写在沙滩上,一旦服务器断电或重启(海浪冲上岸),所有数据都会消失。持久化就是把数据「刻在石头上」的过程,将内存数据保存到磁盘。
redis持久化分为两种:RDB和AOF
RDB:把当前数据生成快照保存到硬盘的过程,RDB是一个压缩二进制文件,通过其可以还原某个时刻数据库的状态,保存在硬盘上
手动触发:save(阻塞redis服务器),bgsave(fork子进程进行操作)
自动触发:save m n m秒进行n次修改
RDB无法做到实时持久化,所以提出了AOF,但是AOF相较于RDB文件大,恢复慢,启动效率低
AOF:以独立日志的方式记录每个写命令,重启的时候重新执行AOF文件中的命令达到恢复数据的目的,是目前redis持久化主要方式
所有写入命令会追加到缓冲区,AOF缓冲区根据对应的策略向磁盘进行同步操作,随着AOF越来越大,需要定期对AOF进行重写达到压缩的目的
建议同时使用,redis重启的时候优先载入AOF数据进行原始数据恢复。
note:
redis在AOF持久化开启且存在AOF文件的时候,会优先加载AOF文件
AOF关闭或者AOF文件不存在的时候,加载RDB文件
redis混合持久化了解吗?
将rdb文件的内容和增量的AOF日志文件存在一起,这里的AOF不再是全量的日志,而是自持久化开始到持久化结束这段时间发生的增量AOF日志
redis主从复制了解吗?
这个不仅redis存在,mysql也存在
主从复制就是,将一台redis服务器的数据复制到其它的redis服务器,前者称为主节点,后者称为从节点,redis主从复制支持主从同步和从从同步两种
实现了数据的热备份,当主节点发生故障,可继续由从节点来提供服务
redis常用的复制拓扑结构包括:一主一从结构,一主多从结构,多主多从结构
主从复制的流程是什么样子的呢
1. 保存主节点信息,保存主节点ip和port
2. 随后主从建立连接
3. 同步数据集
4. 持续把写命令发送到从节点
说说主从数据同步的方式
包括全量复制和部分复制
全量复制:将主节点全部数据一次性发送给从节点
部分复制:由于网络问题使得主从之间连接断开,当重新连接的时候,从节点发送偏移量和主节点运行ID要求进行部分复制操作,如果参数runid和当前一致,说明复制的是当前主节点,然后在自身积压缓冲区查找,如果存在于缓冲区中,那么就可以进行部分复制
主从复制存在一个问题,就是故障后无法实现自动故障转移,那么我们就需要一个方案来完成自动故障转移,那就是哨兵
哨兵由两部分组成,那就是哨兵结点和数据结点
哨兵结点就是特殊的redis结点,不存储数据,对数据结点进行监控,数据结点,就是主从结点
功能:
监控:不但检查主节点和从结点是否运作正常
自动故障转移:会从失效主结点的其中一个从结点升级位新的主结点,并让其他从节点改为复制新的主节点
实现原理:
1. 定时监控
每隔10秒,每隔sentinel节点会向主节点和从节点发送命令来获取最新的拓扑结构
每隔2秒,向数据节点的哨兵节点发送对于主节点的判断以及当前哨兵节点的信息
每隔1秒,心跳机制:ping操作,哨兵节点向主节点,从节点,其余哨兵节点发送ping命令来检测这些节点是否可达
2.主观下线和客观下线
主观下线是哨兵节点认为某个节点存在问题
客观下线时超过一定数量的哨兵节点认为主节点存在问题
领导者哨兵选举:选出一个哨兵节点进行故障转移的操作,使用Raft算法
Raft算法:
·1.每个在线的哨兵节点都可以参与选举,当其确定主节点主观下线的时候,就会询问其它哨兵节点要求设置自己为领导者
2.收到请求的哨兵节点,如果没有推举其它人,那就同意推举
3.当哨兵节点发现自己的票数大于max的时候,那他就成为领导者
4.如果没有,那就进行下一次选举
新的主节点挑选
先进行过滤:过滤掉不健康的节点
选择从节点优先级最高的节点
如果没有的话选择偏移量最大的从节点(复制最完整)