Redis持久化

Redis持久化

方式: 1. RDB方式 2. AOF方式

1.RDB方式(通过快照完成)

快照:当符合一定条件时redis会将内存中的所有数据生成一份副本并存储在硬盘上

redis会在以下几种情况下进行快照:
  1. 根据配置规则进行自动快照

    • redis允许用户自定义快照条件,当符合快照条件是,redis会自动执行快照操作
    • 进行快照的条件可以由用户在配置文件中进行设置,由两个参数组成 时间M 和 改动的键的个数N,每当时间M内更改的键的个数大于N时,即符合自动快照条件
    • 例:
        save 900 1  # 表示900秒内有一个或者一个以上的键被更改则进行快照
        save 300 10  # 表示300秒内至少有10个键被修改则进行快照
    
    • 每条快照占一行,以save参数开头
    • 同时存在的多个条件是的关系
  2. 用户执行SAVE或BGSAVE命令

    • SAVE命令能够让reids同步的进行快照操作,在快照执行的过程中会阻塞所有来在客户端的请求.
    • SAVE的弊端:当数据库中的数据较多的时候,这一过程会导致redis较长时间不响应,所以要尽量避免生产环境使用该命令
    • BGSAVE命令能够异步的在后台进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求.
    • 执行BGSAVE会立即返回OK表示开始执行快照操作
    • 可以使用LASTSAVE命令来获取最近一次成功执行快照的时间,返回结果是一个UNIX时间戳
  3. 执行FLUSHALL命令

    • 当执行FLUSHALL命令时,Redis会清除数据库中的所有数据.
    • 当自动快照条件不为空时,不论清空数据库的过程是否触发了自动快照条件,都会执行一次快照操作
    • 当自动快照条件为空时,执行FLUSHALL则不会进行快照
  4. 执行复制(replication)命令

    • 当使用复制操作时,即使没有定义自动快照条件,并且没有手动执行过快照操作,也会生成RDB快照文件
  • 快照原理
    • 快照默认将快照文件存储在Redis当前进程的工作目录中的dump.rdb文件中
    • 通过/etc/redis/redis.conf配置文件中的dirdbfilename两个参数分别指定快照文件的存储路径和文件名
  • 快照过程
    1. Reids使用fork函数复制一份当前进程(父进程)的副本(子进程)
    2. 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
    3. 当子进程写入完成所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成
写时复制
  • 在执行fork时操作系统(类unix操作系统)会使用写时复制(copy-on-write)策略,即fork函数发生的那一刻父子进程共享同一内存数据,当父进程要更改
    其中某片数据时(如执行一个写命令),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork那一刻的内存数据
  • 写时复制策略保证了fork时刻虽然看上去生成了两份内存副本,但实际上内存的用量并不会增加一倍.要确保Linux系统允许应用程序申请超过可用内存
    (物理内存和交换分区)的空间,方法是在/etc/sysctl.conf文件加入vm.overcommit_memory = 1,然后重启系统或者执行
    sysctl vm.overcommit_memory=1确保设置生效
  • 当进行快照的时候如果写入操作较多,造成fork前后数据差异较大,是会使得内存使用量显著超过实际内存数据大小的,因为内存中不仅保存了当前的
    数据库数据而且还保存着fork时刻的内存数据,进行内存用量估算时很容易忽略这个问题,造成内存用量超限
  • Redis启动后会读取RDB快照文件,将数据从硬盘载入内存,根据数据量和服务器性能不同,这个时间也不同.通常一个记录1000万个字符串类型键,
    大小为1GB的快照文件载入到内存中需要花费20~30秒.

2. AOF方式

AOF可以将Redis执行的每一条写命令追加到硬盘文件中

开启AOF
  • 在配置文件redis.conf中找到appendonly no,将其改为appendonly yes,开启AOF持久化
  • 开启AOF持久化后每执行一条会更改redis中数据的命令,redis就会将该命令写入到磁盘的AOF文件.
  • AOF文件的保存路径和RDB文件的位置相同,都是通过dir参数设置,默认的文件名为appendonly.aof,可以通过 appendfilename参数修改appendfilename appendonlytest.aof
  • 启动时redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度相较RDB会慢一些
redis自动优化AOF文件(配置文件更改)
  • auto-aof-rewrite-percentage 100 后面参数的意义是目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少会再次进行重写,
    如果之前没有重写过,则以启动时的AOF文件大小为依据
  • auto-aof-rewrite-min-size 64mb 参数限制了允许重写的最小AOF文件大小,通常在AOF文件很小时即使有很多冗余的命令我们也并不会太关心.
  • 手动执行AOF重写: BGREWRITEAOF
AOF同步硬盘数据

遇到的问题:
虽然每次执行数据库更改操作时,AOF都会将命令记录在AOF文件中,但是事实上,由于操作系统的缓存机制,数据并没有真正的写入硬盘,
而是进入了系统硬盘的缓存,默认情况下系统每30s会执行一次同步操作,以便将硬盘缓存中的内容真正的写入硬盘,
但是如果系统异常退出那么缓存中的数据就会丢失,这是无法忍受的

解决方案:
redis在写入AOF文件后主动要求系统将缓存内容同步到硬盘中,打开配置文件redis.conf,在其中找到appendfsync参数

# appendfsync always
appendfsync everysec
# appendfsync no
  • everysec(redis默认):每秒执行一次同步操作.特点:兼顾性能的同时又保证了安全
  • always:表示每次执行写入都会执行同步.特点:最安全但是最慢
  • no:不主动进行同步操作,完全交由操作系统来做(每30s一次).特点:最快但最不安全

redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值