为了避免当虚拟机关机后redis数据丢失的情况,redis需要持久化。所以要挂载数据卷
- 创建数据和配置存放的目录
[root@192 data]# pwd
/root/data
[root@192 data]# mkdir -p /root/data/redis/conf && chmod 777 /root/data/redis/conf
[root@192 data]# mkdir -p /root/data/redis/data && chmod 777 /root/data/redis/data
- 下载配置文件
[root@192 conf]# cd /root/data/redis/conf
[root@192 conf]# wget http://download.redis.io/redis-stable/redis.conf
--2024-06-04 03:49:40-- http://download.redis.io/redis-stable/redis.conf
正在解析主机 download.redis.io (download.redis.io)... 45.60.125.1
正在连接 download.redis.io (download.redis.io)|45.60.125.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:107512 (105K) [application/octet-stream]
正在保存至: “redis.conf”100%[======================================================================================>] 107,512 62.0KB/s 用时 1.7s 2024-06-04 03:49:42 (62.0 KB/s) - 已保存 “redis.conf” [107512/107512])[root@192 conf]#
- 修改配置文件,改成下面这样
[root@192 conf]# vi redis.conf
[root@192 conf]# cat redis.conf
# 设置 redis 连接密码
requirepass root# 【数据持久化配置 - 开始】
# 开启 AOF 持久化
appendonly yes# AOF文件刷新的方式
# always 每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全。
# everysec 每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据。
# no 依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差。
appendfsync everysec# 随着持久化的不断增多,AOF文件会越来越大,这个时候就需要AOF文件重写了。AOF文件重写
# 如果该参数取值为yes,那么在重写AOF文件时能提升性能,但可能在重写AOF文件时丢失数据。
# 如果取值为no,则不会丢失数据,但较取值为yes的性能可能会降低。默认取值是no。
no-appendfsync-on-rewrite no# AOF文件重写
# 参数能指定重写的条件,默认是100,
# 即如果当前的AOF文件比上次执行重写时的文件大一倍时会再次触发重写操作。
# 如果该参数取值为0,则不会触发重写操作。
auto-aof-rewrite-percentage 100# AOF文件重写
# 指定触发重写时AOF文件的大小,默认是64MB。
auto-aof-rewrite-min-size 64mb# auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 两个参数指定的重写条件是“And”的关系。
# 即只有当同时满足这两个条件时才会触发重写操作。# 【数据持久化配置 - 结束】# 绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址。
# 这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接。
# 如果bind选项为空的话,那会接受所有来自于可用网络接口的连接。
# bind 172.0.0.4 127.0.0.1
# bind 127.0.0.1 -::1#默认yes,开启保护模式,限制为本地访问,改为no,允许接受其他主机连接此redis。
protected-mode no# Redis key 过期事件监听
notify-keyspace-events Ex[root@192 conf]#
- 下载镜像
docker pull redis:6.2.1
- 运行容器
# 自定义启动 redis
docker run -d \
-p 6379:6379 \
--restart=always \
--name redis \
-v /root/data/redis/data:/data \
-v /root/data/redis/conf/redis.conf:/etc/redis/redis.conf \
redis:6.2.1 \
redis-server /etc/redis/redis.conf \
--appendonly yes
- 进入容器内部测试
[root@192 conf]# docker exec -it redis bash
root@b2ab04476b44:/data# redis-cli
127.0.0.1:6379> set k1 v1
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth root # 这里和redis.conf中配置的密码一致
OK
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>
- 关虚拟机重启,启动redis看看有没有持久化
[root@192 ~]# systemctl start docker
[root@192 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2ab04476b44 redis:6.2.1 "docker-entrypoint.s…" 7 minutes ago Up 6 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
94618b89f030 mongo:latest "docker-entrypoint.s…" 12 days ago Up 6 seconds 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp mongo-service
ca8714734388 canal/canal-server:v1.1.5 "/alidata/bin/main.s…" 2 weeks ago Up 6 seconds 9100/tcp, 11110/tcp, 11112/tcp, 0.0.0.0:11111->11111/tcp, :::11111->11111/tcp canal
d85264eb9c37 quay.io/minio/minio "/usr/bin/docker-ent…" 5 weeks ago Up 7 seconds minio1
[root@192 ~]# docker exec -it redis bash
root@b2ab04476b44:/data# redis-cli
127.0.0.1:6379> get k1
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth root
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> exit
root@b2ab04476b44:/data# exit
exit
[root@192 ~]#
[root@192 ~]# cd /root/data/redis/data
[root@192 data]# ls
appendonly.aof
发现键值对k1 v1仍然存在,说明已经持久化,且数据卷中新增了文件appendonly.aof。
- redis远程连接工具