zoukankan      html  css  js  c++  java
  • redis持久化存储

    redis持久化存储

    redis多被用于缓存和消息中间件,当被用作缓存时,数据的读写都是在内存中进行的,而内存一旦在主机断电或者主机重启时里面的数据将被清空,为保证数据不被丢失,redis为我们提供两种数据持久化存储方式:RDB,AOF。

    RDB持久化存储

    RDB持久化是按配置文件中指定的时间间隔,每隔一段时间将当前进程生成数据保存到硬盘名为xx.rdb的二进制文件中。我们也可以手动使用save或者bgsave命令,将新生成的数据手动保存到硬盘的xx.rdb二进制文件中。

    save命令:使用save命令要注意,它会阻塞当前redis服务器,直到RDB将数据全部保存到xx.rdb文件中为止,如果是线上环境不建议使用该命令。

    使用save命令RDB存储过程如下:

    • 1、用户执行save命令触发RDB存储。
    • 2、redis主进程执行RDB存储,程序当前处于阻塞状态。
    • 3、拷贝xx.rdb到一个临时文件中。
    • 4、将新增的数据写入到xx.rdb的临时文件中。
    • 5、将xx.rdb的临时文件覆盖原来的xx.rdb文件。
    • 6、RDB存储结束,响应其它用户请求。

    bgsave命令:redis进程会创建一个子进程,RDB的存储过程是由子进程来负责完成的,完成后自动退出子进程,阻塞只发生在创建子进程这个阶段,因此时间很短,不会影响主进程。

    使用save命令RDB存储过程如下:

    • 1、用户执行bgsave命令触发RDB存储。
    • 2、redis主进程先检查当前是否有子进程,如果当前有子进程将不会执行本次操作。如果没有子进程,创建子进程。
    • 3、子进程执行RDB存储,主进程响应用户请求。
    • 4、子进程拷贝xx.rdb到一个临时文件中。
    • 5、子进程将新增的数据写入到xx.rdb的临时文件中。
    • 6、子进程将xx.rdb的临时文件覆盖原来的xx.rdb文件。
    • 7、RDB存储结束,子进程退出。

    AOF持久化存储

    AOF(append only file 仅追加模式):它是以写日志的方式,将每次写命令追加到xx.aof文件中,当设备断电或重启时,redis server会执行xx.aof文件中记录的命令,通过此种方式实现恢复数据的目的。

    AOF持久化存储过程如下:

    1、所有写入命令会追加到aof_buf的缓冲区中。
    2、AOF根据配置文件中的策略向硬盘的xx.aof文件中追加命令。

    对比RDB和AOF

    1、RDB是以二进制的方式将数据保存到文件中,AOF是以文本的形式将数据保存在文件中,因此AOF生成的文件会比RDB生成的文件要大的多。
    2、RDB是redis server通过子进程来执行持久化存储的,并且RDB是以全量的方式进行保存,因此执行RDB的时间间隔不宜太频繁,否则会影响性能,这样便存在一个空档期,当在这个空档期发生断电或者系统重启时会出现丢失数据的情况。AOF当有写入时,将写入的命令记录到xx.aof文件中,因此它能更好的保证数据不丢失。
    3、数据恢复:RDB的方式redis server直接读取xx.rdb文件到内存中,AOF的方式redis server读取xx.aof文件,通过执行文件中的命令的方式来实现数据恢复,因此它的数据恢复速度相比于RDB的方式要慢。

    RDB存储实例

    由于是演示,这里的配置文件也就进行了简单设置,我的配置文件内容如下:

    # 安装redis
    [root@zabbix-server ~]# wget -P /opt/source/ http://download.redis.io/releases/redis-5.0.4.tar.gz
    [root@zabbix-server ~]# tar -zxvf /opt/source/redis-5.0.4.tar.gz -C /opt/
    [root@zabbix-server ~]# cd /opt/redis-5.0.4/
    [root@zabbix-server redis-5.0.4]# make && make install  //默认在/usr/local/bin所以就不用我们设置环境变量了
    
    # 创建工作目录
    [root@zabbix-server ~]# mkdir /opt/redis-5.0.4/redis_config/  # 存放配置文件的目录
    [root@zabbix-server ~]# mkdir /opt/redis-5.0.4/data/  # 日志,RDB,AOF等数据的存储目录
    
    # 自定义配置文件
    [root@zabbix-server ~]# vim /opt/redis-5.0.4/redis_config/rdb_config.conf 
    bind 192.168.10.100    # 本机地址
    port 9000              # 绑定端口
    daemonize yes          # 后台运行
    dir /opt/redis-5.0.4/data/  # redis数据存放的目录
    dbfilename rdb_data.rdb     # RDB文件的名字
    # 格式是:save <seconds> <changes> ,含义是在 seconds 秒之后至少有 changes个keys 发生改变则保存一次
    save 900 1  # 900秒后如果有一个KEY发生了变化触发RDB
    save 300 10
    save 60 10000

    验证配置

    运行redis服务

    [root@zabbix-server ~]# redis-server /opt/redis-5.0.4/redis_config/rdb_config.conf

    如果服务运行成功你会看到如下:

    登录redis数据库,并写入数据。

    [root@zabbix-server ~]# redis-cli -h 192.168.10.100 -p 9000  # 登录redis
    192.168.10.100:9000> ping  # 检测连接 
    PONG
    192.168.10.100:9000> set name XiaoMing  # 向数据库中添加数据
    OK
    192.168.10.100:9000> set age 12
    OK
    192.168.10.100:9000> keys *             # 查看添加后的数据
    1) "age"
    2) "name"
    192.168.10.100:9000> get name
    "XiaoMing"
    192.168.10.100:9000> get age
    "12"
    192.168.10.100:9000> save   # 手动触发RDB
    OK
    192.168.10.100:9000> 

    使用kill结束redis server

    [root@zabbix-server ~]# kill -9 redis server的PID

    如果执行成功你会看到如下:

    验证 一: 到/opt/redis-5.0.4/data/目录下查看是否生成了rdb_data.rdb 文件

    验证 二:重新运行redis server服务,验证数据是否丢失

    到此RDB持久化存储就简单介绍到这里,关于RDB持久化存储需要注意的就是配置文件中的save那个选项。

    [root@zabbix-server ~]# vim /opt/redis-5.0.4/redis_config/rdb_config.conf 
    bind 192.168.10.100    # 本机地址
    port 9000              # 绑定端口
    daemonize yes          # 后台运行
    dir /opt/redis-5.0.4/data/  # redis数据存放的目录
    dbfilename rdb_data.rdb     # RDB文件的名字
    # 格式是:save <seconds> <changes> ,含义是在 seconds 秒之后至少有 changes个keys 发生改变则保存一次,这个是redis默认给的值,我们可以根据具体实际情况自行调整
    save 900 1  # 900秒后如果有一个KEY发生了变化触发RDB
    save 300 10
    save 60 10000

    AOF存储实例

    我的配置文件内如如下:

    [root@zabbix-server ~]# vim /opt/redis-5.0.4/redis_config/aof_config.conf
    bind 192.168.10.100   # 绑定IP地址
    port 9001             # 绑定端口
    daemonize yes
    dir /opt/redis-5.0.4/data/   # redis 的工作目录
    appendfilename aof_data.aof  # AOF文件的名字
    appendonly yes               # 启用AOF持久化存储
    appendfsync everysec         # 可选值always、everysec和no
    # 设置为always时,每次收到命令写入时,都会调用fsync(Linux为调用fdatasync)强制将数据写入到硬盘的xx.aof文件中,
    # 此时会出现阻塞直到数据被完全同步到硬盘的xx.aof中,该模式下可以很好的保证数据不被丢失,但会严重影响redis服务器的性能,很少用。
    # 设置为everysec时,每次收到命令写入时,先调用系统write将数据写入到系统缓冲区中,由单独的线程每秒调用一次fsync(Linux为调用fdatasync)将数据同步到xx.aof文件中,
    # 如果系统在线程还没有调用fsync时会出现数据丢失,推荐使用该模式,该模式是在性能和存储上选用折中的方式,推荐使用。
    # 设置为no时,每次收到命令写入时,先调用系统write将数据写入到系统缓冲区中,后由操作系统负责将缓冲区中的数据写入到xx.aof文件中,
    # 这个周期是在30秒以内,该模式是性能最好,但是不能很好的保证数据不被丢失,不推荐使用。
    
    # AOF是向xx.aof文件追加写命令,因此文件会越来越大,并且有可能会有重复的命令,因此需要对xx.aof文件进行重写去掉重复的命令,来减小文件的体积。
    auto-aof-rewrite-min-size 64mb   # AOF文件初始最小值
    auto-aof-rewrite-percentage 100  # 当前AOF文件大小是上一次重写后的AOF文件大小的2倍后,进行重写

    启动redis 服务

    [root@zabbix-server ~]# redis-server /opt/redis-5.0.4/redis_config/aof_config.conf 

    登录redis写入数据

    [root@zabbix-server ~]# redis-cli -h 192.168.10.100 -p 9001  # 登录redis
    192.168.10.100:9001> ping   # 查看链接状态
    PONG
    192.168.10.100:9001> keys *  # 查看数据库中的键
    (empty list or set)
    192.168.10.100:9001> set test HelloWorld  # 添加数据
    OK
    192.168.10.100:9001> set damo HaHaHa
    OK
    192.168.10.100:9001> keys *  # 查看添加后的数据
    1) "test"
    2) "damo"
    192.168.10.100:9001> get test
    "HelloWorld"
    192.168.10.100:9001> get damo
    "HaHaHa"
    192.168.10.100:9001> 

    结束redis服务

    [root@zabbix-server ~]# kill -9  AOF的进程PID # 杀掉AOF的redis服务

    执行完成后你会看到如下:

    验证 一:在/opt/redis-5.0.4/data/下查看是否存在aof_data.aof

    验证 二:登录数据库查看数据是否丢失

    启动redis服务

    [root@zabbix-server ~]# redis-server /opt/redis-5.0.4/redis_config/aof_config.conf 

    登录数据库查看结果

     到此redis持久化存储就简单介绍到这里,关于AOF还有很多配置选项这里就不一一列举了,感兴趣的朋友可以查看配置文件根据具体情况了解更多内容。

  • 相关阅读:
    地址栏中提交中文参数乱码问题
    拼接html字符串时单引号问题
    细线表格的制作
    盒子模型
    盒子间距离的计算规则:
    正则表达式
    轻便+智能:史上最酷恒温器Nest 2.0!
    医疗的未来,是身体控制大权的争夺战
    而立之年话沧桑
    刘晓明大使在《电讯报》的英文原文
  • 原文地址:https://www.cnblogs.com/caesar-id/p/13232897.html
Copyright © 2011-2022 走看看