1.Redis与SQL数据库的对比
数据的结构
SQL:像 Excel 表格,数据必须严格遵守预定义的行和列结构(Schema)。
Redis:像一个巨大的字典(Map),没有表结构,通过唯一的 Key 存取各种形式的 Value(字符串、列表等)。
关联查询 (Join)
SQL:支持 JOIN,可以轻松把“用户表”和“订单表”连起来查。
Redis:不支持 JOIN,数据之间是孤立的,必须靠程序员在代码里查多次或存储冗余数据来解决。
查询能力
SQL:查询逻辑强大,支持任意条件的筛选、排序和组合(WHERE, GROUP BY)。
Redis:查询能力极弱,通常只能根据 Key 精确查找,无法像 SQL 那样灵活地“搜索”数据。
存储介质
SQL:数据主要存在硬盘,存海量数据便宜,但速度受限于磁盘 I/O。
Redis:数据全部在内存,速度比 SQL 快几十倍,但容量有限且价格昂贵。
事务与原子性
SQL:支持完整的 ACID 事务,出错自动回滚,保证数据绝对安全一致。
Redis:支持原子性执行(没人能插队),出错之前的命令不会回滚,之后的命令会继续执行。
ACID事务
A - Atomicity(原子性)
不可分割,要么全做,要么全不做。
原子性保证了“转账”这整个操作是一个不可分割的“原子”。
正常情况:猪八戒 -100,孙悟空 +100,两步都成功,交易完成。
意外情况:猪八戒 -100 之后,突然停电了或者代码报错了,孙悟空的那步没执行。
ACID 的保护:数据库会立刻回滚(Rollback)。它会把猪八戒的账户恢复原样(把那 100 块退回去),就像这件事从来没发生过一样。
C - Consistency(一致性)
数据必须守规矩,“能量”必须守恒。
一致性保证了事务执行前后,数据库都符合预设的规则。
规则示例:所有账户余额不能小于 0;或者全宇宙的钱总数是不变的。
ACID 的保护:
如果猪八戒只有 50 块钱,他非要转 100。数据库会在检查时发现这会导致“余额小于 0”这种非法状态,于是直接报错拒绝,事务失败,数据保持原样。
转账前后,(猪八戒的钱 + 孙悟空的钱)的总和必须是一样的,不能凭空多出钱或少了钱。
如果没有 C:数据不遵循预设规则,可能出现库存为负数、订单缺少顾客信息等情况。
I - Isolation(隔离性)
一个事务在提交之前,它所做的修改对其他事务是“不可见”的。
隔离性是为了解决并发(很多人同时操作)带来的问题。
场景:
猪八戒正在给孙悟空转 100 元(事务 A,还没提交)。猪八戒转账-100,孙悟空在+100之前,总余额是少了100的。
与此同时,沙僧正在查猪八戒的余额(事务 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 中按 / 搜索):
允许远程连接(默认只允许本机):
原值:
bind 127.0.0.1 -::1改为:
bind * -::*
关闭保护模式(配合上一条,允许远程连):
原值:
protected-mode yes改为:
protected-mode no(注意:生产环境建议开启 yes 并设置密码,学习环境为了方便先关掉)
端口(保持默认即可):
port 6379
后台运行(关键点):
原值:
daemonize no保持:
daemonize no(解释:因为要用 Systemd 来管理守护进程,所以这里 Redis 自己不要后台化,否则会和 Systemd 冲突)
日志文件路径:
原值:
logfile ""改为:
logfile /var/log/redis/redis.log
数据存放目录:
原值:
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验证成功的标志:
状态显示绿色的
Active: active (running)。输入
redis-cli能进入交互界面。输入
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 中操作:
输入
/systemd回车,找到那段检查代码。通常是这样的结构:
# check_systemd # if [ -n "..." ]; then # echo "..." # exit 1 <-- 这一行必须注释掉 # fi把
exit 1这一行前面加个#,或者把整个if块都注释掉。保存退出。
3. 运行安装向导
运行:
./install_server.sh接下来是交互式问答(一路回车即可,也可以根据需要改):
Please select the redis port for this instance: [6379]
说明:选择端口。
操作:直接回车(用默认 6379)。
Please select the redis config file name [/etc/redis/6379.conf]
说明:配置文件路径。
操作:直接回车。
Please select the redis log file name [/var/log/redis_6379.log]
说明:日志文件路径。
操作:直接回车。
Please select the data directory [/var/lib/redis/6379]
说明:数据存放目录。
操作:直接回车。
Please select the redis executable path [/usr/local/bin/redis-server]
说明:redis-server 命令在哪里。如果你刚才执行了
make install,它会自动识别。操作:直接回车。
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_63795. 学习总结:这个脚本到底干了啥?
配置:
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 会执行一套标准的流程:
停止接受新的客户端写入。
强制执行一次 RDB 持久化:它会把内存里当前所有的数据,同步写入到硬盘上的 dump.rdb 文件中。
只有当文件写完、落盘成功后,进程才会真正退出。
结果:下次启动时,所有数据都在。
当已经使用systemd时,应该用systemctl stop代替redis-cli shutdown,来shutdown redis-server,以免systemd认为redis异常退出。
登录
redis-cli -h 192.168.88.50 -p 6350 -a 123456
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)时,它会检查两个条件。只有当这两个条件同时满足时,保护模式才会生效(即拒绝任何外部连接):
没有绑定具体 IP:没有在配置文件里显式设置
bind参数(或者把bind这一行注释掉了)。没有设置密码:没有在配置文件里设置
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.rdbRDB数据恢复:如果需要手动恢复,将备份的rdb文件拷贝到dir目录,重启即可
如果 Redis 配置文件里开启了 AOF (appendonly yes)。Redis 启动时,会优先加载 AOF 文件,直接无视 RDB 文件。
如果文件是用 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
启用AOF
config set appendonly yes验证是否开启成功
config get appendonly
# 输出:1) "appendonly" 2) "yes"。说明配置修改成功。固定化配置写入到文件
config rewrite查看 AOF 文件的名字
config get appendfilename
#(默认是 appendonly.aof,但在 Redis 7.0+ 变了)查看刷盘策略(配置文件中的appendfsync)
config get appendfsync
# 结果是 everysec(默认每秒刷盘一次,兼顾性能和安全)。
# always 每执行一条,写命令,性能开销很大
# no 由linux内核来决定没写到硬盘的数据什么时候保存,一般为30秒一次,redis作缓存常用退出并检查生成的 AOF 文件 (图中最下面的红框)
ls /var/lib/redis/6379/appendonlydir/
appendonly.aof.1.base.rdb
appendonly.aof.1.incr.aof
appendonly.aof.manifestBase 文件 (
.base.rdb):这是基础数据。它其实是一个 RDB 格式的文件(为了省空间和加载快),代表了 AOF 重写那一刻的全量数据(启用AOF时已有的数据)。Incr 文件 (
.incr.aof):这是增量文件。从生成 Base 文件之后,新产生的写命令(SET, DEL等)都记在这里。这是纯文本日志。Manifest 文件 (
.manifest):清单文件。用来管理上面那一堆文件,告诉 Redis 哪个是 Base,哪个是 Incr,按什么顺序加载。
AOF恢复数据
确保配置文件 redis.conf 里设置了 appendonly yes。
确保 dir 指向的目录是对的(比如 /var/lib/redis/)
systemctl stop redis
清空 /var/lib/redis/ 下原本的内容(如果有自动生成的空 AOF 目录,删掉它)。
把你备份的 appendonlydir 文件夹整个复制进去。结构必须保持原样:目录里必须包含 manifest 文件和对应的 .aof / .rdb 文件。
注意Redis用户是root还是其他的什么,chown -R redis:redis /var/lib/redis/,如果权限不对,Redis 启动时读不到文件,会直接报错退出或者创建一个新的空文件覆盖掉。
systemctl start redis
查看日志 /var/log/redis/redis.log,你会看到类似 DB loaded from append only file: ... seconds 的提示。
如果 AOF 文件最后一部分写坏了(比如断电导致最后一行命令残缺),Redis 启动时会报错拒绝启动。可以使用自带的修复工具:把文件末尾损坏的那一点点数据切掉,保证文件格式合法
redis-check-aof --fix appendonly.aof6.Redis主从
Master (主角色):
一个 Redis什么都不配置的情况下,默认就是 Master
只有它能写数据(默认情况下)。
SET、DEL等命令必须发给它。
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端口。
主从结构
一主多从:
从节点均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 集群)