Redis在Docker中的数据持久化是什么意思

发布时间:2021-06-24 09:20:54 作者:chen
来源:亿速云 阅读:177

本篇内容主要讲解“Redis在Docker中的数据持久化是什么意思”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis在Docker中的数据持久化是什么意思”吧!

项目Github地址:github/booklet

Redis 提供了两种不同的持久化方法来将数据存储到硬盘里面。一种方法叫快照(snapshotting,RDB),它可以将存在于某一时刻的所有数据都写入硬盘里面。

另一种方法叫只追加文件(append-only file,AOF),它会在执行写命令时,将被执行的写命令复制到硬盘里面。

这篇文章梳理了Redis两种持久化方法的知识点,并通过Docker + Docker-Compose进行环境的模拟,来进行数据的备份与恢复等操作。

至于测试数据,我通过一个python脚本批量录入三百万条key-value键值对(会消耗719.42M内存,来源于redis-cli info信息),没有python环境的同学,可以使用我在项目里准备的另一个shell脚本

python脚本代码:

# -*- coding: UTF-8 -*-
# file write.py
# author liumapp 
# github https://github.com/liumapp
# email liumapp.com@gmail.com
# homepage http://www.liumapp.com 
# date 2019/9/9
#
import redis

r = redis.Redis(host="127.0.0.1", port=6379, db=0, password="admin123")
print("开始插入三百万条数据,每10万条数据提交一次批处理")
with r.pipeline(transaction=True) as p:
    value = 0
    while value < 3000000:
        print("开始插入" + str(value) + "条数据")
        p.sadd("key" + str(value), "value" + str(value))
        value += 1
        if (value % 100000) == 0:
            p.execute()

RDB

RDB持久化是通过创建快照来获得数据副本,即简单粗暴的直接保存键值对数据内容

要启用RDB(并关闭AOF),我们需要修改Redis的配置文件(./redis_config/redis.conf):

requirepass admin123

save 60 1000
stop-writes-on-bgsave-error no
rdbcompression no
dbfilename dump.rdb

appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

dir /data/

上述配置会通过docker-compose的配置,映射到Redis容器中并启用,具体在下面的实操中介绍

RDB配置说明

上述配置中与RDB相关的配置如下

RDB触发条件

RDB的触发条件会比AOF麻烦,大致可以分为以下几种:

RDB-Docker实操

AOF

AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化。因此,Redis 只要从头到尾重新执行一次AOF 文件包含的所有写命令,就可以恢复AOF文件所记录的数据集。

要启用AOF(并关闭RDB),我们需要修改Redis的配置文件(./redis_config/redis.conf)

requirepass admin123

#save 60 1000
stop-writes-on-bgsave-error no
rdbcompression no
dbfilename dump.rdb

appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

dir /data/

上述配置会通过docker-compose的配置,映射到Redis容器中并启用,具体在下面的实操中介绍

AOF配置说明

上述配置中与AOF相关的配置如下

AOF触发条件

直接根据appendfsync的设置进行触发

AOF重写机制

在上面的配置中,已经通过auto-aof-rewrite-percentage和auto-aof-rewrite-min-size两个参数,简单介绍了Redis的BGREWRITEAOF重写命令

那么,为什么要用AOF重写机制呢?

因为AOF持久化是通过保存被执行的写命令来记录Redis数据库状态的,所以AOF文件随着时系统运行会越来越大

而过于庞大的AOF文件会产生以下不良影响

所以Redis提供了一套AOF重写机制,通过创建一个新的AOF文件来替换掉旧的AOF文件,这两个文件所保存的数据状态是相同的,但新的AOF文件不会包含冗余命令,所以体积会较旧AOF文件小很多

但在实际的使用中,我们需要非常小心,不能让Redis的重写命令执行的过于频繁 (注意:auto-aof-rewrite-percentage的单位是百分比,值越大,重写频率越低,也千万别出现0这种值) 因为BGREWRITEAOF的工作原理和BGSAVE创建快照的工作原理非常相似:Redis会创建一个子进程,然后由子进程负责对AOF文件进行重写,因为AOF文件重写也需要用到子进程,所以快照持久化因为创建子进程而导致的性能问题和内存占用问题,在AOF持久化中也同样存在

更具体的AOF重写工作原理:

BGREWRITEAOF的工作流程图如下所示**(绘图源代码在项目的./articles/bgrewriteaof.puml文件下)**:

Redis在Docker中的数据持久化是什么意思

AOF-Docker实操

总结

RDB跟AOF都可以确保Redis的数据持久化,但各有特点

RDB因为有默认的指令SAVE跟BGSAVE支持,所以比较适合对数据库做全量备份,比如每天凌晨3点开始执行一次BGSAVE

而AOF因为是保存的写命令,因而更适合实时备份,事实上现在企业应用也基本都是采用的AOF

但光是使用了RDB或AOF、甚至两个一起用,也还是不够的

对于一个需要支持可扩展的分布式平台而言,我们还需要提供一套复制备份机制,允许在一个周期内,自动将AOF或者RDB的文件备份到不同的服务器下

这种情况下,我们就需要使用Redis的复制并生成数据副本功能,具体内容我会在下一篇文章进行实操记录

到此,相信大家对“Redis在Docker中的数据持久化是什么意思”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. redis中宕机指的是什么意思
  2. redis指的是什么意思

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

redis docker

上一篇:怎么使用Spring组合自定义的注释mscharhag操作

下一篇:ElementUI Tree树形控件怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》