首页 Redis📦
文章
取消

Redis📦

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

本文由作者按照 CC BY 4.0 进行授权