NoSQL-Redis
服务器和客户端命令
服务器端的指令
# 查询使用手册
redis-server --help
# 查看redis服务进程
ps aux | grep redis
# 杀死redis服务器
sudo kill -9 pid
# 加载指定的配置文件
sudo redis-server /etc/redis/redis.conf
客户端的指令
# 查看使用手册
redis-cli --help
# 连接redis
redis-cli
# ping查看服务器和客户端是否通畅
ping
# select切换当前使用的库0-15,默认为0
select 0
#认证用户
auth 123456
redis 储存的数据格式
key-value 形式
key 不能重复,每个 value 必须有 key
字符串 key-string
哈希 key-hash
列表 key-list
无序集合key-set 不能重复
有序集合key-zset 不能重复
数据库操作
string
最大为 512
# 查看增加,修改指令手册
help set
# 增加,修改key-value
set name itcast
# 查看获取指令手册
help get
# 查看value
get name
# 查看删除指令手册
help del
# 删除
del name
# 设置key有效期
setex name 100 itcast
# 查看有效期的时间
ttl name
# 多行设置
mset address bejing like girls
# 多行查询
mget address like
# 追加
append name lalala
key
所有的数据类型都通用一个 key 语法
# 删除键
del name
# 查看所有的key
keys *
keys a*
# 判断键是否存在
exists name
# 查看键的类型
type name
# 给键设置时间,同样用ttl name 查看时间
expire name 100
hash
哈希数据格式有一个大 key,value 值是 key-value
# 查看hset使用手册
help hset
# 创建,更新
hset person name itcast
# 查询
hget person name
# 多行创建
hmset person age 14 name itcast address beijing
# 多行查询
hmget person name age address
# 使用key 查看value
hgetall person
# 使用key 查看value中的key
hkeys person
# 使用key 查看value中的value
hvals person
# 删除value中的一个
hdel person name
# 删除全部
del person
list
数据类型是 string
# 左插入
lpush class_1 zhangsan3
lpush class_1 lisi4
# 右插入
rpush class_1 wangwu5
# 查看,使用下标查看,从0开始到-1结束
lrange class_1 0 -1
# 移除 count等于0删除全部,
# 大于0左边开始删除,
# 小于0从右边开始删除,
# 删除的个数等于count值
lrem class_1 0 zhansan3
# 指定位置修改
lset class_1 1 liusi4
# 指定位置插入
linsert class_1 before wangwu5 4.5
linsert class_1 after zhangsan3 3.5
set
- 无序集合
- 数据类型是 string
- value 具有唯一性,不重复
- 没有修改操作
# 添加
sadd stu_1 zhangsan3 lisi4
# 查看
smembers stu_1
# 移除
srem stu_1 lisi4
zset
- sorted set 有序集合
- 数据类型是 string
- value 具有唯一性,不重复
- 每个元素会关联一个 double 类型的 score,表示权重,通过权重进行排序
- 没修改操作
# 添加
zadd ordered_set 4 lisi4 3 zhangsan3 5 wangwu5 6 zhangliu6
# 查看
zrange ordered_set 0 -1
# 通过权重查看
zrangebyscore ordered_set 5 6
# 更新
zrange ordered_set 9 zhangsan3
# 删除,双闭
zrem ordered_set zhangsan3
zremrangebyscire ordered_set 1 4
# 查看权重
zscore ordered_set wangwu5
主从服务器
- 一个 master 可以用多个 slave,一个 slave 又可以拥有多个 slave,形成大集群架构
- master 用来写数据,slave 用来读数据,一般网站的读写比是 10:1
- 使用主从配置可以实现读写分离
- master 和 slave 是一个 redis 实例
配置主服务器
# 打开配置文件
sudo vi /etc/redis/redis.conf
# 添加一个
bind 本地ip 127.0.0.1
# Redis使用后台模式
daemonize yes
# 关闭保护模式
protected-mode no
配置从服务器
# 复制一份配置文件
sudo cp /etc/redis/redis.conf /etc/redis/6380.conf
# 打开复制的配置文件
sudo vi /etc/redis/6380.conf
# 修改开启的端口
port 6380
# 修改replicaof,指向主服务器
replicaof 主服务IP 6379
启动主从
# 重启redis服务,更新主服务配置
srevice redis-server restart
# 启动从服务配置
sudo redis-server /etc/redis/6380.conf
# 查看redis的启动项
ps axu|grep redis
# 查看主从关系
redis-cli -h 主服务IP info replication
打开主从客户端
redis-cli -h 主服务IP -p 6379
redis-cli -h 从服务IP -p 6380
集群
软件层面:一台电脑上启动多个 redis 服务
硬件层面:存在多个实体电脑,每台都启动了多个 redis 服务
配置集群
使用多个 ip 进行搭建,也可以通过端口进行区分
# 端口号
prot 7000
# 访问的ip
bind 本地ip
# 守护进程,后台运行
daemonize yes
# pid文件
pidfile 7000.pid
# 是否使用集群
cluster-enabled yes
# 集群文件
cluster-config-file 7000_node.conf
# 集群的超时时间
cluster-node-timeout 15000
# 备份相关内容
appendonly yes
搭建集群
使用 redis 安装包中包含的 redis-trib.rb,进行创建集群
使用命令
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
安装 ruby
sudo apt-get install ruby
运行命令开始自动创建
cd 进入配置文件的路径
# 启动配置文件
sudo redis-server 7000.conf
sudo redis-server 7001.conf
sudo redis-server 7002.conf
sudo redis-server 7003.conf
sudo redis-server 7004.conf
sudo redis-server 7005.conf
# 查看redis的启动项
ps axu|grep redis
# 进行融合
redis-trib.rb create --replicas 1 IP地址:7000 IP地址:7001 IP地址:7002 IP地址:7003 IP地址:7004 IP地址:7005
windows下使用docker创建ubuntu容器搭建redis集群
使用redis的三主三从配置,因此创建3个容器,每个容器创建两个redis服务,三个容器相互备份
- windows下安装docker
- 配置并安装ubuntun镜像
- 在命令行输入
docker pull ubuntu,下载ubuntun镜像 - 使用yml脚本配置docker容器,创建
docker-compose.yml文件,内容如下
version: '3.8' # 版本号 networks: # 网络配置 redis-cluster-net: # 网络名称,这里是一个叫redis-cluster-net的网络 driver: bridge # 网络类型,这里使用桥接 ipam: # ip地址配置 config: - subnet: 172.20.0.0/24 # 子网,都放入172.20.0.0/24这个子网 services: # 容器配置 redis-node-1: # 容器名称 image: ubuntu:24.04 # 镜像名称 container_name: ubuntu-1 # 容器别名 tty: true # 开启终端 privileged: true # 开启特权模式,可以操作宿主机 volumes: # 挂载目录 - D:\Virtual environment\Docker\redis:/scripts # 宿主机目录:容器目录,将宿主机目录下文件夹挂载到容器中 networks: # 网络配置 redis-cluster-net: # 网络名称,容器使用这个网络 ipv4_address: 172.20.0.10 # ip分给容器 ports: # 端口映射 - "6379:6379" # 宿主机端口:容器端口,将宿主机端口映射到容器端口 - "6380:6380" # 这是redis集群的配置,每个节点需要两个端口,一个用于redis服务,一个用于redis集群 - "16379:16379" # redis集群使用服务端口+1000作为节点间通信端口 - "16380:16380" # 这里的是将每个容器的redis都使用6379和6380端口,但是映射到宿主机上从6379-6384,这样使用容器内访问就可以6379这样的常规端口,宿主机也可以使用映射端口远程访问 command: /bin/bash -c "chmod +x /scripts/*.sh && /scripts/start_redis_1.sh && tail -f /dev/null" # 启动命令,当容器被创建或重启时执行 # 这里是使用bash执行,首先给挂的.sh文件添加执行权限,然后执行.sh文件,最后使用tail命令让容器一直运行,否则容器会自动关闭 redis-node-2: # 同上 image: ubuntu:24.04 container_name: ubuntu-2 tty: true privileged: true volumes: - D:\Virtual environment\Docker\redis:/scripts # 这里会与其他容器一同操作这个文件夹,因为会同步,因此需要注意脚本编写。 networks: redis-cluster-net: ipv4_address: 172.20.0.11 ports: - "6381:6379" - "6382:6380" - "16381:16379" - "16382:16380" command: /bin/bash -c "chmod +x /scripts/*.sh && /scripts/start_redis_2.sh && tail -f /dev/null" redis-node-3: image: ubuntu:24.04 container_name: ubuntu-3 tty: true privileged: true volumes: - D:\Virtual environment\Docker\redis:/scripts networks: redis-cluster-net: ipv4_address: 172.20.0.12 ports: - "6383:6379" - "6384:6380" - "16383:16379" - "16384:16380" command: /bin/bash -c "chmod +x /scripts/*.sh && /scripts/start_redis_3.sh && tail -f /dev/null"- 这样就配置完成,我一般将yml文件放在被挂载的目录下(这里是D:\Virtual environment\Docker\redis),这样方便管理
- 在同文件下创建四个.sh文件,分别是
start_redis_1.sh、start_redis_2.sh、start_redis_3.sh、redis_cluster.sh,内容如下
-----------------------这是start_redis_1.sh----------------------- #!/bin/bash apt update && apt install -y redis-server redis-tools iputils-ping # 安装redis服务 mkdir -p /etc/redis # 创建redis配置文件目录 mv /scripts/redis-6379.conf /etc/redis/redis-6379.conf # 将配置文件移动到redis配置文件目录 mv /scripts/redis-6380.conf /etc/redis/redis-6380.conf mkdir -p /var/lib/redis/6379 # 创建redis数据目录 mkdir -p /var/lib/redis/6379/appendonlydir # 创建redis持久化目录 mkdir -p /var/lib/redis/6380 mkdir -p /var/lib/redis/6380/appendonlydir chown -R redis:redis /var/lib/redis/6379 # 修改redis数据目录权限 chown -R redis:redis /var/lib/redis/6380 chmod -R 755 /var/lib/redis/6379 # 修改redis数据目录权限 chmod -R 755 /var/lib/redis/6380 redis-server /etc/redis/redis-6379.conf > /var/log/redis-6379.log 2>&1 & # 启动redis服务 redis-server /etc/redis/redis-6380.conf > /var/log/redis-6380.log 2>&1 & sleep 5 # 等待redis服务启动 -----------------------这是start_redis_2.sh----------------------- #!/bin/bash apt update && apt install -y redis-server redis-tools iputils-ping mkdir -p /etc/redis mv /scripts/redis-6381.conf /etc/redis/redis-6379.conf # 这里要注意一下,因为设置的是端口映射,每个容器内其实都是6379和6380,但配置文件名不同,移动时重新命名了 mv /scripts/redis-6382.conf /etc/redis/redis-6380.conf mkdir -p /var/lib/redis/6379 mkdir -p /var/lib/redis/6379/appendonlydir mkdir -p /var/lib/redis/6380 mkdir -p /var/lib/redis/6380/appendonlydir chown -R redis:redis /var/lib/redis/6379 chown -R redis:redis /var/lib/redis/6380 chmod -R 755 /var/lib/redis/6379 chmod -R 755 /var/lib/redis/6380 redis-server /etc/redis/redis-6379.conf > /var/log/redis-6379.log 2>&1 & redis-server /etc/redis/redis-6380.conf > /var/log/redis-6380.log 2>&1 & sleep 5 -----------------------这是start_redis_3.sh----------------------- #!/bin/bash apt update && apt install -y redis-server redis-tools iputils-ping mkdir -p /etc/redis mv /scripts/redis-6383.conf /etc/redis/redis-6379.conf mv /scripts/redis-6384.conf /etc/redis/redis-6380.conf mkdir -p /var/lib/redis/6379 mkdir -p /var/lib/redis/6379/appendonlydir mkdir -p /var/lib/redis/6380 mkdir -p /var/lib/redis/6380/appendonlydir chown -R redis:redis /var/lib/redis/6379 chown -R redis:redis /var/lib/redis/6380 chmod -R 755 /var/lib/redis/6379 chmod -R 755 /var/lib/redis/6380 redis-server /etc/redis/redis-6379.conf > /var/log/redis-6379.log 2>&1 & redis-server /etc/redis/redis-6380.conf > /var/log/redis-6380.log 2>&1 & sleep 5 - 在命令行输入
- 配置redis服务
- 不去修改redis原本的配置文件,直接使用redis-server命令修改启动参数
- 配置文件内容如下,需要自行修改,一个容器按照我的配置应该分配两个配置文件
-----------------------这是redis-6379.conf-----第一个容器的------------------ port 6379 # redis服务端口 cluster-enabled yes # 开启集群模式,开启后redis会自动创建集群 cluster-config-file /etc/redis/nodes-6379.conf # 集群配置文件 cluster-node-timeout 15000 # 集群节点超时时间,这里是15s appendonly yes # 开启持久化,开启后redis会将数据持久化到磁盘 appendfilename "appendonly.aof" # 持久化文件名 appenddirname "appendonlydir" # 持久化文件目录 dir "/var/lib/redis/6379" # redis数据目录,这里的目录需要和启动脚本中的目录一致,因为redis不能自动创建目录 protected-mode no # 关闭保护模式,开启后redis只能本地访问 daemonize no # 关闭守护进程,开启后redis会以后台进程方式运行 bind 0.0.0.0 # 绑定所有ip,这样写有点危险,建议使用指定的ip cluster-announce-ip 111.111.111.111 # 集群节点ip,这里是宿主机的ip cluster-announce-port 6379 # 集群节点端口,这里是映射到宿主机的端口 cluster-announce-bus-port 16379 # 集群节点总线端口,这里是映射到宿主机的总线端口 cluster-migration-barrier 1 # 集群节点迁移屏障,这里是指一个节点至少需要多少个从节点才能迁移 cluster-require-full-coverage no # 集群节点是否需要全量覆盖,开启后如果集群中有一个节点宕机,那么整个集群都会宕机 requirepass 123456 # 设置redis密码,这里最好设置一个强密码,因为redis端口并不安全,使用密码需要-a认证 masterauth 123456 # 设置redis主节点密码,这里的密码需要和上面的密码一样 -----------------------这是redis-6380.conf----------------------- port 6380 # redis服务端口 cluster-enabled yes # 开启集群模式 cluster-config-file /etc/redis/nodes-6380.conf # 集群配置文件 cluster-node-timeout 15000 # 集群节点超时时间 appendonly yes # 开启持久化 appendfilename "appendonly.aof" # 持久化文件名 appenddirname "appendonlydir" # 持久化文件目录 dir "/var/lib/redis/6380" # redis数据目录 protected-mode no # 关闭保护模式 daemonize no # 关闭守护进程 bind 0.0.0.0 # 绑定所有ip cluster-announce-ip 111.111.111.111 # 集群节点ip,这里是宿主机的ip cluster-announce-port 6380 # 集群节点端口 cluster-announce-bus-port 16380 # 集群节点总线端口 cluster-migration-barrier 1 # 集群节点迁移屏障 cluster-require-full-coverage no # 集群节点是否需要全量覆盖 requirepass 123456 # 设置redis密码 masterauth 123456 # 设置redis主节点密码 -----------------------这是redis-6381.conf-----第二个容器的------------------ port 6379 cluster-enabled yes cluster-config-file /etc/redis/nodes-6379.conf cluster-node-timeout 15000 appendonly yes appendfilename "appendonly.aof" appenddirname "appendonlydir" dir "/var/lib/redis/6379" protected-mode no daemonize no bind 0.0.0.0 cluster-announce-ip 111.111.111.111 cluster-announce-port 6381 cluster-announce-bus-port 16381 cluster-migration-barrier 1 cluster-require-full-coverage no requirepass 123456 masterauth 123456 -----------------------这是redis-6382.conf----------------------- port 6380 cluster-enabled yes cluster-config-file /etc/redis/nodes-6380.conf cluster-node-timeout 15000 appendonly yes appendfilename "appendonly.aof" appenddirname "appendonlydir" dir "/var/lib/redis/6380" protected-mode no daemonize no bind 0.0.0.0 cluster-announce-ip 111.111.111.111 cluster-announce-port 6382 cluster-announce-bus-port 16382 cluster-migration-barrier 1 cluster-require-full-coverage no requirepass 123456 masterauth 123456 -----------------------这是redis-6383.conf-----第三个容器的------------------ port 6379 cluster-enabled yes cluster-config-file /etc/redis/nodes-6379.conf cluster-node-timeout 15000 appendonly yes appendfilename "appendonly.aof" appenddirname "appendonlydir" dir "/var/lib/redis/6379" protected-mode no daemonize no bind 0.0.0.0 cluster-announce-ip 111.111.111.111 cluster-announce-port 6383 cluster-announce-bus-port 16383 cluster-migration-barrier 1 cluster-require-full-coverage no requirepass 123456 masterauth 123456 -----------------------这是redis-6384.conf----------------------- port 6380 cluster-enabled yes cluster-config-file /etc/redis/nodes-6380.conf cluster-node-timeout 15000 appendonly yes appendfilename "appendonly.aof" appenddirname "appendonlydir" dir "/var/lib/redis/6380" protected-mode no daemonize no bind 0.0.0.0 cluster-announce-ip 111.111.111.111 cluster-announce-port 6384 cluster-announce-bus-port 16384 cluster-migration-barrier 1 cluster-require-full-coverage no requirepass 123456 masterauth 123456 - 创建容器并查看redis服务状态
- 使用
docker-compose up -d启动容器,(docker-compose down卸载容器),出现下面的信息表示启动成功。
time="2025-09-23T11:23:32+08:00" level=warning msg="D:\\Virtual environment\\Docker\\redis\\docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion" ✔ Network redis_redis-cluster-net Created ✔ Container ubuntu-1 Started ✔ Container ubuntu-2 Started ✔ Container ubuntu-3 Started- 使用
docker inspect ubuntu-1 ubuntu-2 ubuntu-3 | Select-String "IPAddress|rediscluster-network"查看容器IP,按照配置应该出现下述内容。
"SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "172.20.0.10", "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "172.20.0.11", "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "172.20.0.12",- 使用
docker exec -it ubuntu-1 bash进入容器1,使用ps aux|grep redis如果出现下述信息则表示redis服务正常。其他容器同理。
root 341 0.1 0.0 64876 13412 pts/0 Sl+ 03:24 0:09 redis-server 0.0.0.0:6379 [cluster] root 342 0.1 0.0 64876 13048 pts/0 Sl+ 03:24 0:09 redis-server 0.0.0.0:6380 [cluster] root 393 0.0 0.0 3528 1792 pts/1 S+ 05:48 0:00 grep --color=auto redis - 使用
- 连接redis集群
- 检查完成后执行,进入任意容器当中
- 命令行执行或者启动redis_cluster.sh脚本用来连接redis集群通信。
- redis_cluster.sh脚本内容如下:
#!/bin/bash redis-cli -a 123456 --cluster create \ 111.111.111.111:6379 \ 111.111.111.111:6380 \ 111.111.111.111:6381 \ 111.111.111.111:6382 \ 111.111.111.111:6383 \ 111.111.111.111:6384 \ --cluster-timeout 30 \ --cluster-replicas 1 \ --cluster-yes # --cluster-replicas 1 表示每个主节点有1个从节点 # --cluster-timeout 30 表示集群节点超时时间 # --cluster-yes 表示自动确认- 执行后出现下述信息表示redis集群创建成功。
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing hash slots allocation on 6 nodes... # 自动分配槽 Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 111.111.111.111:6383 to 111.111.111.111:6379 # 自动分配主从 Adding replica 111.111.111.111:6384 to 111.111.111.111:6380 Adding replica 111.111.111.111:6382 to 111.111.111.111:6381 >>> Trying to optimize slaves allocation for anti-affinity # 优化从节点分配 [WARNING] Some slaves are in the same host as their master M: 606f8d8841a19e6f4dffc6bbb52e8b3fddd8e6f3 111.111.111.111:6379 slots:[0-5460] (5461 slots) master M: 61c15bbf57e4e1c6dde029947f1d268d75d0f884 111.111.111.111:6380 slots:[5461-10922] (5462 slots) master M: 3746096b32f2e825ab6b4b86c3cbd875b3b208bb 111.111.111.111:6381 slots:[10923-16383] (5461 slots) master S: d2afd18c0e00ec313348588aaaf5da78885a3a1c 111.111.111.111:6382 replicates 3746096b32f2e825ab6b4b86c3cbd875b3b208bb S: e1f877a825357bee60b6082ce6a7d19872698600 111.111.111.111:6383 replicates 606f8d8841a19e6f4dffc6bbb52e8b3fddd8e6f3 S: f9056f950f9b5719cda83f3e55f607d8d3864ae4 111.111.111.111:6384 replicates 61c15bbf57e4e1c6dde029947f1d268d75d0f884 Can I set the above configuration? (type 'yes' to accept): yes # 自动确认 >>> Nodes configuration updated # 节点配置更新 >>> Assign a different config epoch to each node # 分配不同的配置周期给每个节点 >>> Sending CLUSTER MEET messages to join the cluster # 发送CLUSTER MEET消息加入集群 Waiting for the cluster to join # 等待集群加入 . >>> Performing Cluster Check (using node 111.111.111.111:6379) # 执行集群检查 M: 606f8d8841a19e6f4dffc6bbb52e8b3fddd8e6f3 111.111.111.111:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: 61c15bbf57e4e1c6dde029947f1d268d75d0f884 111.111.111.111:6380 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: d2afd18c0e00ec313348588aaaf5da78885a3a1c 111.111.111.111:6382 slots: (0 slots) slave replicates 3746096b32f2e825ab6b4b86c3cbd875b3b208bb M: 3746096b32f2e825ab6b4b86c3cbd875b3b208bb 111.111.111.111:6381 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: f9056f950f9b5719cda83f3e55f607d8d3864ae4 111.111.111.111:6384 slots: (0 slots) slave replicates 61c15bbf57e4e1c6dde029947f1d268d75d0f884 S: e1f877a825357bee60b6082ce6a7d19872698600 111.111.111.111:6383 slots: (0 slots) slave replicates 606f8d8841a19e6f4dffc6bbb52e8b3fddd8e6f3 [OK] All nodes agree about slots configuration. # 所有节点同意槽位配置 >>> Check for open slots... # 检查开放槽位 >>> Check slots coverage... # 检查槽位覆盖 [OK] All 16384 slots covered. # 所有16384个槽位覆盖 - 特别注意事项
- 要想将docker的redis集群开放到宿主机上,需要docker和redis的配合,否则宿主机无法连接到docker的redis集群。
- docker需要映射redis的端口
- redis需要将集群信息放在宿主机上进行通信

浙公网安备 33010602011771号