Docker——Redis

拉取 Redis 镜像

在终端或中运行以下命令来拉取最新的 Redis 官方镜像:

复制代码
docker pull redis

运行 Redis 容器

使用命令启动一个 Redis 容器:

复制代码
docker run --name r1 -d redis

连接到 Redis 容器

可以使用 Docker 命令进入 Redis 容器内部,然后使用 Redis CLI 来与 Redis 实例进行交互:

复制代码
docker exec -it my-redis redis-cli

字符串(String)

字符串是最基础的数据类型,也是 Redis 的默认数据类型。

SET:设置键值对。

复制代码
SET key value

示例:

复制代码
SET name "Alice"

GET:获取键对应的值。

复制代码
    
复制代码
GET key

示例:

复制代码
GET name

哈希(Hash)

哈希是用于存储字段和字段值的映射表,适合存储对象。

HSET:设置哈希表中的字段值。

复制代码
HSET hash field value

示例:

复制代码
HSET user:1000 name "Alice"

HGET:获取哈希表中指定字段的值。

复制代码
HGET hash field

示例:

复制代码
HGET user:1000 name

HGETALL:获取哈希表中所有的字段和值。

复制代码
HGETALL hash

列表(List)

列表是一个简单的字符串列表,按照插入顺序排序。可以从列表的两端进行添加或移除元素。

LPUSH:在列表的左侧插入一个或多个值。

复制代码
LPUSH list value [value ...]

示例:

复制代码
LPUSH mylist "a" "b"

LRANGE:获取列表中指定范围的元素。

复制代码
LRANGE list start stop

示例:

复制代码
LRANGE mylist 0 -1

集合(Set)

复制代码
SADD myset "hello" "world"

集合是一个无序不重复元素的集合。

SADD:向集合中添加一个或多个成员。

复制代码
SADD set member [member ...]

示例:

复制代码
SADD myset "hello" "world"

SMEMBERS:返回集合中的所有成员。

复制代码
SMEMBERS set

有序集合(Sorted Set)

有序集合类似于集合,但每个成员都关联了一个分数,这使得成员可以根据分数来排序。

ZADD:向有序集合中添加一个或多个成员,或者更新已存在成员的分数。

复制代码
ZADD zset score member [[score member] [score member] ...]

示例:

复制代码
ZADD myzset 1 "one"

ZRANGE:返回有序集中指定区间内的成员,按分数值递增排序。

复制代码
ZRANGE zset start stop [WITHSCORES]

停止和删除容器

当完成测试后,可以通过以下命令停止并删除容器:

停止容器:

复制代码
docker stop my-redis

删除容器:

复制代码
docker rm my-redis
创建自定义网络
复制代码
docker network create redis-net
启动 Redis Master
复制代码
docker run -d \
  --name redis-master \
  --network redis-net \
  -p 6379:6379 \
  redis
启动 Redis Slave
复制代码
docker run -d \
  --name redis-slave1 \
  --network redis-net \
  redis \
  redis-server --slaveof redis-master 6379
  
docker run -d \
  --name redis-slave2 \
  --network redis-net \
  redis \
  redis-server --slaveof redis-master 6379

查看当前的主从状态

可以通过以下命令进入任意一个 Redis 实例来查看其角色(Master 或 Slave)。

检查 Redis Master 状态
复制代码
docker exec -it redis-master redis-cli
​
INFO replication

应该会看到类似下面的输出,表明这是 Master 节点并且有一个或多个 Slave 连接到它:

复制代码
# Replication
role:master
connected_slaves:1
slave0:ip=...,port=6379,state=online,offset=...,lag=1
...
检查 Redis Slave 状态

同样地,在 Slave 上执行相同命令:

复制代码
docker exec -it redis-slave redis-cli
INFO replication

会看到类似于以下内容,表明它是某个 Master 的 Slave:

复制代码
# Replication
role:slave
master_host:redis-master
master_port:6379
...
配置并启动 Sentinel

配置 sentinel.conf 文件,内容如下:

复制代码
port 26379
dir /tmp
sentinel monitor mymaster redis-master 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
配置项 含义 示例值
port Sentinel 监听的端口 26379
dir Sentinel 工作目录 /tmp
sentinel monitor 监控的主节点信息 mymaster redis-master 6379 1
sentinel down-after-milliseconds 多久没响应视为下线 5000 ms
sentinel failover-timeout 故障转移最大等待时间 10000 ms
sentinel parallel-syncs 同步新 Master 的 Slave 并发数 1

然后运行 Sentinel 容器:

复制代码
docker run -d \
  --name redis-sentinel \
  --network redis-net \
  -p 26379:26379 \
  -v $(pwd)/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
  redis \
  redis-sentinel /usr/local/etc/redis/sentinel.conf

手动触发故障转移

现在让我们模拟 Master 故障的情况。停止 Redis Master 容器:

复制代码
docker stop redis-master

等待几秒钟后,检查 Sentinel 是否已经将其中一个 Slave 提升为新的 Master。可以通过连接到 Sentinel 来查询当前的 Master:

复制代码
docker exec -it redis-sentinel redis-cli -p 26379
​
SENTINEL get-master-addr-by-name mymaster

如果一切正常,应该得到新 Master 的 IP 地址和端口。

验证故障转移后的状态

再次使用 INFO replication 命令分别检查原 Slave(现在应该是新的 Master)和其他 Slave 的状态,确保它们都正确地进行了角色转换。

对于新的 Master:

复制代码
docker exec -it redis-slave1 redis-cli
​
INFO replication

会发现它的角色变为 role:master

相关推荐
Tim风声(网络工程师)4 小时前
光功率计中的红光(光衰测试设备)的使用
运维·网络
修先生5 小时前
Kubernetes Dashboard 官方图形面板国内安装
云原生·容器·kubernetes
ar01235 小时前
AR电路巡检:让电力运维进入智能可视化时代
运维·人工智能·ar
2301_780789666 小时前
云服务器数据会泄露吗?怎么保护云服务器的数据
运维·服务器·tcp/ip·网络安全
2301_780789666 小时前
云服务器被黑能恢复吗?云服务器被黑的解决办法
运维·服务器·网络·安全·web安全
淘小白_TXB21966 小时前
头条百家采集改写发布软件用户使用手册
运维·服务器·头条采集·头条号采集·文章采集·头条采集软件
极客先躯7 小时前
高级java每日一道面试题-2025年12月07日-实战篇[Dockerj]-Docker daemon 的配置文件在哪里?常用的配置项有哪些?
java·docker·配置文件的实际位置·配置文件的格式规则·常用配置项全景与分类·配置如何生效·daemon 配置折射架构思维
渣渣灰95878 小时前
解决VMware上终端窗口太小问题
运维·服务器·经验分享
Tim风声(网络工程师)8 小时前
QoS (服务质量)和TE(流量工程)的区别
运维·网络
OpsEye9 小时前
企业监控避坑:别再把工具当体系!
运维·运维开发