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

  1. 无序集合
  2. 数据类型是 string
  3. value 具有唯一性,不重复
  4. 没有修改操作
# 添加
sadd stu_1 zhangsan3 lisi4

# 查看
smembers stu_1

# 移除
srem stu_1 lisi4

zset

  1. sorted set 有序集合
  2. 数据类型是 string
  3. value 具有唯一性,不重复
  4. 每个元素会关联一个 double 类型的 score,表示权重,通过权重进行排序
  5. 没修改操作
# 添加
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

主从服务器

  1. 一个 master 可以用多个 slave,一个 slave 又可以拥有多个 slave,形成大集群架构
  2. master 用来写数据,slave 用来读数据,一般网站的读写比是 10:1
  3. 使用主从配置可以实现读写分离
  4. 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服务,三个容器相互备份

  1. windows下安装docker
    • docker官网进入官网下载就行,安装完成后有gui界面,并且命令行输入docker version,出现版本号则安装成功,docker命令
  2. 配置并安装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.shstart_redis_2.shstart_redis_3.shredis_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
    
  3. 配置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
    
  4. 创建容器并查看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
    
  5. 连接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个槽位覆盖
    
  6. 特别注意事项
    • 要想将docker的redis集群开放到宿主机上,需要docker和redis的配合,否则宿主机无法连接到docker的redis集群。
    • docker需要映射redis的端口
    • redis需要将集群信息放在宿主机上进行通信
posted @ 2025-09-01 00:42  *--_-  阅读(9)  评论(0)    收藏  举报