Redis简单介绍2-持久化
Posted 心流时间
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis简单介绍2-持久化相关的知识,希望对你有一定的参考价值。
文章目录
- 1. 持久化类型(主从复制时,主节点自动触发)
- 2. RDB(Redis DateBase)
- 2.1 自动触发rdb持久化,修改redis.conf配置文件
- 2.2 手动触发rdb持久化
- 2.2.1 手动触发时机:有时候还未达到自动触发rdb的条件,我们就想触发持久化,这时候可以选择手动触发
- 2.2.2 save 在主程序执行中会阻塞当前redis服务器,直到持久化工作完成,禁止使用
- 2.2.3 bgsave redis会fork一个子进程进行持久化,不会阻塞redis服务器,使用这个
- 2.2.4 lastsave 获取上一次持久化的时间戳
- 2.2.5 date -d @时间戳 根据时间戳获取时间(不是在redis服务器中,在linux中,redis命令不区分大小写,linux命令区分)
- 2.2.6 rdb优点
- 2.2.7 rdb缺点
- 2.2.8 redis宕机,rdb未持久化,丢失数据
- 2.2.9 /usr/local/bin/redis-check-aof /myredis/dumpfiles/dump6379.rdb 修复rdb文件
- 2.2.10 总结触发rdb快照的情况有哪些
- 2.2.11 禁用快照(rdb)
- 2.2.12 redis.conf snapshotting模块的参数介绍
- 2.2.13 rdb总结
- 3. AOF(Append-only file)
- 4. RDB+AOF混合持久化
- 5. No Persistence(纯缓存模式)
- 6. 查看redis配置
1. 持久化类型(主从复制时,主节点自动触发)
2. RDB(Redis DateBase)
2.1 自动触发rdb持久化,修改redis.conf配置文件
2.1.1 5秒内2次修改就会自动触发rdb持久化
2.1.2 修改dump文件保存路径
2.1.3 指定rdb文件名称
修改redis.conf配置文件
2.1.4 配置完成之后重启redis-server
2.1.5 5秒内执行两次修改自动触发rdb持久化
2.1.6 当执行flushdb、flushall时也会触发持久化,但生成的持久化文件是空的,没有意义
2.1.7 在redis-cli中执行shutdown(主动的关机)时也会持久化,生成新的持久化文件
执行shutdown
生成新持久化文件
将持久化文件删除(改名),重新启动redis-server,发现redis中没有了原来的数据,也就是说没有持久化文件,重启redis就没有了原来的数据。
当有redis持久化文件时,重启redis-server,会将文件中的数据恢复到redis内存中
2.2 手动触发rdb持久化
2.2.1 手动触发时机:有时候还未达到自动触发rdb的条件,我们就想触发持久化,这时候可以选择手动触发
2.2.2 save 在主程序执行中会阻塞当前redis服务器,直到持久化工作完成,禁止使用
执行save命令期间,redis不能处理其他命令,线上禁止使用
2.2.3 bgsave redis会fork一个子进程进行持久化,不会阻塞redis服务器,使用这个
redis默认是使用bgsave对当前内存中的所有数据做快照,这个操作是子进程在后台完成的,这就允许主进程同时可以修改数据
2.2.4 lastsave 获取上一次持久化的时间戳
2.2.5 date -d @时间戳 根据时间戳获取时间(不是在redis服务器中,在linux中,redis命令不区分大小写,linux命令区分)
2.2.6 rdb优点
- 适合大规模的数据恢复
- 可以定时备份(redis.conf 中的save可以指定备份时间和频率)
- rdb文件再内存中的加载速度要比aof快得多
2.2.7 rdb缺点
- rdb持久化需要满足一定的时间条件,如果在不满足条件时redis服务器宕机了,就会发生数据丢失的问题
2.2.8 redis宕机,rdb未持久化,丢失数据
之前设置的是5秒内两次修改会自动触发rdb持久化(shutdown,redis-server /myredis/redis7.conf重启都会自动触发持久化,kill不会)
2.2.9 /usr/local/bin/redis-check-aof /myredis/dumpfiles/dump6379.rdb 修复rdb文件
2.2.10 总结触发rdb快照的情况有哪些
- 配置文件中默认的快照配置
- 手动执行save/bgsave命令
- 执行flush/flushall命令也会产生dump.rdb文件,但文件是空的
- 执行shutdown且没有设置开启aof持久化
- 主从复制时,主节点自动触发
2.2.11 禁用快照(rdb)
- redis-cli config set save “” redis-server重启就会失效(重新执行redis-server redis.conf并不会重启redis-server,除非redis-server进程已经不存在,不过这种情况应该叫启动而不是重启)
- 配置文件修改(建议使用这种方式)
2.2.12 redis.conf snapshotting模块的参数介绍
- stop-writes-on-gbsave-error
- rdbcompression
- rdbchecksum
- rdb-del-sync-files
2.2.13 rdb总结
3. AOF(Append-only file)
3.1 以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(读操作不记录)
只追加文件,不可以改写文件
3.2 aof持久化工作流程
3.3 aof缓冲区内容同步到aof持久化文件的三种策略
- always 同步写回,命令到达redis-server,然后到达redis缓冲区,就直接将写命令落入磁盘
- everysec(默认策略) 每秒写回,每秒钟一次将缓冲中的内容写入磁盘
- no 不是不持久化,而是持久化时机由操作系统控制
3.4 修改配置文件redis.conf
3.4.1 开启aof
3.4.2 使用默认写回策略
3.4.3 持久化文件保存路径
- redis6版本,aof和rdb都是dir
- redis7版本,rdb还是dir,aof是变成dir的路径+appenddirname的路径
所以路径是/myredis/dumpfiles/appendonlydir/
3.4.4 更改aof持久化文件的名称
-
redis6版本,aof是
-
redis7版本,aof文件采用multi part aof的设计,由三个文件组成
这三个文件的名称前缀还是appenddirname的值
base是基础;incr是增量;base和incr会变成history,会自动删除,我们感知不到;manifest文件来跟踪管理这些aof文件
3.4.5 重启redis-server,5秒内修改2条或以上此数据
rdb和aof持久化文件都会改变
3.4.6 日常修改命令,会改变aof文件中的incr文件
3.4.7 rdb和aof同时存在时,可以将rdb的文件删除,aof文件可以写回到磁盘中做数据恢复
3.5 破坏aof三个文件中日常频繁使用到的incr.aof文件,将会导致redis-server无法正常启动
- 关机
- 修改incr.aof文件
- 重启redis-server
- 发现重启失败
3.6 redis-check-aof --fix appendonly.aof.1.incr.aof 修复文件
- redis-check-aof --fix appendonly.aof.1.incr.aof (–fix必须加,否则没法删除掉incr中的错误命令)
- 发现incr中的错误命令被删除了
- 发现修复后服务可以启动成功了
3.7 aof优点
- 数据同步好:默认同步策略是1秒钟将缓冲区的写命令写入磁盘一次,所以最多也就丢失一秒钟的数据
- 假如不小心执行了flushdb或flushall,则只需要将incr.aof文件中的这个命令删除即可恢复原来的数据,这点rdb做不到
3.7 aof缺点
- aof文件通常比相同数据量的rdb文件大
- aof比rdb慢(感觉应该是rdb直接是二进制文件,而incr.aof文件是普通的文本文件,当然注意原因还是实现原理不同)
3.8 aof重写机制:启动aof文件的内容压缩,只保留可以恢复数据的最小指令集
案例:
set name xiaohua
set name xiaohua1
set name xiaohua2
就可以重写为
set name xiaohua2
3.8.1 触发aof文件重写的条件
3.8.1.1 aof文件重写自动触发
手动触发:bgrewriteaof
-
关闭aof和rdb的混合模式
-
这种时候rdb和aof同时开启,但只有rdb持久化文件会更新
-
若只删除rdb持久化文件,aof持久化文件可以恢复数据:
-
但是将rdb和aof持久化文件全部删除,重启redis-server,则只会生成aof持久化文件,但是执行命令后还是会生成rdb文件
-
新增命令:
-
aof自动重写,会将重写后的命令放入base和incr中,base是基础数据,非最新一次的命令,incr是轻量级的,是最新一次redis-cli连接redis-server执行的命令
3.8.1.2 aof文件重写手动触发:bgrewriteaof
3.8.1.3 aof文件重写原理
## 3.9 配置文件redis.conf append only模块参数介绍
3.10 aof小总结
4. RDB+AOF混合持久化
4.1 支持两者共存,混合使用,默认开启rdb,但开启aof后,他俩可以共存,只是aof优先级更高;
4.2 在同时开启rdb和aof持久化时,重启时只会加载aof文件,不会加载rdb文件
4.2 推荐使用rdb+aof的混合模式
结合了RDB和AOF的优点,既能快速加载又能避免丢失过多的数据。
5. No Persistence(纯缓存模式)
5.1 禁用rdb: save “” 但仍可以使用命令save、bgsave生成rdb文件,等再次开启rdb,就可以使用rdb文件恢复数据了
5.2 禁用aof:appendonly no 但仍可以使用命令bgrewriteaof生成aof文件,等再次开启aof,就可以使用aof文件恢复数据了
6. 查看redis配置
6.1 config get requirepass 查看redis密码
6.2 config get port 查看端口
6.3 config get dir 查看保存rdb文件的目录路径
6.4 不可以将dump.rdb的备份文件和redis服务器放在同一台机器,必须分开存储,以防机器损坏后备份文件也没了
初识Redis系列之一:简单介绍
一:Redis是什么?
Redis全称:REmote DIctionary Server(Redis) 。Redis是一个由Salvatore Sanfilippo写的key-value存储系统,ANSI C语言编写;
特点:开源免费、单线程、大并发、遵守BSD协议、支持网络、可基于内存亦可持久化、高性能的key-value数据库、提供多种语言的API
1:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
2:Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
3:Redis支持数据的备份,即master-slave模式的数据备份;
二:Redis与其他key-value存储有什么不同?
1:Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象;
2:Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问;
三:Redis的优劣势有哪些?
优势:
1:性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s ;
2:丰富的数据类型:Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作;
3:原子性:Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行;
4:丰富的特性:Redis还支持 publish/subscribe, 通知, key 过期等等特性;
劣势:
1:数据量过大影响使用,毕竟数据是装在内存中;
2:不具备自动容错和恢复功能;
以上是关于Redis简单介绍2-持久化的主要内容,如果未能解决你的问题,请参考以下文章