• Redis持久化


    介绍

    持久化技术就是将瞬时数据(不如内存中的数据)转化为持久化数据(比如硬盘中的数据)。Redis支持两种方式的持久化,RDB方式和AOF方式,前者会按照指定的规则定时将内存中的数据存储在硬盘中,后者会将执行的命令记录下来,存储在命令中。

    RDB持久化

    RDB持久化就是通过快照完成的,当符合一定条件的时候(可以通过参数配置)Redis会自动将内存的数据生成一份副本并存储在硬盘中,这个过程称为快照,Redis会在以下几种情况对数据进行快照

    • 根据参数配置进行自动快照
    • 执行SAVE或BGSAVE
    • 执行FLUSHALL
    • 执行复制(replication)

    根据参数配置进行自动持久化

    参数配置可以在redis.conf中进行查看或修改

    save 60 10000表示的是在60秒内如果有10000个键发生改变,则自动触发快照。触发条件可写多条,从下至上依次判断是否触发。
    与RDB有关的配置项还有
    stop-writes-on-bgsave-error yes#如果在进行RDB快照的时发生存储错误,Redis是否停止写操作
    rdbcompression yes#是否对快照文件进行LZF压缩
    rdbchecksum yes#存储和加载快照文件的时候是否进行校验
    dbfilename dump.rdb#快照文件名字
    dir ./#快照文件所在目录,相对于redis.conf文件

    如果想检验RDB快照功能,可以通过Redis提供的redis-benchmark进行测试。redis-benchmark -h hostname -p port -n requests

    执行SAVE或BGSAVE

    执行SAVE或BGSAVE命令,都可以触发Redis进行快照操作
    1)SAVE在执行快照操作的过程中会阻塞Redis主进程,需要等RDB执行完成后才会执行来自客户端的命令
    2)执行BGSAVE命令后,服务器会立即返回ok,然后fork一个子进程,然后专门来执行RDB操作,不会阻塞从所有来自客户端的命令

    执行FLUSHALL

    当执行FLUSHALL命令时,Redis会清空数据库中的所有数据,只有redis.conf中的快照触发条件不会空,就一定会触发快照操作,不管当前条件是否满足触发条件。

    执行复制(replication)

    当设置主从复制的时候,Redis会在复制初始化时进行自动快照,同时即使没有定义自动快照条件或没有手动快照操作,也会生成RDB快照文件。

    AOF持久化

    默认情况下Redis是没有开启AOF(append only file)持久化的,可以在redis.conf中开启,同时也可以在redis.conf中选择AOF的模式

    appendonly no#是否开启AOF持久化
    appendfilename appendonly.aof#文件名
    AOF不需要指定目录,RDB和AOF的保存目录是相同的,通过dir来设置
    appendfsync always#每有一条命令执行,就同步到AOF文件,安全但速度慢
    appendfsync everysec#每秒同步一次到AOF文件
    appendfsync no#写入工作交给操作系,由操作系统判断缓冲区大小,统一写入到AOF文件,同步频率低但速度快
    与AOF有关的配置项还有
    no-appendfsync-on-rewrite no#正在导出RDB快照的过程中,是否停止AOF同步
    auto-aof-rewrite-percentage 100#当AOF文件比起上次重写,文件大小增长了100%,执行重写
    auto-aof-rewrite-min-size 64mb#当AOF文件超过了64MB,执行重写
    aof-load-truncated yes#Redis在启动的时候可以加载被截断的AOF文件

    AOF重写

    AOF文件通过同步 Redis服务器所执行的命令,从而实现了数据库状态的记录,但是,这种同步方式会造成一个问题: 随着运行时间的流逝,AOF 文件会变得越来越大。为了解决这个的问题,Redis 需要对AOF文件进行重写(rewrite):创建一个新的AOF文件来代替原有的AOF文件,新AOF文件和原有AOF文件保存的数据库状态完全一样,但新AOF文件的体积小于等于原有AOF文件的体积。

    手动触发AOF重写BGREWRITEAOF

    在平常的使用中如果误操作了FLUSHALL, 应立即SHUTDOWN NOSAVE,并关闭服务器,然后手动编辑AOF文件,去掉文件中的FLUSHALL相关行, 然后开启服务器,然后就可以导入回原来数据。但是如果FLUSHALL后,恰好触发了AOF的重写机制,那么数据就彻底丢失了
    为了避免这种误操作的发生,在线上环境中应该禁用掉FLUSHALLFLUSHDB
    在redis.conf中写入
    rename-command FLUSHALL ""
    rename-command FLUSHDB ""
    然后重启Redis

  • 相关阅读:
    数据库锁机制
    spring的事务传播行为与隔离级别
    Logback+ELK+SpringMVC搭建日志收集服务器
    提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
    有状态的bean和无状态的bean的区别
    浅谈Spring解决循环依赖的三种方式
    某类继承thread,同时实现runnable
    java动态代理
    缓存一致性
    Elasticsearch系列(一)--入门
  • 原文地址:https://www.cnblogs.com/helbing/p/5248458.html
Copyright © 2020-2023  润新知