wordpress建哪些网站吗,请人做网站卖东西好吗,网站建设这块是怎么挣钱的,开发公司公司简介Redis持久化 文章目录 Redis持久化一#xff1a;持久化简介1#xff1a;Redis为什么要进行持久化2#xff1a;Redis持久化的方式 二#xff1a;RDB持久化介绍1#xff1a;手动触发RDB2#xff1a;自动触发RDB3#xff1a;redis.conf中进行RDB的配置4#xff1a;RDB优缺…Redis持久化 文章目录 Redis持久化一持久化简介1Redis为什么要进行持久化2Redis持久化的方式 二RDB持久化介绍1手动触发RDB2自动触发RDB3redis.conf中进行RDB的配置4RDB优缺点 二AOF持久化介绍1写后日志2如何实现AOF3redis.conf中进行AOF的配置 一持久化简介
1Redis为什么要进行持久化
Redis是个基于内存的数据库。那服务一旦宕机内存中的数据将全部丢失。
通常的解决方案是从后端数据库恢复这些数据但后端数据库有性能瓶颈
如果是大数据量的恢复会对数据库带来巨大的压力数据库的性能不如Redis。导致程序响应慢
2Redis持久化的方式
1AOF 日志Append Only File文件追加方式 记录所有的操作命令并以文本的形式追加到文件中。
2RDB 快照Redis DataBase 将某一个时刻的内存数据以二进制的方式写入磁盘。
3混合持久化方式 Redis 4.0 新增了混合持久化的方式集成了 RDB 和 AOF 的优点。
二RDB持久化介绍
RDB 就是 Redis DataBase 的缩写中文名为快照/内存快照
RDB持久化是把当前进程数据生成快照保存到磁盘上的过程由于是某一时刻的快照那么快照中的值要早于或者等于内存中的值。
1手动触发RDB
手动触发分别对应save和bgsave命令
save命令阻塞当前Redis服务器直到RDB过程完成为止对于内存比较大的实例会造成长时间阻塞线上环境不建议使用bgsave命令Redis进程执行fork操作创建子进程RDB持久化过程由子进程负责完成后自动结束。 阻塞只发生在fork阶段一般时间很短 具体的流程如下 redis客户端执行bgsave命令或者自动触发bgsave命令 主进程判断当前是否已经存在正在执行的子进程如果存在那么主进程直接返回 如果不存在正在执行的子进程那么就fork一个新的子进程进行持久化数据fork过程是阻塞的fork操作完成后主进程即可执行其他操作 子进程先将数据写入到临时的rdb文件中待快照数据写入完成后再原子替换旧的rdb文件 同时发送信号给主进程通知主进程rdb持久化完成主进程更新相关的统计信息info Persitence下的rdb_*相关选项。 2自动触发RDB
下面的四种情况会自动触发RDB持久化
redis.conf中配置save m n即在m秒内有n次修改时自动触发bgsave生成rdb文件主从复制时从节点要从主节点进行全量复制时也会触发bgsave操作生成当时的快照发送到从节点执行debug reload命令重新加载redis时也会触发bgsave操作默认情况下执行shutdown命令时如果没有开启aof持久化那么也会触发bgsave操作
3redis.conf中进行RDB的配置
内存快照在生产环境下多数情况都会设置其周期性执行条件 # 周期性执行条件的设置格式为
save seconds changes# 默认的设置为
save 900 1 # 如果900秒内有1条Key信息发生变化则进行快照
save 300 10 # 如果300秒内有10条Key信息发生变化则进行快照
save 60 10000 # 如果60秒内有10000条Key信息发生变化则进行快照。# 以下设置方式为关闭RDB快照功能
save # 其他配置相关 # 文件名称
dbfilename dump.rdb# 文件保存路径
dir /home/work/app/redis/data/# 如果持久化出错主进程是否停止写入
stop-writes-on-bgsave-error yes# 是否压缩
rdbcompression yes# 导入时是否检查
rdbchecksum yesRDB 做快照的时候数据能修改吗 怎么修改 save 是同步的会阻塞客户端命令bgsave 的时候是可以修改的。
具体的修改方案主要是利用 bgsave 的子线程实现的具体操作如下
如果主线程执行读操作则主线程和 bgsave 子进程互相不影响如果主线程执行写操作则被修改的数据会复制一份副本然后 bgsave 子进程会把该副本数据写入 RDB 文件在这个过程中主线程仍然可以直接修改原来的数据。 4RDB优缺点 优点 RDB文件是某个时间节点的快照默认使用LZF算法进行压缩压缩后的文件体积远远小于内存大小适用于备份、全量复制等场景Redis加载RDB文件恢复数据要远远快于AOF方式 缺点 RDB方式实时性不够无法做到秒级的持久化每次调用bgsave都需要fork子进程fork子进程属于重量级操作频繁执行成本较高RDB文件是二进制的没有可读性AOF文件在了解其结构的情况下可以手动修改或者补全版本兼容RDB文件问题
二AOF持久化介绍
AOF 采用的是写后日志的方式Redis 先执行命令把数据写入内存然后再记录日志到文件中。
AOF 日志记录的是操作命令不是实际的数据如果采用 AOF 方法做故障恢复时需要将全量日志都执行一遍。 1写后日志
Redis是“写后”日志Redis先执行命令把数据写入内存然后才记录日志
日志里记录的是Redis收到的每一条命令这些命令是以文本形式保存
大多数的数据库采用的是写前日志例如MySQL通过写前日志和两阶段提交实现数据和逻辑的一致性 优点 - 高性能 避免额外的检查开销Redis 在向 AOF 里面记录日志的时候并不会先去对这些命令进行语法检查。不会阻塞当前的写操作 缺点 - 丢失数据可能 写日志之前宕机了会丢失数据主线程写磁盘压力大导致写盘慢阻塞后续操作
2如何实现AOF
AOF日志记录Redis的每个写命令步骤分为命令追加append、文件写入write和文件同步sync append - 当AOF持久化功能打开了服务器在执行完一个写命令之后会以协议格式将被执行的写命令追加到服务器的 aof_buf 缓冲区 write sync - 关于何时将 aof_buf 缓冲区的内容写入AOF文件中Redis提供了三种写回策略 性能和可靠性不可兼得
3redis.conf中进行AOF的配置
默认情况下Redis是没有开启AOF的可以通过配置redis.conf文件来开启AOF持久化 # appendonly参数开启AOF持久化
appendonly no# AOF持久化的文件名默认是appendonly.aof
appendfilename appendonly.aof# AOF文件的保存位置和RDB文件的位置相同都是通过dir参数设置的
dir ./# 同步策略
# appendfsync always
appendfsync everysec
# appendfsync no# aof重写期间是否同步
no-appendfsync-on-rewrite no# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb# 加载aof出错如何处理
aof-load-truncated yes# 文件重写策略
aof-rewrite-incremental-fsync yes AOF在重写时在fork进程时是会阻塞住主线程的重写过程总结为“一个拷贝两处日志”。 在fork出子进程时的拷贝以及在重写时如果有新数据写入主线程就会将命令记录到两个AOF日志内存缓冲区中 总结操作 主线程fork出子进程重写AOF日志子进程重写日志完成后主线程追加AOF日志缓冲替换日志文件