FChao
发布于 2025-12-11 / 11 阅读
0
0

Redis基础

1.Redis与SQL数据库的对比

  1. 数据的结构

    SQL:像 Excel 表格,数据必须严格遵守预定义的行和列结构(Schema)。

    Redis:像一个巨大的字典(Map),没有表结构,通过唯一的 Key 存取各种形式的 Value(字符串、列表等)。

  2. 关联查询 (Join)

    SQL:支持 JOIN,可以轻松把“用户表”和“订单表”连起来查。

    Redis:不支持 JOIN,数据之间是孤立的,必须靠程序员在代码里查多次或存储冗余数据来解决。

  3. 查询能力

    SQL:查询逻辑强大,支持任意条件的筛选、排序和组合(WHERE, GROUP BY)。

    Redis:查询能力极弱,通常只能根据 Key 精确查找,无法像 SQL 那样灵活地“搜索”数据。

  4. 存储介质

    SQL:数据主要存在硬盘,存海量数据便宜,但速度受限于磁盘 I/O。

    Redis:数据全部在内存,速度比 SQL 快几十倍,但容量有限且价格昂贵。

  5. 事务与原子性

SQL:支持完整的 ACID 事务,出错自动回滚,保证数据绝对安全一致。

Redis:支持原子性执行(没人能插队),出错之前的命令不会回滚,之后的命令会继续执行。

ACID事务

A - Atomicity(原子性)

不可分割,要么全做,要么全不做。

原子性保证了“转账”这整个操作是一个不可分割的“原子”。

  • 正常情况:猪八戒 -100,孙悟空 +100,两步都成功,交易完成。

  • 意外情况:猪八戒 -100 之后,突然停电了或者代码报错了,孙悟空的那步没执行。

  • ACID 的保护:数据库会立刻回滚(Rollback)。它会把猪八戒的账户恢复原样(把那 100 块退回去),就像这件事从来没发生过一样。

C - Consistency(一致性)

数据必须守规矩,“能量”必须守恒。

一致性保证了事务执行前后,数据库都符合预设的规则。

  • 规则示例:所有账户余额不能小于 0;或者全宇宙的钱总数是不变的。

  • ACID 的保护

    • 如果猪八戒只有 50 块钱,他非要转 100。数据库会在检查时发现这会导致“余额小于 0”这种非法状态,于是直接报错拒绝,事务失败,数据保持原样。

    • 转账前后,(猪八戒的钱 + 孙悟空的钱)的总和必须是一样的,不能凭空多出钱或少了钱。

  • 如果没有 C:数据不遵循预设规则,可能出现库存为负数、订单缺少顾客信息等情况。

I - Isolation(隔离性)

一个事务在提交之前,它所做的修改对其他事务是“不可见”的。

隔离性是为了解决并发(很多人同时操作)带来的问题。

场景:

  1. 猪八戒正在给孙悟空转 100 元(事务 A,还没提交)。猪八戒转账-100,孙悟空在+100之前,总余额是少了100的。

  2. 与此同时,沙僧正在查猪八戒的余额(事务 B)。

  • ACID 的保护

    • 在事务 A 彻底完成(Commit)之前,沙僧是看不见余额变化的。他查到的要么是转账前的数字,要么是转账后的数字,绝对不会查到“猪八戒扣了钱但还没给孙悟空”这种中间的尴尬状态。

    • 两个人抢最后一张票,多线程并发,它们不会被允许:同时发现票数剩余>1。

D - Durability(持久性)

落子无悔,永不丢失。

持久性保证了只要数据库告诉你“交易成功”,这笔数据就真的存下来了。

  • 场景:屏幕上显示“转账成功”的瞬间,机房突然爆炸了,或者服务器拔电源了。

  • ACID 的保护

    • 即使内存里的数据还没来得及写到硬盘文件里,数据库也会利用日志机制(Redo Log),在重启后把这笔交易恢复出来。

    • 只要承诺了成功,就算天塌下来,这 100 块钱也在孙悟空账上。

  • 如果没有 D:用户看到成功了,结果重启服务器发现钱没到账,这叫“数据丢失”,是数据库最严重的事故。

2.部署

  • https://download.redis.io/releases/

  • 新的Linux发行版,建议手动配置 Systemd 服务文件(redis.service),而不是使用老旧的脚本(install_server.sh 生成的 init.d 脚本),可以自动重启保活,使用systemd统一管理。

2.1 手动编译安装,配置 Systemd 服务

第一步:安装编译依赖

openEuler 默认环境比较纯净,需要安装 gcc 编译器和 systemd 开发包(为了让 Redis 支持 Systemd 的通知机制)。

# 1. 更新缓存并安装依赖
sudo dnf makecache
sudo dnf install -y gcc make wget tar systemd-devel

第二步:下载与编译

将 Redis 安装到 /usr/local/ 下的标准位置。

# 1. 进入源码目录(习惯上源码放这里)
cd /usr/local/src

# 2. 下载 Redis 7.2.4
sudo wget https://download.redis.io/releases/redis-7.2.4.tar.gz

# 3. 解压
sudo tar -zxvf redis-7.2.4.tar.gz
cd redis-7.2.4

# 4. 编译
# 关键点:加上 USE_SYSTEMD=yes,让 Redis 编译时包含 systemd 支持库
sudo make USE_SYSTEMD=yes

# 5. 安装二进制文件
# 这步会将 redis-server, redis-cli 等拷贝到 /usr/local/bin/
sudo make install

第三步:创建标准目录结构

手动创建配置文件、数据、日志的存放目录。

# 存放配置文件
sudo mkdir -p /etc/redis

# 存放持久化数据 (Dump.rdb 等)
sudo mkdir -p /var/lib/redis

# 存放日志
sudo mkdir -p /var/log/redis

# 从源码包里复制一份默认配置到 /etc/redis
sudo cp redis.conf /etc/redis/redis.conf

第四步:修改配置文件

修改默认配置以适配 Systemd 和远程连接。

sudo vi /etc/redis/redis.conf

找到以下配置项并进行修改(在 vi 中按 / 搜索):

  1. 允许远程连接(默认只允许本机):

    • 原值:bind 127.0.0.1 -::1

    • 改为bind * -::*

  2. 关闭保护模式(配合上一条,允许远程连):

    • 原值:protected-mode yes

    • 改为protected-mode no

    • (注意:生产环境建议开启 yes 并设置密码,学习环境为了方便先关掉)

  3. 端口(保持默认即可):

    • port 6379

  4. 后台运行(关键点):

    • 原值:daemonize no

    • 保持daemonize no

    • (解释:因为要用 Systemd 来管理守护进程,所以这里 Redis 自己不要后台化,否则会和 Systemd 冲突)

  5. 日志文件路径

    • 原值:logfile ""

    • 改为logfile /var/log/redis/redis.log

  6. 数据存放目录

    • 原值:dir ./

    • 改为dir /var/lib/redis

修改完后,按 Esc,输入 :wq 保存退出。

第五步:创建 Systemd 服务文件

创建一个服务描述文件,告诉 openEuler 如何管理 Redis。

sudo vi /usr/lib/systemd/system/redis.service

复制并粘贴以下内容,用systemd控制redis-server:

[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
# 这里的 Type=notify 需要之前的 USE_SYSTEMD=yes 编译参数支持,openEuler需要修改为simple模式
# Type=simple 和 Type=notify 的核心区别,在于 Systemd “判断服务启动成功的标准” 不同。notify模式
# 下,如果 Systemd 显示 Active,那就说明 Redis 真的已经可以处理请求了。依赖它的服务绝对安全。
Type=notify

# 启动命令 可以看到这里用systemd控制的是redis-server
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf

# 停止命令
ExecStop=/usr/local/bin/redis-cli shutdown

# 进程守护:挂了自动重启
Restart=always

# 运行用户 (学习环境为了省事可以用 root,生产环境建议用 redis 用户)
User=root
Group=root

[Install]
WantedBy=multi-user.target

保存退出 (:wq)。

第六步:启动与验证

一切准备就绪,让 Systemd 接管 Redis。

# 1. 重新加载 Systemd 配置(让系统识别新加的 redis.service)
sudo systemctl daemon-reload

# 2. 启动 Redis
sudo systemctl start redis

# 3. 设置开机自启
sudo systemctl enable redis

# 4. 检查状态
sudo systemctl status redis

验证成功的标志:

  1. 状态显示绿色的 Active: active (running)

  2. 输入 redis-cli 能进入交互界面。

  3. 输入 ping,返回 PONG


学习总结

Redis 的所有核心组件:

  • 二进制程序:在 /usr/local/bin/

  • 配置文件:在 /etc/redis/redis.conf

  • 数据目录:在 /var/lib/redis/

  • 服务管理:通过 systemctl 命令

修改端口、开启密码或者调整内存限制,只需要去 /etc/redis/redis.conf 改一下,然后 systemctl restart redis 即可。

2.2 使用 install_server.sh 脚本安装

1. 下载与编译

# 1. 切换到临时目录
cd /usr/local/src

# 2. 下载 Redis 7.2.4 (国内用 download.redis.io 速度还行,或者自己找镜像)
wget https://download.redis.io/releases/redis-7.2.4.tar.gz

# 3. 解压
tar -zxvf redis-7.2.4.tar.gz
cd redis-7.2.4

# 4. 安装编译依赖 (openEuler)
dnf install -y gcc make

# 5. 编译并安装到系统路径
make
make install
# 提示:make install 会默认把 redis-server 等命令拷贝到 /usr/local/bin/ 下

2. 修改脚本(解决报错的关键一步)

现在进入 utils 目录,准备运行脚本。但在 openEuler (systemd 系统) 上直接运行会报错,需要手动注释。

cd utils/

# 查看一下那个讨厌的检查逻辑(仅查看)
sed -n '70,90p' install_server.sh
# 你会看到类似 "This systems seems to use systemd..." 的报错代码

# === 执行修改操作 ===
# 方法 A:手动 vim 打开,找到那几行 exit 1 的代码,前面加 # 注释掉。
# 方法 B:直接用 sed 命令一键注释(暴力但有效)
# 注意:不同版本的行号可能略有偏差,建议直接搜字符串 "systemd" 
vi install_server.sh

vi 中操作:

  1. 输入 /systemd 回车,找到那段检查代码。

  2. 通常是这样的结构:

    # check_systemd 
    # if [ -n "..." ]; then
    #    echo "..."
    #    exit 1   <-- 这一行必须注释掉
    # fi
  3. exit 1 这一行前面加个 #,或者把整个 if 块都注释掉。

  4. 保存退出。

3. 运行安装向导

运行:

./install_server.sh

接下来是交互式问答(一路回车即可,也可以根据需要改):

  1. Please select the redis port for this instance: [6379]

    • 说明:选择端口。

    • 操作:直接回车(用默认 6379)。

  2. Please select the redis config file name [/etc/redis/6379.conf]

    • 说明:配置文件路径。

    • 操作:直接回车

  3. Please select the redis log file name [/var/log/redis_6379.log]

    • 说明:日志文件路径。

    • 操作:直接回车

  4. Please select the data directory [/var/lib/redis/6379]

    • 说明:数据存放目录。

    • 操作:直接回车

  5. Please select the redis executable path [/usr/local/bin/redis-server]

    • 说明:redis-server 命令在哪里。如果你刚才执行了 make install,它会自动识别。

    • 操作:直接回车

  6. Is this ok? Then press ENTER to go on or Ctrl-C to abort.

    • 说明:确认配置。

    • 操作回车

脚本运行完毕后,你会看到类似 Installation successful! 的提示,并且 Redis 已经自动启动了。

4. 验证与后续处理

虽然脚本说安装成功了,但它用的是老式的 init.d 脚本启动的。

查看状态:

# 看看进程在不在
ps -ef | grep redis
# 应该能看到 /usr/local/bin/redis-server *:6379

用 Systemd 接管(兼容模式):
openEuler 的 systemd 会自动识别 /etc/init.d/redis_6379 这个脚本,并为它生成一个临时的 service 包装器。

# 尝试用 systemd 停止
systemctl stop redis_6379

# 尝试用 systemd 启动
systemctl start redis_6379

# 查看状态
systemctl status redis_6379

5. 学习总结:这个脚本到底干了啥?

  • 配置cat /etc/redis/6379.conf (它自动帮你改好了 daemonize yes, logfile, dir 等参数)

  • 启动脚本cat /etc/init.d/redis_6379 (这是经典的 Shell 启动脚本,包含 start/stop/restart 逻辑)

3.基本使用

  • ping

    • 验证客户端与 Redis 服务器之间的网络连接是否正常

  • 查看所有变量名(键名)

    • keys *

    • 在任何 key 数量不确定、或可能较多的情况下,建议用 scan 0

  • 设置变量(用于操作字符类型)

    • set 变量名 变量值

  • 查看值(字符类型)

    • get 变量名

  • 查看多个值(字符类型)

    • mget 变量名1 变量名2

  • 删除变量

    • del 变量名1 变量名2

  • 直接清空内存 FLUSHALL

    • Redis 默认有 16 个数据库(编号 0 到 15),无差别清空 Redis 实例中所有 16 个数据库里的所有数据。

  • 清空当前库的所有数据 FLUSHdb

    • 只清空你当前所在的那一个数据库(默认是 0 号库),其他数据库的数据不受影响。

  • 关闭服务时,内存中的变量保存到硬盘中

当执行图中的 SHUTDOWN 命令(或者 systemctl stop redis)时,Redis 会执行一套标准的流程:

  1. 停止接受新的客户端写入。

  2. 强制执行一次 RDB 持久化:它会把内存里当前所有的数据,同步写入到硬盘上的 dump.rdb 文件中。

  3. 只有当文件写完、落盘成功后,进程才会真正退出。

  4. 结果:下次启动时,所有数据都在。

当已经使用systemd时,应该用systemctl stop代替redis-cli shutdown,来shutdown redis-server,以免systemd认为redis异常退出。

  • 登录

    • redis-cli -h 192.168.88.50 -p 6350 -a 123456

常用参数

含义

Redis 写法

MySQL 写法

核心区别(坑点)

主机 IP

指定连接的服务器

-h 192.168.1.5

-h 192.168.1.5

完全一样

端口

指定端口号

-p 6379

-P 3306

大小写不同!<br>Redis 用小写 p。<br>MySQL 必须用大写 P(小写 p 是密码)。

密码

认证密码

-a 123456

-p123456-p

参数名不同!Redis 用 -a (Auth)。

MySQL 用 -p (Password)。

4.配置文件

CONFIG SET

使用config set与config rewrite在不停止运行的情况下修改配置文件,否则就需要先停止再重启。

127.0.0.1:6379> CONFIG SET save "3600 1 120 10 60 10000"
OK
127.0.0.1:6379> CONFIG REWRITE
OK

/var/log/redis_6379.log

Redis 的日志文件主要记录以下 4 类核心信息:

生命周期与环境

  • 启动时的版本号、PID、加载的配置文件路径。

  • 系统环境警告:如 TCP 连接队列设置过小、透明大页(THP)未关闭等性能优化建议。

  • 正常关闭或异常崩溃的记录。

持久化动作(存盘记录)

  • RDB 快照或 AOF 重写何时开始、何时结束。

  • 耗时多久、是否发生错误(如磁盘满导致保存失败)。

  • 作用:排查 Redis 突然卡顿是否由存盘引起。

复制与高可用状态

  • 主从节点(Master-Slave)之间的连接、断开、同步进度。

  • 哨兵(Sentinel)模式下的故障转移、主节点选举记录。

关键故障与异常

  • 内存溢出(OOM):内存满了,开始删除数据。

  • 连接数超限:客户端连接过多被拒绝。

  • 密码错误:记录暴力破解尝试。

/etc/redis/redis.conf

具体文件名可能因安装方式不同而叫6379.conf

在没有通过systemd管理redis的情况下,要让redis按照修改好的配置运行

需要输入 redis-server /path/to/redis.conf

未注释选项在网络相关部分

Bind 监听(绑定地址)

bind 127.0.0.1 -::1
#监听ipv4本机回环地址和ipv6本机回环地址
bind * -::* 
#监听ipv4所有地址和ipv6所有地址

分隔符为空格,前缀 - (减号)表示尝试绑定ipv6,如果机器不支持则只监听ipv4而不是报错退出。

::1 表示ipv6回环地址,相当于ipv4的127.0.0.1

::* 表示ipv6的全网段,相当于ipv4的*/0.0.0.0

设置Port端口的一些注意事项

  • Linux 内核规定,只有 root 用户 启动的进程,才有资格监听 0-1023 端口

  • 49152 - 65535(动态/私有端口):Linux 系统作为客户端去连接别人时,会随机从这里拿一个端口当“回信地址”。虽然也能用,但理论上存在“撞车”风险

  • 1024 - 49151:随便用,只要不和现有的软件冲突就行

protected-mode

处于开启状态(yes)时,它会检查两个条件。只有当这两个条件同时满足时,保护模式才会生效(即拒绝任何外部连接):

  1. 没有绑定具体 IP没有在配置文件里显式设置 bind 参数(或者把 bind 这一行注释掉了)。

  2. 没有设置密码没有在配置文件里设置 requirepass 参数。

Redis处于保护模式拒绝连接的提示:

requirepass和masterauth

requirepass是给 Server(服务端) 设置的密码。

masterauth是从节点连接主节点时需要提供的凭证,也就是主节点的requirepass

daemonize

决定是否run as a daemon

1. 什么情况下要开 yes

  • 手动管理/脚本启动
    如果没有用 Systemd,也没有用 Docker,纯粹是手动敲命令 redis-server /etc/redis.conf 来启动,或者写了个简单的 Shell 脚本来跑。

    • 原因:不希望 Redis 占着你的屏幕不动,需要它自己乖乖躲到后台去跑,别影响你干别的。

2. 为什么配合 Systemd 就要 no

  • Systemd 的控制欲:Systemd 喜欢直接监控它启动的那个进程。

  • 如果设为 yes:Redis 会“金蝉脱壳”——它会 fork 出一个新进程去后台跑,然后把 Systemd 启动的那个原始进程关掉。

  • 后果:Systemd 看到原始进程退出了,会以为“Redis 挂了”或者“启动完成了”(取决于 Type),这会导致 Systemd 误判状态,或者日志抓取不到。

  • 正确做法 (no):让 Redis 老实待在前台,Systemd 会负责把它“包装”成后台服务,这样 Systemd 就能精准掌控它的生死和日志。

dir目录(如/var/lib/redis)

主要存放以下三类文件

1. RDB 快照文件(最常见)

  • 文件名:通常叫 dump.rdb(名字可在配置dbfilename里改)。

  • 内容:Redis 内存中所有数据的二进制压缩快照

  • 作用:这是 Redis 的“存档”。重启时,Redis 会读取这个文件来恢复数据。

2. AOF 持久化文件

  • 文件名:通常叫 appendonly.aof(或者在 Redis 7.0+ 是一个文件夹 appendonlydir)。

  • 内容:记录了你对 Redis 做过的所有写操作指令(如 SET a 1)。

  • 作用:比 RDB 更安全的数据备份。如果开启了 AOF,Redis 优先用它来恢复数据。

3. 集群节点信息文件(仅集群模式)

  • 文件名:默认叫 nodes.conf(或者是 nodes-6379.conf)。

  • 内容:记录了 Redis Cluster 中其他节点的 IP、ID、槽位分配等元数据。

  • 注意:这个文件是 Redis 自己维护的,千万别手动去改它。

5.持久化存储

RDB

设置RDB存盘频率,单位为秒

# 正确写法(所有规则塞在一个引号里,用空格隔开)
CONFIG SET save "3600 1 300 100 60 10000"

如果直接编辑redis.conf文件,则必须save后面只能接两个参数写成三行

# 格式:save <秒数> <修改次数>
save 3600 1      # 1小时内至少有1个key改变,就存一次
save 300 100     # 5分钟内至少有100个key改变,就存一次
save 60 10000    # 1分钟内至少有10000个key改变,就存一次

要验证是否生效,可以查看时间戳

ls -l --full-time /var/lib/redis/dump.rdb
  • RDB数据恢复:如果需要手动恢复,将备份的rdb文件拷贝到dir目录,重启即可

  1. 如果 Redis 配置文件里开启了 AOF (appendonly yes)。Redis 启动时,会优先加载 AOF 文件,直接无视 RDB 文件。

  2. 如果文件是用 root 复制进去的,但 Redis 服务是用 redis 用户跑的。Redis 没有权限读取这个文件,启动时日志会报错 Permission denied。

RDB和AOF的不同

通常混合使用(RDB 做全量备份,AOF 做增量保障)。

1. 记录方式不同

  • RDB (快照):每隔一段时间,把内存里当前所有数据的状态生成一个二进制文件。

  • AOF (追加日志):把执行的每一条写命令(SET, DEL, INCR...)都追加记录到文件末尾。

2. 安全性不同

  • RDB:容易丢数据。如果在两次快照之间断电,最后这几分钟的数据就全丢了。

  • AOF:更安全。默认每秒存一次,最多只丢 1 秒的数据。

3. 恢复速度不同

  • RDB:恢复快。文件是压缩后的二进制,Redis 启动时读起来飞快。

  • AOF:恢复慢。Redis 启动时要像“回放电影”一样,把日志里的命令一条条重新执行一遍,数据量大时会很慢。

4. 文件大小不同

  • RDB:文件小,非常适合做冷备份(传到另一台机器)。

  • AOF:文件大(因为记录了所有历史操作),需要定期进行“重写”(Rewrite)来瘦身。

AOF

  1. 启用AOF

config set appendonly yes
  1. 验证是否开启成功

config get appendonly
# 输出:1) "appendonly" 2) "yes"。说明配置修改成功。
  1. 固定化配置写入到文件

config rewrite
  1. 查看 AOF 文件的名字

config get appendfilename
#(默认是 appendonly.aof,但在 Redis 7.0+ 变了)
  1. 查看刷盘策略(配置文件中的appendfsync)

config get appendfsync
# 结果是 everysec(默认每秒刷盘一次,兼顾性能和安全)。
# always 每执行一条,写命令,性能开销很大
# no 由linux内核来决定没写到硬盘的数据什么时候保存,一般为30秒一次,redis作缓存常用
  1. 退出并检查生成的 AOF 文件 (图中最下面的红框)

ls /var/lib/redis/6379/appendonlydir/

appendonly.aof.1.base.rdb
appendonly.aof.1.incr.aof
appendonly.aof.manifest
  • Base 文件 (.base.rdb):这是基础数据。它其实是一个 RDB 格式的文件(为了省空间和加载快),代表了 AOF 重写那一刻的全量数据(启用AOF时已有的数据)。

  • Incr 文件 (.incr.aof):这是增量文件。从生成 Base 文件之后,新产生的写命令(SET, DEL等)都记在这里。这是纯文本日志。

  • Manifest 文件 (.manifest):清单文件。用来管理上面那一堆文件,告诉 Redis 哪个是 Base,哪个是 Incr,按什么顺序加载。

AOF恢复数据

  1. 确保配置文件 redis.conf 里设置了 appendonly yes。

  2. 确保 dir 指向的目录是对的(比如 /var/lib/redis/)

  3. systemctl stop redis

  4. 清空 /var/lib/redis/ 下原本的内容(如果有自动生成的空 AOF 目录,删掉它)。

  5. 把你备份的 appendonlydir 文件夹整个复制进去。结构必须保持原样:目录里必须包含 manifest 文件和对应的 .aof / .rdb 文件。

  6. 注意Redis用户是root还是其他的什么,chown -R redis:redis /var/lib/redis/,如果权限不对,Redis 启动时读不到文件,会直接报错退出或者创建一个新的空文件覆盖掉。

  7. systemctl start redis

  8. 查看日志 /var/log/redis/redis.log,你会看到类似 DB loaded from append only file: ... seconds 的提示。

如果 AOF 文件最后一部分写坏了(比如断电导致最后一行命令残缺),Redis 启动时会报错拒绝启动。可以使用自带的修复工具:把文件末尾损坏的那一点点数据切掉,保证文件格式合法

redis-check-aof --fix appendonly.aof

6.Redis主从

  • Master (主角色)

    • 一个 Redis什么都不配置的情况下,默认就是 Master

    • 只有它能写数据(默认情况下)。 SETDEL 等命令必须发给它。

  • Slave (从角色)

    • slave无法执行写、删等操作,而是进行“自动同步”。Master 执行了什么写命令(比如删了一个 key),Slave 也会立马在自己本机执行一遍同样的命令。

    • 作用:主要用来读数据(分担流量)或者做备份(容灾)。

主从配置

在 Redis 6.x 及以后版本中,主从复制需要先配置密码。执行:

CONFIG SET requirepass strongpassword
CONFIG REWRITE

或从配置文件中修改,再重启。

  • info replication:查看自己的主从信息,是否连接主(master_link_status)、有几个从等等

  • replicaof <IP> <Port>:让该ip:port成为自己的主节点,自己变成从节点,并且进行全量复制,服务器上原有的数据会​​被完全清除。

  • replicaof no one:停止同步,断开连接,并且保留当前的数据,自己变成独立的主节点。

  • masterauth:masterauth strongpassword 指定主节点的密码

  • 最后执行config rewrite生效,同样以上内容也可以写在redis.conf中,重启redis生效。

  • 关闭SELinux、防火墙,或者允许外部访问6379端口。

主从结构

比较维度​

​一主多从​

​主从从(树状结构)​

​拓扑结构​

星型结构:主节点直连所有从节点

树型结构:主→从节点A→从节点B(多级复制)

​数据同步路径​

主节点直接向所有从节点同步数据

主→一级从节点→二级从节点(数据逐层传递)

​主节点压力​

高:主节点需处理所有从节点的复制请求

低:主节点仅需同步一级从节点,复制压力分散

​网络带宽消耗​

高:主节点需向每个从节点单独发送全量/增量数据,网卡负担大

低:一级从节点聚合数据后向下分发,减少主节点出口带宽

​故障影响范围​

从节点故障不影响其他节点

中间从节点故障会导致其下级节点数据同步中断

​适用场景

读多写少(主写入,一群从负责读取)
中小规模(从节点≤5个)

大规模(从节点≥10个)

一主多从:

从节点均replicaof主节点的ip端口,设置masterauth主节点的密码,保存配置或重启即可。主机默认为master角色,不需要做其它操作来“接收”从节点。

主从从:

就是给一个从节点再添加从节点,也就是slave角色的主机也是一个从节点。新的从节点replicaof上一个从节点,其余操作均与普通主从一致。

7.Redis字符类型

Redis常用有四种数据类型

  • String(字符串)

  • List(列表)

  • Set(集合)

  • Hash(哈希)

每种数据类型,都有其对应的查询、创建、增删命令,使用 type 变量名,可以查看其数据类型

字符串String

Redis-cli 内置的命令参数提示:

[root@localhost ~]# redis-cli
127.0.0.1:6379> set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
  • set

    • SET key value NX 如果key已经存在,就不要覆盖它的value

    • SET key value XX 不创建key,只修改(覆盖)key

    • 以上均不是默认值,默认是既创建,也覆盖

    • SET key new_value GET 就是set的同时也返回旧值

    • SET key value EX 10 / SET key value PX 1500 / EXAT / PXAT 设置过期时间,单位是秒、毫秒、秒级/毫秒级时间戳

    • SET key new_value KEEPTTL 只改值,不更新过期时间

补充:

初始化

replicaof no one 和 config rewrite

rm -rf /var/lib/redis/6379/*

redis-sentinel

Redis Cluster(Redis 集群)


评论