资讯专栏INFORMATION COLUMN

Redis学习之数据持久化与数据恢复

Anshiii / 3201人阅读

摘要:持久化记录服务器执行的所有操作命令,并在服务启动时,通过重新执行这些命令来还原数据集。的生成方式通过执行命令手动生成可通过和命令对数据进行持久化,生成文件。

redis缓存是支持数据持久化的操作,也就是可以把内存中的数据持久化到硬盘当中,和数据库有些相似,这也是redis和memcache的区别之一。

redis数据持久化常用的方式有两种:

Snapshotting (RDB)

在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot),也是redis持久化的默认方式。

Append Only File (AOF)

持久化记录服务器执行的所有操作命令,并在服务启动时,通过重新执行这些命令来还原数据集。

RDB的生成方式:

通过执行命令手动生成
可通过SAVE和BGSAVE命令对数据进行持久化,生成RDB文件。
SAVE命令,会阻塞当前服务的进程,在阻塞期间,服务器不能处理任何命令请求,直到缓存数据持久化完成。
BGSAVE命令,顾名思义就是在后台执行,不会阻塞当前服务,会派生出 一个子进程,由子进程负责持久化数据,父进程继续处理命令请求。

通过配置自动生成
可以通过redis.conf配置文件找到SNAPSHOTTING配置,修改save选项,让服务器每隔一段时间自动执行BGSAVE。


配置如下:

################################ SNAPSHOTTING  #################################
#  
# Save the DB on disk:  
#  
#   save    
#  
#   Will save the DB if both the given number of seconds and the given  
#   number of write operations against the DB occurred.  
#  
#   In the example below the behaviour will be to save:  
#   after 900 sec (15 min) if at least 1 key changed  
#   after 300 sec (5 min) if at least 10 keys changed  
#   after 60 sec if at least 10000 keys changed  
#  
#   Note: you can disable saving at all commenting all the "save" lines.  
  
save 900 1         //服务器在900秒内,对缓存数据库至少修改了1次  
save 300 10        //服务器在300秒内,对缓存数据库至少修改了1次  
save 60 10000      //服务在60秒内,对缓存数据库至少修改了10000次  
  
# Compress string objects using LZF when dump .rdb databases?  
# For default that"s set to "yes" as it"s almost always a win.  
# If you want to save some CPU in the saving child set it to "no" but  
# the dataset will likely be bigger if you have compressible values or keys.  
rdbcompression yes  
  
# The filename where to dump the DB  
dbfilename dump.rdb    //持久化数据存到磁盘的文件名称  
  
# The working directory.  
#  
# The DB will be written inside this directory, with the filename specified  
# above using the "dbfilename" configuration directive.  
#   
# Also the Append Only File will be created inside this directory.  
#   
# Note that you must specify a directory here, not a file name.  
dir ./       //存到磁盘的路径  

只要满足上面三个save配置中的一个,redis就会自动进行数据快照,持久化到硬盘中。用户可根据自己需求进行配置。

看到上面的配置我会很好奇,服务器怎么知道我在多长的时间对缓存数据修改了多少次了?后来发现Redis服务其中有个dirty和一个lastsave时间戳。

当服务器执行一个数据修改命令之后,dirty计数器数值会进行更新。

lastsave则是记录上次服务器执行BGSAVE命令的时间,在这就不详细解释了。

AOF

AOF持久化数据是通过保存Redis服务所有的操作命令,下次启动服务时,从新执行这些操作命令来还原缓存数据。

AOF文件刷新有三种方式:

1.appendfsync always - 每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全
2.appendfsync everysec - 每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据
3.appendfsync no - 依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差

默认并推荐每秒刷新,这样在速度和安全上都做到了兼顾

数据恢复:

RDB

RDB恢复数据的方式没有专门的操作命令去执行,redis服务启动时,会自动查找RDB文件进行加载,指导RDB文件加载完成为止。

AOF

服务器在启动时,通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态,具体过程:

(1)载入AOF文件

(2)创建模拟客户端

(3)从AOF文件中读取一条命令

(4)使用模拟客户端执行命令

(5)循环读取并执行命令,直到全部完成

如果同时启用了RDB和AOF方式,AOF优先,启动时只加载AOF文件恢复数据

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/36596.html

相关文章

  • Redis习之数据久化数据恢复

    摘要:持久化记录服务器执行的所有操作命令,并在服务启动时,通过重新执行这些命令来还原数据集。的生成方式通过执行命令手动生成可通过和命令对数据进行持久化,生成文件。 redis缓存是支持数据持久化的操作,也就是可以把内存中的数据持久化到硬盘当中,和数据库有些相似,这也是redis和memcache的区别之一。 redis数据持久化常用的方式有两种: Snapshotting (RDB)在指定...

    SKYZACK 评论0 收藏0
  • JAVA习之Redis

    摘要:丰富的数据类型支持二进制案例的及数据类型操作。原子的所有操作都是原子性的,同时还支持对几个操作全并后的原子性执行。丰富的特性还支持通知过期等等特性。的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个特...

    henry14 评论0 收藏0
  • JAVA习之Redis

    摘要:丰富的数据类型支持二进制案例的及数据类型操作。原子的所有操作都是原子性的,同时还支持对几个操作全并后的原子性执行。丰富的特性还支持通知过期等等特性。的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个特...

    Michael_Lin 评论0 收藏0
  • Redis习笔记】2018-05-30 Redis源码习之Ziplist、Server

    摘要:函数原型本身会占用一个文件描述符,不用时应将其关闭。对而言,操作系统需要遍历所有文件,从而找出发生事件的文件描述符。操作系统为每个维护了一个双向链表,当某个文件可读或者可写时,通过回调事先设定的回调函数,将文件描述符写入这个双向链表。 作者:施洪宝 顺风车运营研发团队一. 压缩列表压缩列表是Redis的关键数据结构之一。目前已经有大量的相关资料,下面几个链接都已经对Ziplist进行...

    starsfun 评论0 收藏0
  • Redis习笔记】2018-05-29 redis源码习之跳跃表

    摘要:四跳跃表的插入跳跃表的插入使用的是函数,该函数如下该函数有一个难点,即函数。现在假设由返回的所以这个进不去。新建一个节点循环可以进入一次,循环内部的代码为更新和新节点的值,更新后如图所示。 顺风车运营研发团队 谭淼跳跃表(skiplist)是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到指向其他节点的目的。在Redis中,有序集合是通过跳跃表和hash实现的...

    AlexTuan 评论0 收藏0

发表评论

0条评论

Anshiii

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<