Redis-持久化

redis强大的性能很大程度上是因为所有数据都存储在内存中,然而当redis重启后,所有存储在内存中的数据都会丢失,需要将内存

中的数据持久化。Redis支持两种数据持久化的方式。


RDB方式和AOF方式

前者会根据配置的规则,定时将内存中的数据持久化到硬盘上,后者则每次执行命令之后记录下来。

RDB

RDB方式的持久化是通过快照的方式完成的。当符合某种规则时。会将内存中的数据全量生成一份副本存储到硬盘上,这个过程称之

为快照。Redis会在以下几种情况下对数据进行快照:

 1. 根据配置规则进行自动快照

 2. 用户执行SAVE,BGSAVE命令

 3. 执行FLUSHALL命令

 4. 执行复制时

 5. 根据配置规则进行自动快照

每个快照条件独占一行,他们之间是或的关系,只要满足其中一个就进行快照。第一个参数T为时间,单位是秒,第二个参数M代表更

改的键的个数。含义:时间T内,修改的键的个数大于M,自动进行快照。

用户执行SAVE,BGSAVE命令

除了让Redis自动执行快照,当我们需要重启,迁移,备份redis时,可以手动执行SAVE或者BGSAVE命令主动进行快照。

SAVE:当执行SAVE命令时,Redis同步执行快照操作,期间会阻塞来自客户端的请求。

BGSAVE:与SAVE命令的差别在于该操作是在后台异步进行的,进行快照操作的同时还能处理来自客户端的请求。通过执行LASTSAVE命令返回

       最近一次成功执行快照的时间。

FLUSHALL:当执行该命令时,Redis会清楚数据库中所有的数据。不论清空数据库的过程是否触发了自动快照的条件,只要自动

快照的条件不为空,redis就会执行一次快照操作,当没有定义自动快照条件时,执行FLUSHALL命令不会进行快照操作。

执行复制

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

快照原理

Redis默认会将快照文件存储在Redis当前进程的工作目录dump.rdb文件中,通过redis.conf中的dir和dbfilename两个参数分别指定

快照文件的存储路径和文件名。

快照执行过程:

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

2.父进程继续处理来自客户端的请求,子进程开始将内存中的数据写入硬盘中的临时文件

3.当子进程写完所有的数据后,用该临时文件替换旧的RDB文件。

注意:当执行fork操作时,采用的是写时复制策略,即在fork操作发生的一刻,父进程和子进程共享同一块内存数据,当父进程需要修

改其中的某片数据,操作系统会将该片数据复制一份以保证子进程不受影响,所以RDB文件存储的是执行fork操作的那一刻的内存数

据。所以RDB方式理论上会存在数据的丢失。RDB启动时会自动读取RDB快照文件,将数据从硬盘载入到内存。

AOF方式

默认情况下是没有开启的AOF(append only file)持久化功能的,通过在配置文件中做如下配置启用:

appendonly yes

开启之后,redis的每一条写命令就会将该命令写入到硬盘中的AOF文件中

AOF文件重写问题:

set k v1
set k v2
set k v3

如果将这三条命令都写入到AOF文件的话,是一个比较愚蠢的问题。删除AOF文件中无用的命令的过程称为AOF重写,通过在配置文

件中配置。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

第一行的意思是,目前的AOF文件的大小超过上一次重写时的AOF文件的百分之多少时再次进行重写,如果之前没有重写过,则以启

动时AO文件大小为依据。

第二行的意思是,当AOF文件的大小大于64MB时才进行重写。当然还可以通过手动执行BDREWRITEAOF命令主动让redis重写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值