redis之(十二)redis数据的持久化

[一]redis的数据为什么要持久化

--->redis的存取数据性能高,是由于将所有数据都存储在内存中。当redis重启的时候,存储在内存中的数据就容易丢失。

--->把redis作为数据库使用。

--->把redis作为缓存服务器,但缓存被穿透后会对性能造成很大的影响,所有缓存同时失效会导致缓存雪崩,从而使服务无法响应。

--->因此我们希望redis能将数据从内存中以某种形式同步到硬盘,使得重启后可以根据硬盘中的纪录恢复数据,这一过程就叫做持久化

[二]redis的持久化,支持两种方式。

--->第一种:RDB方式:前者根据指定的规则,“定时”将内存中的数据存储在硬盘上。

--->第二种:AOF方式:每次执行命令后,将命令本身纪录下来。

--->两种持久化的方式可以单独使用其中一种,单更多情况下是二者结合使用

[三]RDB方式

--->前者根据指定的规则,“定时”将内存中的数据存储在硬盘上。

--->RDB方式的持久化是通过快照完成的,当符合一定条件时,redis会自动将内存中的所有数据生成一份副本并存储在硬盘上。这个过程就叫做:快照。

--->如果redis突然宕机,RDB快照只能恢复到最后一次快照的数据,而不能恢复到宕机前最后一刻的数据。因此要配合使用AOF方式进行数据持久化。

--->redis会在以下集中情况对数据进行快照。

(1)根据配置规则进行快照。

(2)用户执行SAVE或BGSAVE。

(3)执行FLUSHALL命令。

(4)执行复制时。

==>用户配置规则快照

(1)快照条件可以由用户在配置文件中自定义。由两个参数构成:时间窗口M和改动键的个数。

(2)意思就是每当时间M内被更改的键的个数大于N的时候,即符合自动生成快照。

(3)格式 save [seconds] [changes]

(4)条件可以配置多个,条件和条件之间是或的关系

==>用户执行SAVE或者BGSAVE命令

&手动执行SAVE命令

(1)当服务重启,手动迁移以及备份时,我们也需要手动执行快照操作

(2)当手动执行save命令时,redis同步进行快照操作,在快照执行的过程中会阻塞所有来自客户端的请求。

(3)当数据库中数据比较多的时候,这一过程会导致Redis较长时间不响应。所以要尽量避免在生产环境中使用这一个命令

&手动执行BGSAVE命令

(1)需要手动执行快照推荐使用BGSAVE命令

(2)BGSAVE命令可以在后台异步地执行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。

(3)如果想知道快照是否完成,请执行LASTSAVE命令获取最近一次成功执行快照的时间。返回Unix时间戳

===>执行FLUSHALL命令

(1)当执行FLUSHALL命令时,redis会清除数据库中所有的数据。需要注意的是,不论清空数据库过程是否出发了自动快照条件,只要自动快照条件不为空,Redis就会执行一次快照。

(2)如果配置文件中没有设置自动快照的条件,执行FLUSHALL命令,不会执行快照,而是直接清空redis内存中的数据。

(2)执行FLUSHALL命令,底层是先触发了自动快照,自动快照完成,再清空数据库。

===>执行复制时

(1)设置主从模式时,Redis会在复制初始化时进行自动快照。

(2)当执行复制操作的时候,即使没有定义自动快照条件,并且没有手动执行快照操作。也会生成RDB快照文件

===>快照的过程

(1)Redis使用forx函数复制一份当前进程(父进程)的副本(子进程)

(2)父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写出硬盘的临时文件

(3)当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成

===>快照的原理。

(1)快照执行fork函数进行快照中,操作系统(类unix)会采用写时复制策略(copy-on-write).开启的子进程和父进程共享redis存储的数据。子进程(快照进程)往硬盘的临时文件里写数据。

(2)在fork函数执行中,有客户端想修改数据,操作系统则会对要修改的数据复制一份用于客户端修改。

(3)因此在快照时,redis的占用内存不会翻倍,但修改的数据块较多的时候,就会使得占用内存暴增,甚至翻倍,超过物理机的内存。

(4)向物理机申请额外内存。可通过修改操作系统配置文件。修改/etc/sysctl.conf文件,在文件中加入vm.overcommit_memory=1,然后重启系统或者执行sysct1 vm。overcommit_memory=1.当物理内存满的时候,liunx系统允许应用程序申请超过可用内存(物理内存+交换分区)的空间。

[四]AOF方式

--->每次执行命令后,将命令本身纪录下来。

--->当使用Redis存储非临时数据时,一般需要打开AOF持久化来降低进程中止导致的数据丢失。

--->AOF可以将Redis执行的每一条命令追加到硬盘文件中。这一过程,显然会降低redis的性能,单大部分情况下这个影响是可以接受的。例外使用较快的硬盘可以提高AOF的性能

--->默认情况下Redis并没有开启AOF(append only file)方式的持久化,可以修改配置文件参数为:appendonly yes.  生成的持久化文件名字为  appendfilename "appendonly.aof"

---> AOF持久化文件的存储路径和RDB的文件路径一样,通过配置文件中的dir参数配置

--->为了防止AOF文件的过大和记录的命令冗余。每当达到一定条件的时候,redis就会自动重写AOF文件,这个条件在配置文件中可以配置

  #auto-aof-rewrite-percentage 100  #当目前的aof文件大小超过上一次重写时aof文件大小的百分之多少时会再次重写。

  #auto-aof-rewrite-min-size 64mb  #允许重写的最小aof文件的大小

--->操作系统存在缓存机制,其实每次要写往硬盘的数据,其实都是先写入操作系统缓存。然后操作系统的缓存每30秒往硬盘写一次数据。

  1. # appendfsync always   #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
  2. appendfsync everysec     #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
  3. # appendfsync no    #完全依赖os,性能最好,持久化没保证  ,交由操作系统每30秒往硬盘刷写一次。

时间: 2024-10-17 15:56:37

redis之(十二)redis数据的持久化的相关文章

Redis 详解 (二) redis的配置文件介绍

目录 1.开头说明 2.INCLUDES 3.MODULES 4.NETWORK 5.GENERAL 6.SNAPSHOTTING 7.REPLICATION 8.SECURITY 9.CLIENTS 10.MEMORY MANAGEMENT 11.APPEND ONLY MODE 12.LUA SCRIPTING 13.REDIS CLUSTER 上一篇博客我们介绍了如何安装Redis,在Redis的解压目录下有个很重要的配置文件 redis.conf (/opt/redis-4.0.9目录下

Redis研究(十二)—数据复制

在上一节中我们写了Redis的数据持久化 http://blog.csdn.net/wtyvhreal/article/details/42916503 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据.但是由于数据是存储在一台服务器上的,如果这台服务器的硬盘出现故障,也会导致数据丢失.为了避免单点故障,我们希望将数据库复制多个副本以部署在不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务.这就要求当一台服务器上的数据库更新后,可以自动将更

Redis教程(十二):服务器管理命令总结

转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/140.html 一.概述: Redis在设计之初就被定义为长时间不间断运行的服务进程,因此大多数系统配置参数都可以在不重新启动进程的情况下立即生效.即便是将当前的持久化模式从AOF切换到RDB也无需重启.    在Redis中,提供了一组和服务器管理相关的 ,其中就包含和参数设置有关的CONFIG SET/GET command. 二.相关命令列表: 命令原型 时间复杂度

分布式系列十二: Redis高级主题

持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同步内存的数据到磁盘.文件名 dump.rdb snapshot: 快照复制. Redis在指定情况下触发快照: (1) 按配置的规则;(2) save 或 bgsave 命令执行;(3) flushall 命令; (4)执行复制 配置的规则: save seconds exchange 当在 seconds 指定的时间内,

Redis学习十:Redis的复制(Master/Slave)【重要】

一.是什么 官网 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 二.能干嘛 读写分离  容灾恢复 三.怎么玩 1.配从(库)不配主(库) 2.从库配置:slaveof 主库IP 主库端口 说明: 每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件 Info replication 3.修改配置文件细节操作 [1]拷贝多个redis.conf文件 [2]开启dae

MySQL学习笔记十二:数据备份与恢复

数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql服务器,或者对需要备份的对象进行锁定,要不很容易造成备份的不一致性,恢复时可能会丢失数据.物理备份的方式有很多,如操作系统命令copy(cp),scp,mysqlbackup,以及MyISAM表的mysqlhotcopy. 逻辑备份 逻辑备份是对数据库的逻辑结构(create database,cr

C#与数据库访问技术总结(十二)数据阅读器(DataReader)2

遍历数据阅读器中的记录 当ExecuteReader方法返回DataReader对象时,当前光标的位置在第一条记录的前面. 必须调用阅读器的Read方法把光标移动到第一条记录,然后,第一条记录将变成当前记录. 如果数据阅读器所包含的记录不止一条,Read方法就返回一个Boolean值true. 想要移到下一条记录,需要再次调用Read方法.重复上述过程,直到最后一条记录,那时Read方法将返回false. 经常使用while循环来遍历记录: while(reader.Read()) { //读取

ElasticSearch(十二)删除数据插件delete-by-query

在ElasticSearch2.0之后的版本中没有默认的delete-by-query,想使用此命令需要安装这个插件. 首先需要进入ES的目录 [[email protected] elasticsearch]# pwd /usr/share/elasticsearch # bin/plugin install delete-by-query -> Installing delete-by-query... Trying https://download.elastic.co/elasticse

Redis教程(十):持久化详解

转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/137.html 一.Redis提供了哪些持久化机制: 1). RDB持久化:    该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘.        2). AOF持久化:    该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的.    3). 无持久化:    我们可以

redis数据可持久化

1.快照(snapshats) 1-1:配置文件 save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb  (存储文件) 含义:指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 1-2:可以自己手动存储 save 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘. 一般来说,在生产环境很少执行 SAVE 操作,因为它会阻塞所有客户端,保存数据库