Redis(原理、持久化和缓存淘汰机制等)
参考书籍📚:《Redis设计与实现》
一.Redis的原理
1.简述
·基于内存的K-V存储
 数据直接存储在内存 不需要去磁盘进行读取数据 减少磁盘IO 减少至少两次的用户态到内核态到切换 减少cpu的切换
·工作线程是单线程
 单线程的优势:1.减少线程切换 旧线程的现场的保存和新线程的创建(底层是用户态到内核态的转变)  2.减少锁的创建和消除 减少死锁的发生
·采用IO多路复用模型
 1.名次解释:  IO多路复用模型是使用单个线程去监控网络中多个请求 即:网络中来自多路的IO请求 复用一个线程处理 当请求的事件准备就绪了 就通知程序去执行  2.优势:  -单线程的优势(内核态切换、锁的开销、不需要redis使用额外的线程去处理请求节省了额系统的开销)  3.IO多路复用的实现  ·select():会把IO请求复制到内核中的一个数组中、然后🈚️差别的轮询这个数组、一旦感知到请求的事件准备就绪 那么通知程序去处理  缺点❌:1⃣️请求存在数组中 存在容量限制🚫.  2⃣️无差别的轮询每次都要从头到尾遍历数组 时间复杂度是O(N)  3⃣️请求信息在内核之间复制  4⃣️只能无差别的轮询这个数组 只知道发生了事情 但是具体什么事件不知道
 ·poll():会把IO请求 创建成一个pollfd复制到内核中的一个链表结点中、然后🈚️差别的轮询这个数组、一旦感知到请求的事件准备就绪 那么通知程 序去处理  缺点❌:1⃣️无差别的轮询每次都要从头到尾遍历数组 时间复杂度是O(N)  触发方式:水平触发:一旦感知到事件的发生 就启动程序去处理 此事水平触发就是 这次可以不处理 下一次仍然会通知
 ·epoll():会把IO请求注册到内核中的一颗红黑树上、表示感兴趣的事件、一旦感知到感兴趣的事件准备就绪 那么采用回调的方式去激活红黑树上的事 件 然后就通知对应的应用程序去处理  触发方式:边缘触发:一旦感知到事件的发生 就启动程序去处理 此事水平触发就是 这次必须处理 下一次不会通知  优势:只会去处理 那些活跃的事件 和 你总连接数无关 大大减少了重复触发的次数
·基于文件事件处理模型
 在IO多路模型的基础上 把IO请求有序 同步的放入一个队列中 然后把队列 中的数据按次序 发送到 文件事件分发器 再由这个分发器 分发到事件处理器中 是使用具体的处理器去处理
二.持久化
1.RDB
·概述:RDB全称RedisDataBase 使用子线程对redis数据库以二进制序列化全量的数据备份 Redis默认持久化方式
·优点:
 ·生成二进制文件 体积小 恢复快  ·容易把当前数据移植
·缺点:
 ·实时性不强  ·创建线程是重量级操作 开消耗大  ·数据完整性低:可能丢失数据
·分类:
 ·同步持久化:使用SAVA命令-创建进行数据备份 备份期间 redis服务器会阻塞 直到备份完毕  ·异步持久化:使用BGSAVA命令-创建一个子线程去进行数据备份 备份期间 redis服务器不会阻塞 只有创建线程的时候有阻塞 直到备份完毕
2.AOF
·概述:Append Only File 类似于MySQL的Binary日志 以独立日志的方式记录对redis的写操作 命令请求是先写到缓冲区 再写到AOF中 是增量备份 /追加备份下次启动时候 执行日志 进行恢复
·优点:
 ·数据实时性强  ·数据完整性强  ·数据实时性强
·缺点:
 ·写入时协议文本 体积大 恢复慢
三.缓存淘汰机制
1.概述
 当内存空间不足以存下redis的键值对的时候 需要使用到缓存的淘汰机制
2.方式 
 ·直接报异常  ·对所有的键:  -随机键淘汰  -LRU:最近最久未使用键淘汰  -LFU:最近最少未使用键淘汰
 ·对设置了过期时间的键:  -随机淘汰  -LRU:最近最久未使用淘汰  -LFU:最近最少未使用键淘汰  -TTL:移除有过更早过期时间的键
