当前位置: 首页 > 编程日记 > 正文

redis 缓存过期默认时间_缓存的必知必会:一文搞懂Redis持久化和过期机制

446d1237dd29ba6747078cf0301216e9.png

本文主要介绍了 Redis 持久化的两种机制:RDB 和 AOF,以及键过期的策略:惰性删除和定期删除,还有 RDB、AOF 和复制功能对过期键的处理。

RDB

RDB 是 Redis 持久化的第一种方式。有两个 Redis 命令可以用于生成 RDB 文件,一个是 SAVE,另一个是 BGSAVE。

SAVE 会阻塞 Redis 服务器进程,执行时 Redis 服务器会阻塞所有客户端发送的命令。

redis> SAVEOK

BGSAVE 会派生出一个子进程执行,执行时仍可继续处理客户端的命令,但会拒绝客户端 SAVE 和 BGSAVE 的命令,延迟 BGREWRITEAOF 命令。

redis> BGSAVEBackground saving started

执行条件

SAVE 命令会阻塞服务器,所以只能手动执行。BGSAVE 可以在不阻塞的情况下执行,所以可以配置 save 选项让服务器每隔一段时间自动执行一次。

比如我们可以向服务器提供以下配置:

save 900 1save 300 10save 60 10000

那么只要满足以下三个条件中的任意一个即可被执行:

  • 服务器在 900 秒之内对数据库进行了至少 1 次修改。
  • 服务器在 300 秒之内对数据库进行了至少 10 次修改。
  • 服务器在 60 秒之内对数据库进行了至少 10000 次修改。

为了实现这一功能,服务器会维持一个记录距离上次保存之后修改的次数的 dirty 计数器和一个记录上次保存时间的 lastsave 属性。

周期操作函数 serverCron 默认每个 100 毫秒就会执行一次,它的其中一项工作就是检查 save 选项设置的条件是否满足,如果满足的话就会执行 BGSAVE 命令。

文件内容

RDB 文件有多个部分,包括握手字段 ‘REDIS’ 字符串,版本号,数据库,’EOF’ 和校验字段。

核心部分是数据库字段,数据库字段包括了握手字段 ‘SELECTDB’,数据库编号和键值对,数据库编号指示了这是第几个数据库,而键值对则保存了各项数据。

键值对中除了类型和数据,还可能会有过期时间。对于不同类型的键值对,RDB 文件会用不同的方式来保存它们。

RDB 文件本身是一个经过压缩的二进制文件,每次 SAVE 或者 BGSAVE 都会创建一个新的 RDB 文件,不支持追加操作。

AOF

AOF 是 Redis 持久化的第二种方式,在 AOF 和 RDB 同时开启时,服务器会优先考虑从 AOF 恢复数据,因为 AOF 每次记录间隔的时间更短。

和 RDB 直接记录键值对不同,AOF 记录的是命令。服务器在执行完一个写命令以后,会把这条命令追加到服务器 aof_buf 缓冲区的末尾,并在一个适当的时候写入文件。重建时服务器会创建一个伪客户端,依次执行文件中的命令即可完成数据的载入。

文件的写入与同步

AOF 的持久化发生在每次事件循环结束之前,会阻塞服务器。在持久化时会调用操作系统的 write 函数,但通常该函数会把数据保存在一个内存缓冲区里面而不是立刻刷入磁盘。这就带来一个安全问题。为了避免这个问题操作系统又提供了 fsync 和 fdatasync 两个强制刷盘的同步函数。我们把 write 称为写入,把 fsync 和 fdatasync 称为同步。

服务器会在每次事件循环结束之前根据 appendfsync 选项写入和同步 aof_buf 中的数据:

  • always:写入并同步
  • everysec:写入,如果距离上次同步超过 1 秒,则同步
  • no:只写入,何时同步由操作系统决定

AOF 重写

随着服务器运行时间的流逝,AOF 文件中的内容会越来越多,文件的体积也会越来越大,不仅会对宿主计算机造成影响,也拖慢了数据恢复所需要的时间。

AOF 重写是指重新生成一个 AOF 文件替换原来的 AOF 文件。但这里的重写不会对原有的文件进行读取、分析或者写入,而是把数据库中的键值对折算成命令,重新写入新的文件。

重写是一个耗时的操作,因此 Redis 把它放到后台去操作,对应的指令是 BGREWRITEAOF。在重写过程中服务器还可能接收新的指令,因此 Redis 会维护一个 AOF 重写缓冲区,记录重写期间的写命令,在重写完成后追加到 AOF 文件末尾。

RDB 和 AOF 对比

RDB 的优点

  • RDB 是一个非常紧凑的文件,它的体积更小,且可以选择持久化的时间,适合做备份的文件。比如每天的备份,每月的备份。
  • RDB 对主进程更友好,父进程只需要 fork 出一个子进程,无须执行任何磁盘 I/O 操作。
  • RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

RDB 的缺点

  • 因为 RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。 因此你可能会至少 5 分钟才保存一次 RDB 文件,间隔时间比较长。
  • RDB 虽然会把持久化的操作交给子进程,但每次都会从头开始,在数据集比较庞大时, fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端; 如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。

AOF 的优点

  • AOF 使用追加的方式,每次写入时间很短,因此可以允许更短间隔的持久化操作,比如 1 秒。
  • AOF 文件的可读性比较好,如果你不小心执行了一条命令,只要 AOF 文件未被重写,那么只要停止服务器,移除 AOF 文件里的该条命令然后重启 Redis 即可。

AOF 的缺点

  • 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
  • 使用 fsync 会降低 Redis 的性能,导致 AOF 的速度可能会慢于 RDB 。

RDB 和 AOF 各有所长,RDB 体积小,恢复速度快,而且可以生成快照;AOF 频率更高,可以保存更新的数据。一般来说,推荐同时使用。

Redis 过期机制

Redis 采取的是惰性删除和定期删除配合使用的方式。

惰性删除是指 Redis 会在访问某个键的时候检查该键是否过期,如果过期,就会将输入键从数据库中删除。但惰性删除不能及时清理内存,因此 Redis 还有定期删除的机制。

定期删除是另一种过期键删除方式。Redis 会维护一个过期字典(如下图所示),所有声明了过期时间的键都会被添加进这个字典中。周期操作函数 serverCron 执行时,会在规定时间内随机检查一部分键的过期时间,并删除其中的过期键。

95fadbbcdf7e72551921eb4bfb3405ae.png

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

RDB 对过期键的处理

RDB 文件在生成时会检查每个键的过期时间,过期键不会被添加进 RDB 文件里。

载入 RDB 文件时,如果该服务器是主服务器,则不会载入文件中过期的键;如果该服务器是从服务器,则不论过期与否都会被载入。不过,因为主从服务器在同步的时候,从服务器的数据库会被清空,所以一般来讲,过期键对载入 RDB 文件的从服务器不会造成影响。

AOF 对过期键的处理

AOF 文件写入时,如果数据库中的某个键已过期,但它还没被删除,那么 AOF 文件不会因为这个键产生任何影响。当它被惰性删除或者定期删除之后,程序会向 AOF 文件追加一条 DEL 命令显示记录该键已被删除。

AOF 重写时,和生成 RDB 文件一样,会过滤掉已经过期的键。

复制功能对过期键的处理

主服务器在删除一个过期键后,会显式地向所有从服务器发送一个 DEL 命令,告知从服务器删除这个过期键。

Redis 3.2 前,为了保持主从一致性,从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期键一样处理过期键。从服务器只有在接到主服务器发来的 DEL 命令之后,才会删除过期键。Redis 3.2 后,从节点在读取数据时,增加了对数据是否过期的判断:如果该数据已过期,则不返回给客户端。

关注我,后续更多干货奉上

相关文章:

ASP.NET MVC 5 - 视图

2019独角兽企业重金招聘Python工程师标准>>> 在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML。 您将创建一个视图模板文件,其中使用了ASP.NE…

java内存泄漏问题排查

背景:程序部署在客户机器上,不定期异常崩溃,且无日错误异常日志记录。 day1:初步排查是内存问题导致的,考虑使用分析工具记录分析。另外代码review仔细排查,怀疑有可能跟大量网络socket没有释放有关。 程序…

的正确使用_弹力袜的正确使用

何为弹力袜?弹力袜是预防下肢静脉疾病的重要措施,其设计上远心端压力大,近心端压力小。医用循序减压弹力袜在脚踝部建立最高支撑压力,顺着腿部向上逐渐递减,在小腿肚减到最大压力值的70%-90%,在大腿处减到最大压力值的…

yii2的安装

yii2也是依赖于composer, 就像laravel, 所以先安装composer, 如果安装不上composer可以看laravel安装的文章. 安装好composer之后安装一个插件 composer global require "fxp/composer-asset-plugin:1.0.0"或composer global require "fxp/composer-asset-plugi…

eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样...

eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样第一种说法:还真的找到解决的方法了,如下:1.退出eclipse2.到[工程目录下]/.metadata/.plugins/org.eclipse.core.runtime3.把org.eclipse.wst.server.co…

代码示例_网络编程_select

select_多路复用 1.头文件 1 #pragma once2 3 #include <stdio.h>4 #include <stdlib.h>5 #include <sys/types.h>6 #include <sys/select.h>7 #include <sys/time.h>8 #include <sys/socket.h>9 #include <strings.h> 10 #include …

LTE中基本通信过程的理解——上行调度

上行调度1. UE向ENB请求上行资源Physical channel: PUCCHMessage: SR (schedule request)根据上层的配置UE按照一定的周期和子帧位置上通过PUCCH中的控制消息UCI传输SR【RACH成功之后&#xff0c;ENB配置UE的SR子帧位置和发送周期&#xff0c;如果接入UE过多周期就长&#xff0…

qrcode生产带logo_“白板”口罩打上LOGO装名牌 警方重拳出击清市场

看看新闻Knews记者 毛鸿仁2020-09-17 10:19假冒口罩危害大&#xff0c;无良商家被查处。近日&#xff0c;上海松江警方侦破了一起假冒品牌口罩的案件&#xff0c;犯罪嫌疑人赵某等人被松江警方依法采取刑事强制措施。7月下旬&#xff0c;上海市公安局松江分局通过警企协作&…

Tomcat 服务器的端口号的修改

在系统中找到Tomcat安装目录下的conf文件夹下的servlet.xml文件。 &#xff08;1&#xff09;在servlet.xml文件中找到以下代码&#xff1a; <connector port"8080" protocol"HTTP/1.1" connectionTimeout"20000" redirectPort"8443&q…

js获取宽度设置thickbox百分比

thickbox的宽高不好设为百分比&#xff0c;这样遇到不同的尺寸的电脑就会出现问题。 怎么做呢&#xff1f; 通过js来处理。 <script type"text/javascript">$(function(){var width window.screen.width;//通用&#xff0c;各浏览器都支持获取宽度width widt…

【算法总结】数学问题-最大公约数和最小公倍数

【算法总结】最大公约数和最小公倍数 一、最大公约数&#xff08;GCD&#xff1a;greatest common divisor&#xff09; 欧几里得算法&#xff1a; 若 a、b 全为零则它们的最大公约数不存在&#xff1b;若 a、b 其中之一为零&#xff0c;则它们的最大公约数为 a、b 中非零的那个…

javascript 手势缩放 旋转 拖动支持:hammer.js

原文&#xff1a; https://cdn.rawgit.com/hammerjs/hammer.js/master/tests/manual/visual.html /*! Hammer.JS - v2.0.4 - 2014-09-28* http://hammerjs.github.io/** Copyright (c) 2014 Jorik Tangelder;* Licensed under the MIT license */ (function(window, document, …

探测参考信号(Sounding Reference Signal)

SRS是探测参考信号的缩写&#xff0c;所谓参考信号&#xff0c;那么是为谁提供参考&#xff1f;参考的指标是什么&#xff1f;答案是为eNodeB的调度提供参考&#xff0c;参考的内容是为上行信道质量做参考。那么为什么需要SRS呢&#xff1f;众所周知&#xff0c;在LTE网络中&am…

机器人瓦力船长机器人_警察“瓦力”来啦!机器人巡逻南京路 这样的它你喜欢吗?...

电影“瓦力”中的机器人主角瓦力让人印象深刻&#xff0c;这两天&#xff0c;一台形似瓦力的机器人出现在了南京路步行街上&#xff0c;一下子就成为了这条街上“最靓的仔”&#xff0c;实际上&#xff0c;它是一台功能强大的警用巡逻机器人。“我正在南京路步行街执行巡逻任务…

转 mac svn用法

mac svn 删除.svn隐藏文件的命令 打开终端,进到所在的目录,然后出入一下代码 find . -name ".svn" | xargs rm -Rf 1、将文件checkout到本地目录svn checkout path&#xff08;path是服务器上的目录&#xff09;例如&#xff1a;svn checkout svn://192.168.1.1/pro/…

MySQL图形处理软件Navicat字体配置(乱码解决)

设置字体 1.常规 Noto Sans Mono CJK TC Regular 2.编辑器 Noto Sans CJK SC Regular 3.记录 Noto Sans Mono CJK TC Regular 转载于:https://www.cnblogs.com/jrri/p/11075040.html

Corn Fields(POJ 3254状压dp)

题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案。 分析&#xff1a; dp[i][j]第i行可行状态j的的最大方案数&#xff0c;枚举当前行和前一行的所有状态转移就行了&#xff08;不放牛也算一种情况&#xff09; #include <map> #include <set> …

批量关闭公众号推送_微信推出“一键拒收”长期未读公众号推送功能

近期已经写了不少关于微信的消息了&#xff0c;本来想换个话题休息一下&#xff0c;谁知道微信不休息啊&#xff0c;又开始内测了。7月25日&#xff0c;部分iOS内测微信用户会收到系统对长时间未读订阅号的提醒&#xff0c;并可通过提醒入口选择不接收这部分订阅号的群发消息推…

如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN

如何用BIND, GeoIP, Nginx, Varnish来创建你自己的高效的CDN网络&#xff1f;CDN&#xff0c;意思是Content Distrubtion Network&#xff0c;意思是内容分发网络&#xff0c;简单的说&#xff0c;就是全地域范围内的负载均衡&#xff0c;全地域的概念可以是全国&#xff0c;也…

Asp.Net Core 入门(一)——Program.cs做了什么

ASP.NET Core 是微软推出的一种全新的跨平台开源 .NET 框架&#xff0c;用于在 Windows、Mac 或 Linux 上生成基于云的新式 Web 应用程序。国内目前关于Asp.Net Core的书比较少&#xff0c;自己靠着阅读微软官方文档&#xff0c;源码和在52ABP梁老师的教程中慢慢的在一点点的积…

LTE MIBSIB1

LTE MIB/SIB1 LTE MIB/SIB 消息可以参考&#xff1a;http://blog.csdn.net/wowricky/article/details/51348613 UE 接受完MIB/SIB1后就可以判断这个CELL是否可以驻留&#xff0c;这里仅仅讨论与驻留 (Camp on)相关的参数。 1. MIB 包含BW/PHICH/SFN 2. SIB1 包含小区接入信…

python 加载动图_在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...

大数据文摘授权转载自数据派THU作者&#xff1a;MOHD SANAD ZAKI RIZVI本文主要介绍了&#xff1a;TensorFlow.js (deeplearn.js)使我们能够在浏览器中构建机器学习和深度学习模型&#xff0c;而无需任何复杂的安装步骤。TensorFlow.js的两个组件——Core API和Layer API。了解…

mySQL笔记(1)

1.show databases; 显示所有数据库 2.create database 数据库名 [其他选项]&#xff1b; 新建数据库 例&#xff1a;create database example_db character set gbk; 创建了一个名为example_db的数据库&#xff0c;并将数据库字符编码指定为gbk,便于在命令提示符下显…

Loadrunner进行md5加密方法

本文主要介绍使用Loadrunner进行字符串md5加密的方法。 使用Loadrunner进行md5比较简单&#xff0c;首先是加载md5.h头文件&#xff0c;后使用头文件中的加密函数即可。 1. md5.h头文件内容如下 #ifndef MD5_H #define MD5_H #ifdef __alpha typedef unsigned int uint32; #els…

6 Java Shell排序

希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序&#xff0c;待整个序列中的记录“基本有序”时&#xff0c;再对全体记录进行依次直接插入排序。 1、基本思想 将待排序数组按照步长gap进行分组&#xff0c;然后将每组的元素利用直接插入排序的方法…

如何向非技术人员解释“稀疏傅里叶变换”算法?

【伯乐在线导读】&#xff1a;这个问题来自 Quora&#xff0c;下面是来自 Tanooj Luthra 的回复。 让我们来演奏一架想象中的钢琴。 钢琴的每个琴键都对应一个特定频率的声音。例如&#xff0c;一个比较有名的频率是国际标准音A&#xff08;440赫兹&#xff09;。当有琴键按下时…

N皇后摆放问题

Description 在N*N的方格棋盘放置了N个皇后&#xff0c;使得它们不相互攻击&#xff08;即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45角的斜线上。你的任务是&#xff0c;对于给定的N&#xff0c;求出有多少种合法的放置方法。 Inp…

java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...

第12章 Java内存模型与线程前言&#xff1a;1、物理机如何处理并发问题&#xff1f;2、什么是Java内存模型&#xff1f;3、原子性、可见性、有序性的具体含义和应用实现&#xff1f;4、volatile 关键字特性&#xff1f;5、基于volatile变量的运算在并发下是否是线程安全的&…

动软代码生成V2.74模版简介

最近发现很多人用动软代码生成&#xff0c;确实方便&#xff0c;有些经验记录下&#xff0c;以后查看回顾。 ..\Maticsoft\Codematic2\Template\TemplateFile 为模板文件夹&#xff0c;直接在目录下新建文件夹【我的自定义模版】,有个【模版示例.cmt】也直接复制到自定义文件下…