(1)完成Docker下redis的数据持久化;
(2)自行设计散列(hash)型数据,并针对这些数据执行常用的集合操作。
持久化可以理解为数据的永久存储,就是将数据存储到一个不会丢失的地方。如果
把数据放在内存中,电脑关闭或重启数据就会丢失,所以放在内存中的数据不是持久化 的,而放在磁盘就是一种持久化。
Redis 提供了2个不同形式的持久化方式。

AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
RedisDatabase(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁
盘。当 Redis 实例故障重启后,从磁盘读取快照文件,恢复数据
快照文件称为 RDB 文件,保存了在某个时间点的全部数据,默认是保存在当前运行
目录,默认文件名是 dump.rdb,该文件会自动创建。
RDB 技术非常适合做数据备份,可以保存最近一个小时,一天,一个月的全部数据。
保存数据是在单独的进程中写文件,不影响 Redis 的正常使用

RDB 持久化在四种情况下会执行:

可以通过lastsave命令获取最后一次成功执行快照的时间
Append-only File(AOF),Redis 每次接收到一条 更新 数据的命令时,它将把该命
令写到一个 AOF 文件中(只记录写操作,读操作不记录),只许追加文件但不可以改写文件。当 Redis 重启时,它通过执行 AOF 文件中所有的命令来恢复数据。换言之,redis 重启的话就根据AOF 文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
默认情况下,AOF 是关闭的,如果要开启需要在redis的配置文件redis.conf中配置:
appendonly yes

Docker 是将系统与运行的环境打包成容器来运行,当容器删除后,容器里的系统自然也就没有了。但是,在实际的项目中,希望 Docker容器产生的数据能够持久化,同时容器之间也能够共享数据。Docker提供了数据卷技术来实现这些需求。
数据卷就是目录或文件,存在于一个或多个容器中,由 Docker 挂载到容器上,完全独立于容器的生存周期,Docker不会在容器删除时删除其挂载的数据卷。即容器删除 了,数据卷仍然存在,从而实现了容器数据的持久化。
创建启动容器时,使用–v 参数来设置数据卷
语法:docker run -v /宿主机绝对路径目录:/容器内目录 镜像名.....
以在本实验中新建的redis_2容器使用的命令为例(我的Docker是在Linux环境下运行的,不过在Windows的操作也差不多的):
docker run --name redis_2 -p 6381:6379 --privileged=true \
-v /redis_2_data/redis/data:/data \
-v /redis_2_data/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
命令解释:
docker run --name redis_2:创建一个新的redis容器命名为redis_2
-p 6381:6379:在容器的6379端口与宿主机的6381端口创建映射
–privileged=true:使当前用户在容器内操作时,具有 root 权限
-v /redis_2_data/redis/data:/data:将容器内的/data目录与宿主机中的/redis_2_data/redis/data进行挂载
-v /redis_2_data/redis/conf/redis.conf:/etc/redis/redis.conf:将容器内的配置文件/etc/redis/redis.conf与宿主机的/redis_2_data/redis/conf/redis.conf进行挂载
-d:使容器在后台运行,并返回容器ID
redis redis-server /etc/redis/redis.conf:使容器内 redis 启动时,读取配置文件
我的Docker是在Linux环境下运行的,不过在Windows的操作也差不多的
- 挂载一个data数据卷,用于保存备份数据;
- 使用AOF方法,在配置文件中修改,并将该配置文件挂载到redis容器上;
- 显示备份出来的aof文件;
- 模拟服务器故障,重启后,利用aof文件恢复了数据。
这里如果是用Windows版的话,直接根据实验指导里面在文件管理器中创建相关目录,将老师给的redis.conf复制粘贴到对应的地方就可以了
先在宿主机内创建/redis_2_data/redis/conf目录和/redis_2_data/redis/conf/redis.conf文件:
使用命令:
mkdir -p /redis_2_data/redis/conf
touch /redis_2_data/redis/conf/redis.conf

新建容器使用的命令:
docker run --name redis_2 -p 6381:6379 --privileged=true \
-v /redis_2_data/redis/data:/data \
-v /redis_2_data/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
命令解释:
docker run --name redis_2:创建一个新的redis容器命名为redis_2
-p 6381:6379:在容器的6379端口与宿主机的6381端口创建映射
–privileged=true:使当前用户在容器内操作时,具有 root 权限
-v /redis_2_data/redis/data:/data:将容器内的/data目录与宿主机中的/redis_2_data/redis/data进行挂载
-v /redis_2_data/redis/conf/redis.conf:/etc/redis/redis.conf:将容器内的配置文件/etc/redis/redis.conf与宿主机的/redis_2_data/redis/conf/redis.conf进行挂载
-d:使容器在后台运行,并返回容器ID
redis redis-server /etc/redis/redis.conf:使容器内 redis 启动时,读取配置文件
宿主机内data目录(/redis_2_data/redis/data):

因为此时还未开启 AOF 持久化模式,且还未写入过数据,所以此时该目录中没有appendonly.aof 文件和 dump.rdb文件
容器内data目录(/data):
使用docker exec -it redis_2 /bin/bash命令进入容器内,并查看/data目录:

可以看到此时容器内的/data目录也为空
宿主机内的/redis_2_data/redis/conf/redis.conf文件:

也为空
容器内的/etc/redis/redis.conf文件:

可以看到此时宿主机和容器内的配置文件均为空
使用redis-cli.exe连接redis容器(命令:docker exec -it 容器名 redis-cli,比如我的这个就是docker exec -it redis_2 redis-cli),写入数据,执行save命令:

宿主机内(/redis_2_data/redis/data):

容器内:

可见两个data目录中都有dump.rdb文件了
重启该容器:
docker restart 容器名
比如我的是docker restart redis_2

查看数据是否成功恢复:

可以看到数据已成功恢复
要求将配置文件配置为:
port 6380
save ""
appendonly yes
databases 10
#requirepass a123
使用vim对redis.conf进行编辑:

重启容器:
docker restart 容器名
比如我的是docker restart redis_2

可以看到重启容器后,容器内的redis.conf也成功修改了:

在文件管理器中找到redis文件夹中的redis.conf文件,用老师给的那个配置文件进行替换
配置好后在docker中重启容器:
docker restart 容器名
比如我的是docker restart redis_2
可以看到此时宿主机(/redis_2_data/redis/data)内出现了appendonly.aof 文件:

容器(/data)内也出现了appendonly.aof 文件:

测试redis_2容器内redis的端口是否改到了6380:
使用redis-cli.exe连接redis容器指定端口(命令:docker exec -it 容器名 redis-cli 端口号,比如我的这个就是docker exec -it redis_2 redis-cli 6380)

测试数据库是否修改成了只有10个(0-9):

可以看到,redis.conf配置已成功生效
先写入几个数据:

重启redis_2容器:
docker restart redis_2

使用 redis-cli.exe 连接 redis_2 容器:
docker exec -it redis_2 redis-cli 6380
查看键值对是否存在:

可以看到数据成功恢复
Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储
主要有以下2种存储方式:
而使用Hash方法:








(


