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:移除有过更早过期时间的键