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 6379docker 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
。