redis设计与实现读书笔记(2)

news2024/9/21 12:48:29

今天看的是关于单机数据库,RDB持久化以及AOF持久化的内容。

关于单机数据库

1.默认数据库数量

redis的服务器默认是会创建16个数据库,每个客户端访问的时候都要指定自己的目标数据库。

select可以切换目标数据库。

注意事项

到目前为止,Redis仍然没有可以返回客户端目标数据库的命令。虽然redis-cli客户端会在输入符旁边提示当前所使用的目标数据库,但如果你在其他语言的客户端中执行Redis命令,并且该客户端没有像redis-cli那样一直显示目标数据库的号码,那么在数次切换数据库之后,你很可能会忘记自己当前正在使用的是哪个数据库。当出现这种情况时,为了避免对数据库进行误操作,在执行Redis命令特别是像FLUSHDB这样的危险命令之前,最好先执行一个SELECT命令,显式地切换到指定的数据库,然后才执行别的命令。

2.数据库键空间

数据库的键空间其实就是一个字典,redis对于键的操作,实际上都是通过对键空间字典的操作来实现的。

3.键的过期时间

redis中有一个expires字典保存了所有键的过期时间,这个字典叫过期字典。

 4.过期键删除策略

主要是要3种删除策略,分别是定时删除,惰性删除,定期删除。

定时删除:设置计时器,在键到期后,立刻删除,定时删除可以让键在过期的时候就立马被删除,不会继续留在数据库对于内存是很友好的,但是创建大量的计时器,和删除过期键的行为都会影响cpu的性能,特别是在有大量请求访问的情况下,更是会出问题。

惰性删除:过期键在被访问的时候才会被删除,它的好处是不会在删除其他无关的过期键上花费任何CPU 时间,坏处就是要是有过期键一直没有被访问,它就一直不会被删除,这样就会导致内存的严重浪费。

定期删除:每隔一段时间,检查过期键并且删除它。定期删除是上面两种策略的整合和折中:

但是定期删除的问题是需要设计好删除操作的时长和频率,不然就会退化成上面两种删除。

redis实际使用的删除策略

redis实际使用的删除策略是定期和惰性删除结合。

AOF,RDB和复制功能对于过期键的处理

RDB:

生成RDB文件的时候不会保存过期键,载入RDB的时候也不会载入过期键。只有在从服务器载入RDB的时候会载入过期键,但是在后面的主从同步的时候数据也会清除。

AOF

在进行AOF持久化的过程中,并不会对过期键不会有什么影响,只有当过期键被删除的时候,才会向AOF中加一条del命令,在AOF重写的时候,过期键不会保存进AOF中。

复制情况

在复制情况下,对于过期键的删除是由主服务器控制的,也就是说主服务器碰到过期键访问或者定期删除过期键的时候才会删除过期键,并且向所有从服务器发送一个del命令,从服务器只有收到主服务器发送过来的del命令才会删除键,从服务器过期键被访问不会进行删除过期键。

RDB持久化

1.RDB文件的创建

一般来说是有两个命令可以用作生成RDB文件,一个的SAVE,一个是BGSAVE.

两者的区别

SAVE命令会阻塞redis服务器进程;

BGSAVE命令会使用子进程用于生成RDB文件不会阻塞服务器进程,所以一般来说在服务器进行定期持久化的时候使用的一般都是BGSAVE命令。

2.RDB文件的载入

对于RDB文件来说载入工作一般是在服务器启动的时候自动执行,是由redis检测到RDB文件存在,就会自动载入RDB文件。值得一提的是,redis服务器如果开启了AOF持久化功能的话,一般来说是会优先使用AOF文件还原数据库,这是因为AOF的更新频率比RDB文件更新频率高。

BGSAVE和BGREWRITEAOF这两个命令不能同时进行。BGSAVE命令正在执行,BGREWRITEAOF会延迟到BGSAVE命令完成后进行,BGREWRITEAOF在执行的话,BGSAVE会被拒绝。

自动间隔性保存的条件,默认条件是60秒进行了1000次修改,300秒进行了10次修改,900秒内进行了一次修改。

服务器通过dirty计数器,记录着从上一次保存RDB文件后有多少次修改操作。lastsave记录着上次操作的时间。

AOF持久化

1.AOF持久化的实现

命令追加:在AOF持久化功能打开的情况下,服务器执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。

写入与同步

在服务器每一次结束一个事件循环之前,会考虑要不要进行把aof_buff缓冲区的内容写入与同步到AOF文件中。

3种策略

always:把aof_buff缓冲区全部写入和同步

everysec:把aof_buff缓冲区全部写入,如果距离上一次同步超过一分钟的话就进行同步

no:把aof_buff缓冲区全部写入,什么时候同步操作系统决定。

在上面这三种模式中,第一种只可能丢失一个事件循环数据,第二种会丢失一秒钟的数据,第3个会丢失上一次同步后的所有数据。

AOF载入

创建一个伪客户端向服务器发送AOF保存的各种命令,通过这些命令来重新还原服务器之前的数据。

2.AOF重写

因为在服务器一直运行的时候AOF文件会越来越大,存储了一些无用的命令,所以使用AOF重写命令来实现AOF文件体积的减少。重写的AOF文件只会有必要的能还原数据库数据的基本命令,也就是只有向数据库存储数据的命令。

AOF后台重写过程

服务器会开启一个子进程来进行AOF文件的重写,在子线程进行重写的时候还会有一个AOF重写缓冲区,在重写过程中,对于写命令会同时向重写缓冲区和AOF缓存区都追加命令,这样在重写过程中也可以保证AOF文件正常运行。当重写完成后把重写缓存区同步到重写的AOF文件中再把这个文件替换旧文件就完成了重写。

redis事件

redis主要需要处理的事件有两个,一个是文件事件,一个是时间事件。

文件事件

文件事件处理器使用I/O多路复用程序来同时监听多个套接字,根据当前套接字执行的任务来为套接字关联不同的事件处理器。

主要的任务有连接应答,读取,写入,关闭。

尽管多个文件事件可能会并发地出现,但IO多路复用程序总是会将所有产生事件的套接字都放到一个队列里面,然后通过这个队列,以有序,同步,每次一个套接字的方式向文件事件分派器传送套接字。当上一个套接字产生的事件被处理完毕之后,IO多路复用程序才会继续向文件事件分派器传送下一个套接字。

IO多路复用底层实现

有四个库,自动选择性能最高的I/O多路复用函数库来实现。

分别是select,epoll,evport,kqueue.

对于文件事件来说,主要是两种事件,读事件和写事件。

对于这两种事件的优先级来说,是读事件大于写事件。

对于redis的主要文件处理器

大体来说,就是上面这些处理器。

时间事件 

redis的时间事件有两类

定时事件:让一段程序在指定的时间之后执行一次。

周期性事件:让一段程序每隔指定时间就执行一次。

redis只使用了周期性事件。

服务器将所有时间事件都放在一个无序链表中,每当时间事件执行器运行时,它就遍历整个链表,查找所有已到达的时间事件,并调用相应的事件处理器。

无序链表并不影响时间事件处理器的性能

在目前版本中,正常模式下的Redis服务器只使用serverCron一个时间事件,而在benchmark模式下,服务器也只使用两个时间事件(也就是无序链表只有一到两个元素)。在这种情况下,服务器几乎是将无序链表退化成一个指针来使用,所以使用无序链表来保存时间事件,并不影响事件执行的性能。

时间事件的应用实例:serverCron

1.更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等。

2.清理数据库中的过期键值对。

3.关闭和清理连接失效的客户端口

4.尝试进行AOF 或 RDB持久化操作。

5.如果服务器是主服务器,那么对从服务器进行定期同步。

6.如果处于集群模式,对集群进行定期同步和连接测试。、

事件的调度与执行

时间事件和文件事件的处理流程。

等待文件事情,处理产生的文件事件,处理已经到达的时间事件。

具体规则:

1.aeApiPoll()函数的最大阻塞时间由到达时间最接近当前时间的时间事件决定,这个方法既可以避免服务器对时间事件进行频繁的轮询(忙等待),也可以确保aeApiPoll函数不会阻塞过长时间。

2.当文件事件处理完成后,没有到达的时间事件,会再次等待并处理文件事件。

3.事件处理是同步,有序,原子性的。

4.因为时间事件处理一般在文件事件后,所以一般时间事件处理时间比设定的时间晚一点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署YUM仓库

文章目录 1. YUM仓库服务1.1 YUM概述1.1 准备安装源 2.制作YUM源2.1制作ftp源2.2 国内在线yum源2.3 本地源与在线源同时使用 3.yum软件包的下载方式4.yum的常用操作命令 1. YUM仓库服务 1.1 YUM概述 yum是一个基于RPM包(是Red-Hat Package Manager红帽软件包管理器…

【Android入门到项目实战-- 6.1】—— 如何申请用户权限

目录 一、申请权限 1、布局文件 2、MainActivity类 3、AndroidManifest文件 你在使用安卓APP时可能经历过以下场景:使用APP的拍照功能时需要你授权使用相机。那么APP是如何完成申请权限功能的? 访问:https://developer.android.google.cn/…

ERTEC200P-2 PROFINET设备完全开发手册(9-2)

9.2 运行AC1/AC4参考代码 修改源代码usrapp_cfg.h的宏为 #define EXAMPL_DEV_CONFIG_VERSION 44 编译后下载到评估板运行AC4示例程序 在TIA中导入GSDML-V2.35-Siemens-ERTEC200pApp44-20210623.xml。新建项目,添加PLC和Devkit设备。 按照如下图所示配置模块&am…

2023零基础学软考网络工程师能过吗?

网络工程师是在计算机及其相关领域中拥有一定专业技能和知识的人员,可以为企业或个人设计、建设和维护计算机网络系统。网络工程师的职业前景非常广阔,尤其是随着信息化和互联网的迅速发展,网络工程师的需求也越来越大。软考是国家计算机技术…

Java多线程- synchronized关键字总结

目录 多线程锁的概要 Synchronized关键字 synchronized加锁过程 synchronized锁优化 锁消除 锁粗化 多线程锁的概要 首先对于锁的条件和要点进行一个总结: 锁使用来保护代码片段的, 以保证多线程的安全性, 一次只允许一个线程执行被保护的代码.锁可以管理视图进入被保护代…

malloc的一些知识

这是一个叫malloc的家伙,一直勤勤恳恳帮你为所欲为的玩转系统内存。可是长路漫漫,唯malloc作伴,我却不懂它。走近malloc,多了解一下总没错。 可能对我们来讲,malloc就是void* malloc (size_t len),调用就是…

AcWing算法提高课-2.1.2城堡问题

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 题目传送门点这里 题目描述 1 2 3 4 5 6 7 #############################1 # | # | # | | ######---#####---#---#####---#2 # # | # # # # ##---#…

微信小程序的【运行机制】解读

文章目录 导语1.微信小程序的运行流程1.1 微信小程序的启动模式1.2 前台与后台的概念1.3 挂起1.4 微信小程序的销毁 微信小程序冷启动的页面从新启动策略 3.微信小程序热启动页面4. 退出状态注意点补充总结 导语 前面我们有章节给大家讲到了&#xff0c;微信小程序的生命周期钩…

Socket网络编程练习(C#)

Socket编程&#xff1a;两个窗口通信 本文章代码来自b站视频&#xff1a;【.Net零基础入门 (老赵主讲)-哔哩哔哩】 https://b23.tv/YI5VWaj 原视频发布者为传智播客&#xff0c;本人根据自己的学习进度对代码做了少许优化 一、网络编程前置知识 1.1 什么是网络编程 网络编程…

【Leetcode每日一刷】动态规划:509. 斐波那契数、322. 零钱兑换、300. 最长递增子序列

博主简介&#xff1a;努力学习的22级计科生博主主页&#xff1a; 是瑶瑶子啦所属专栏: LeetCode每日一题–进击大厂 前言&#xff1a;动规五部曲 以下是《代码随想录》作者总结的动规五部曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式&#xff0…

什么是异步,同步,并行,串行,单工,半双工,全双工通信

目录 1 如何理解“BUS总线” 2 通信方式的分类 2.1 串行通信Serial communication 2.1.1 异步传输Asynchronous serial communication 2.1.2 同步传输Synchronous serial communication 2.1.3 单工通信Simplex communication 2.1.4 半双工通信Half-duplex communication…

Unity API详解——Matrix4x4类

在脚本中通常用Vector3、QUaternion、Transform等类的属性和方法来对物体进行变换&#xff0c;Matrix4x4类通常在一些比较特殊的地方&#xff0c;如对摄像机的非标准投影变换等。本博客主要介绍Matrix4x4类的一些实例和静态方法。 文章目录 一、Matrix4x4类实例方法1、Multply…

机器学习实战教程(九):模型泛化

泛化能力 模型泛化是指机器学习模型对新的、未见过的数据的适应能力。在机器学习中&#xff0c;我们通常会将已有的数据集划分为训练集和测试集&#xff0c;使用训练集训练模型&#xff0c;然后使用测试集来评估模型的性能。模型在训练集上表现得好&#xff0c;并不一定能在测…

Redis源码分析(基于Redis7,对比Redis6)

PS: redis7.0.9版本的 1.Redis 源代码分类 1.1Redis 基本的数据结构 基础 Redis对象object.c字符串t_string.c列表t_list.c字典t_hash.c集合及有序集合t_set.c和z_set.c数据流 t_stream 底层实现结构 listpack.c 和 rax.c 简单动态字符串 sds.c整数集合 intset.c压缩列表 z…

【dp】最长递增子序列

文章目录 方法一&#xff1a;动态规划方法二&#xff1a;贪心 二分查找构造最长递增子序列 方法一&#xff1a;动态规划 dp[i]&#xff1a;末尾元素为arr[i]的最长子序列的长度 从0遍历到i - 1&#xff0c;若遍历到的元素小于当前值arr[i]&#xff0c;表示当前值arr[i]可以和…

国考省考行测:词句理解,词的对象指代,就近原则,主语一致法,语意语境分析上下文找出指代含义

国考省考行测&#xff1a;词句理解&#xff0c;词的对象指代&#xff0c;就近原则&#xff0c;主语一致法&#xff0c;语意语境分析上下文找出指代含义 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国…

3年100亿!苏宁易购与倍科达成重磅战略合作

紧抓消费复苏机遇&#xff0c;家电行业迎来重磅合作。4月20日&#xff0c;苏宁易购与国际知名家电品牌倍科在南京召开战略合作发布会&#xff0c;共同宣布升级战略合作伙伴关系。双方将围绕3年100亿战略合作目标开展独家品牌授权、发起“BIS”计划、打造生态开放平台、升级用户…

5G基站外市电改造建设方案 (ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 外市电定义及分类 定义&#xff1a;由供电部门提供的专用高压电源或非专用高压电源或低压电源均称为市电。分类&#xff1a; &#xff08;1&#xff09;按电压等级分类 ①提供…

贝叶斯学习(Bayesian Learning)基础篇

Bayesian Learning 前言Motivation and IntroductionThink about Spam Filtering.先验概率后验概率似然度边际概率 Basic assumptionRelevancePractical diculties Bayes TheoremProbability: random eventsBayesian Learning Maximum A Posteriori HypothesisBayes Optimal Cl…

合同管理的6个最佳实践

合同管理不善会使你的合同流程效率低下&#xff0c;并产生负面影响&#xff1a; -收入损失 谈判缓慢、审批延迟和里程碑缺失等低效合同代价高昂。如果没有办法自动跟踪最后期限&#xff0c;并得到通知来执行时间敏感的行动&#xff0c;就会有错过最后期限的风险。 -协作和…