CentOS7下Redis7.0手册

做一个手册,方便之后查阅使用各种命令。

一、安装配置启动

1.1 环境准备

主机名 ip地址 端口 角色 系统
redis01 192.168.10.101 7001、7002 master、slave centos7
redis02 192.168.10.102 7001、7002 master、slave centos7
redis03 192.168.10.103 7001、7002 master、slave centos7
redis04 192.168.10.104 7001、7002 master、slave centos7

配置 hosts 解析

1
2
3
4
5
6
cat >> /etc/hosts <<EOF
192.168.10.101 redis01
192.168.10.102 redis02
192.168.10.103 redis03
192.168.10.104 redis04
EOF

1.1.2 生产环境参数调优

  1. 调整最大文件打开数(文件句柄),退出终端重新登录生效
1
2
# vim /etc/security/limits.conf
* - nofile 65535

​ 验证

1
ulimit -n
  1. 内核参数修改
1
2
3
# vim /etc/sysctl.conf
net.core.somaxconn = 10240
vm.overcommit_memory = 1
  • net.core.somaxconn :TCP 全连接队列长度
  • vm.overcommit_memory:内存分配策略,这个如果没修改,可能会引起 RDB 快照 操作失败,数据丢失

​ 立即生效并验证

1
sysctl -p

1.2 编译安装

一台机器编译,之后将编译产物 scp 到目标机器即可。

  1. 安装依赖环境
1
yum install gcc make -y
  1. 下载,以 7.4.7 版本为例。
    官方地址地址
1
wget https://download.redis.io/releases/redis-7.4.7.tar.gz
  1. 解压
1
tar xf redis-7.4.7.tar.gz -C /usr/local
  1. 进去指定文件夹
1
cd /usr/local/redis-7.4.7
  1. 编译安装,-j 指定编译时的 CPU 数量,加速编译。
1
make -j 2 && make install

1.3 验证

  1. 默认安装在 /usr/local/bin
1
ls -l /usr/local/bin/redis*
  1. 验证版本,sudo su 提权后的环境变量缺失,建议使用 su
1
2
redis-server -v
redis-server --version

1.4 安装到其余机器

1
scp /usr/local/bin/redis*    root@redis02:/usr/local/bin/
1
scp /usr/local/bin/redis*    root@redis03:/usr/local/bin/
1
scp /usr/local/bin/redis*    root@redis04:/usr/local/bin/

1.5 基础配置

1
vim /etc/redis.conf
1
2
3
4
5
6
7
bind 0.0.0.0
port 6379
dir /data/redis
requirepass redispwd
pidfile "redis.pid"
logfile "redis.log"
daemonize yes
  • bind 建议监听业务网卡
  • port 端口号
  • dir 数据目录
  • requirepass 设置密码
  • pidfile 进程号文件
  • logfile 日志文件
  • daemonize 后台运行

1.6 使用 systemd 管理

1
vim /usr/lib/systemd/system/redis.service
1
2
3
4
5
6
7
8
[Unit]
Description=redis
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
[Install]
WantedBy=multi-user.target

1.7 启动

  1. 创建数据目录,否则无法启动成功
1
mkdir -pv /data/redis
  1. 单个命令启动
1
redis-server /etc/redis.conf
  1. 使用 systemd 启动
1
systemctl start redis
1
systemctl status redis
1
systemctl stop redis
1
systemctl restart redis

二、常用数据类型的基本操作

常用数据类型

  • 字符串
  • 列表、集合
  • hash 哈希、发布和订阅

2.1 登录

  1. redis-cli 登录时输入密码
1
redis-cli
1
redis-cli -h 127.0.0.1 -p 6379
1
redis-cli -h 127.0.0.1 -p 6379 -a redispwd
1
redis-cli -h 127.0.0.1 -p 6379 --user default -a redispwd
1
redis-cli -u redis://default:redispwd@127.0.0.1:6379
  • -h 指定主机名
  • -p 指定端口号
  • --user 指定用户名,redis 6 开始可以设置用户名,默认用户名 default
  • -a 指定密码,默认用户 default
  • -u 使用 URI 格式连接
  1. 也可以进入 redis-cli 后输入密码
1
redis-cli
1
auth 密码
1
auth 用户名 密码

2.2 字符串操作

类比 Python 中的字典。

  1. 设置键值对
1
set name alice
  1. 获取 key 的值
1
get name
  1. 删除 key
1
del name
  1. 非交互式操作Redis
1
redis-cli -a redispwd SET Name Alice
1
redis-cli -a redispwd GET Name

注意

  • 命令不区分大小写,set 等于 SET
  • key 区分大小写,name 不等于 Name
  • 大写模式可 TAB 补全命令
  1. shell 脚本批量写入数据
1
for i in $(seq -w 10);do redis-cli -a redispwd SET key${i} Value${i};done

2.3 列表操作

数组对象,可以重复,有顺序。

  1. 右添加元素
1
RPUSH <列表名> <元素>
1
RPUSH names s1
  1. 左添加元素
1
LPUSH <列表名> <元素>
1
LPUSH names s1
  1. 查看列表
1
LRANGE <列表名> <起始位置> <终止位置>
1
lrange names 1 -1
  1. 右弹出,从右边删除 n 个元素,并显示(先显示最右边的)
1
RPOP <列表名> <弹出元素的数量,默认值1>
1
rpop names
  1. 左弹出,从左边删除 n 个元素,并显示(先显示最右边的)
1
LPOP <列表名> <弹出元素的数量,默认值1>
1
lpop names

2.4 集合操作

集合没有顺序,不可重复。

  1. 添加元素
1
SADD <集合名> <元素1> <元素2>
1
sadd jh ys1
  1. 列出所有的元素
1
SMEMBERS <集合名>
1
smembers jh
  1. 删除指定的元素
1
SREM <集合名> <元素1> <元素2>
1
srem jh ys1
  1. 随机弹出元素
1
SPOP <集合名> <弹出元素的数量>
1
spop jh
  1. 判断元素是否在集合中
1
SISMEMBER <集合名> <元素1>
1
sismember jh 1
  • (integer) 1 代表在集合中
  • (integer) 0 代表不在集合中

2.5 哈希

多个键值对的组合。

  1. 写入 hash 对象
1
HSET <对象名> <键> <值>
1
2
3
4
hset people name alice
hset people age 19
hset people sex man
hset people location taiyuan
  1. 获取 hash 所有的 key 和值
1
HGETALL <对象名>
1
hgetall people
  1. 获取 hash 对象的某个 key 的值
1
HGET <对象名> <键>
1
hget people name
  1. 删除整个 hash 对象
1
DEL <对象名>
1
del people
  1. 删除 hash 对象的某个 key
1
HDEL <对象名> <key>
1
hdel people age

2.6 发布订阅

  1. 订阅一个频道
1
SUBSCRIBE <频道名>
1
subscribe fabu
  1. 往频道发生消息
1
PUBLISH <频道名> <消息>
1
publish fabu "this is a test message"

三、切换数据库及运维监控命令

3.1 数据库操作

Redis 默认有16个库,默认登录后在 0 库。不同的库数据是独立的。

  1. 验证库的数量,或在配置文件中查看
1
CONFIG GET databases
  1. 切换数据库
1
SELECT <库名>
1
select 1

3.2 运维监控命令

  1. 查看 key

    查看所有的 key危险命令,谨慎操作),数据量大的时候容易卡死

1
KEYS *

​ 随机获取一个 key

1
RANDOMKEY

​ 获取最多 11key,会返回下一个编号,依次类推,可以遍历全部 key(直到返回 0`)

1
SCAN 0
  1. 实时获取 Redis 的状态
1
redis-cli -a redispwd --stat
  • keys 键的数量
  • mem 内存占用
  • clients 当前连接数
  • blocked 被阻塞的客户端
  • requests 请求数量
  • connections 累计连接数
  1. 实时查看 redis 的操作(实时查看执行的命令)
1
redis-cli -a redispwd monitor
  1. 获取系统的当前状态(一瞬间的状态)
1
redis-cli -a redispwd info
1
redis-cli -a redispwd info <模块名>
  • Server 服务端信息
  • Client 客户端信息
  • Memory 内存占用
  • Persistence 持久化存储信息
  • Stats 状态信息,(监控重点
  • Replication 主从状态监控和哨兵信息
  • CPUsysuser 占用
  • Cluster Redis 集群信息
  • Keyspace 键的分布信息,key 的分布的库和过期时间等信息

四、配置的动态更新

有两份配置

  • 一份在磁盘,修改生效需重启 Redis
  • 一份在内存,大部分配置可直接修改,但是临时生效,不过可以写回磁盘。
  1. 获取某个配置
1
CONFIG GET <某个配置项>
1
config get maxclients
  1. 修改某个配置项
1
CONFIG SET <配置项> <配置值>
1
config set maxclients 20000
  1. 将配置写回磁盘
1
CONFIG REWRITE

五、多用户管理

感觉不那么重要,让 AI 生产一个简易的手册,用的时候再对着操作。

老版本没有用户名,只有密码

Redis6 已经有用户名,默认用户名 default.

5.1 核心命令概览

命令 作用 示例
ACL SETUSER 创建或修改用户(核心) ACL SETUSER alice ...
ACL LIST 查看当前所有用户及其权限规则 ACL LIST
ACL GETUSER 查看特定用户的详细权限 ACL GETUSER alice
ACL DELUSER 删除用户 ACL DELUSER alice
ACL WHOAMI 查看当前连接是以哪个身份登录的 ACL WHOAMI
ACL CAT 查看命令类别(方便按组授权) ACL CAT (列出所有类别), ACL CAT read

5.2 权限规则语法详解 (ACL Rules)

ACL SETUSER 后面跟随的规则决定了用户的生杀大权。规则主要分为四类:

A. 状态与密码

  • on:启用用户。
  • off:禁用用户(禁止登录,但保留配置)。
  • >密码:添加密码(例如 >123456)。
  • <密码:移除密码(例如 <123456)。
  • nopass:允许无密码登录。

B. Key 访问权限 (操作哪些数据)

  • ~*:允许访问所有的 Key。
  • ~cache:*:只允许访问以 cache: 开头的 Key。
  • resetkeys:清空当前允许的 Key 规则(重置为不可访问任何 Key)。

C. 命令执行权限 (能做什么动作)

  • +@all:允许执行所有命令。
  • +set:允许执行 SET 命令。
  • +@read:允许执行所有“读”类命令(通过 ACL CAT 查看分类)。
  • -keys禁止执行 KEYS 命令(即使前面允许了 @read,这里也可以单独剔除)。
  • -@dangerous:禁止执行危险命令(如 FLUSHDB, SHUTDOWN 等)。

D. Pub/Sub 频道权限 (Redis 6/7 略有不同)

  • &channel1:允许订阅/发布 channel1
  • &*:允许操作所有频道。

5.3 实战案例 (直接复制可用)

场景一:创建一个超级管理员 (Admin)

和默认的 default 账号一样强大,但有独立的密码。

1
2
# 用户名: admin, 密码: mypass, 权限: 所有Key, 所有命令
ACL SETUSER admin on >mypass ~* +@all

场景二:创建一个只读账号 (Monitoring/Reader)

用于监控系统或只读缓存服务,防止误删数据。

1
2
# 用户名: reader, 密码: readpass, 权限: 所有Key, 只能读, 禁止危险操作
ACL SETUSER reader on >readpass ~* +@read -@dangerous

场景三:创建一个受限的应用账号 (App Specific)

假设你的应用只通过 app: 前缀存取数据,且不需要管理类命令。

1
2
3
4
# 用户名: app_user, 密码: app_pass
# 限制: 只能访问 app:* 开头的Key
# 限制: 只能读写(read+write), 禁止 keys 命令(防止扫描全库)
ACL SETUSER app_user on >app_pass ~app:* +@read +@write -keys

5.4 如何保存配置?(重要)

通过命令行 ACL SETUSER 创建的用户是内存生效的,重启 Redis 就会消失。你有两种方式持久化:

方式 A:写入 redis.conf (不推荐频繁修改)

直接编辑配置文件:

1
2
# redis.conf
user worker on >123456 ~queue:* +@all

方式 B:使用外部 ACL 文件 (推荐生产环境)

  1. redis.conf 中开启独立文件支持:

    1
    aclfile /etc/redis/users.acl
  2. 在命令行配置好用户后,执行保存命令:

    1
    ACL SAVE

    这会将内存中的所有用户规则写入 users.acl 文件。


5.5 操作流程总结

假设你要上线一个新业务:

  1. 管理员登录:

    redis-cli -a default_password

  2. 创建用户:

    ACL SETUSER new_biz on >strong_pass ~biz:* +@read +@write

  3. 验证用户:

    AUTH new_biz strong_pass

    GET biz:1 (成功)

    FLUSHDB (报错:无权限)

  4. 保存配置:

    ACL SAVE

5.6 常见问题 (Q&A)

  • Q: 我搞乱了 default 用户怎么办?
    • A: ACL SETUSER default on ~* +@all 可以把 default 恢复成超级管理员状态。
  • Q: 怎么修改密码?
    • A: 再次执行 ACL SETUSER alice >new_password 即可添加新密码(Redis 支持一个用户有多个密码,如果要替换,建议先 <old_password 移除旧的)。
  • Q: 为什么我设置了用户还是提示 NOAUTH?
    • A: 检查用户状态是不是 off,或者密码输错了。

这手册包含了 90% 日常开发运维需要的知识,建议保存备用。

六、慢日志和 key 的有效期

6.1 慢日志

  1. 查看慢日志的默认配置
1
CONFIG GET slow*
1
2
3
4
5
6
127.0.0.1:6379> CONFIG GET slow*
1) "slowlog-log-slower-than"
2) "10000"
3) "slowlog-max-len"
4) "128"
127.0.0.1:6379>
  • 10000 代表 10 毫秒
  • 128 最多记录 128 条慢日志。
  1. 获取慢日志,默认获取 10 条。
1
SLOWLOG GET <日志数量>
  1. 获取所有慢日志的数量
1
SLOWLOG LEN
  1. 清空慢日志
1
SLOWLOG RESET
  1. 日志各个字段阶段
1
2
3
4
5
6
7
8
9
127.0.0.1:6379> SLOWLOG get 1
1) 1) (integer) 58426
2) (integer) 1767011384
3) (integer) 3
4) 1) "get"
2) "name031564"
5) "127.0.0.1:50550"
6) ""
127.0.0.1:6379>
  • (integer) 58426 日志唯一 ID
  • (integer) 1767011384 日志产生的时间戳
  • (integer) 3 执行耗时,单位微秒
  • "get" 2) "name031564" 具体的命令和参数
  • "127.0.0.1:50550" 客户端地址
  • "" 客户端名称,可通过 CLIENT SETNAME 命令设置

6.2 key 的有效期

  1. 创建 key 的同时,设置 key 的有效期,单位是秒
1
SET <key> <value> EX 秒数
1
SET name alice ex 20
  1. 给已有的 key 设置有效期
1
EXPIRE <key的名称> 秒数
1
expire name 200
  1. 查看有效期
1
TTL <key>
1
ttl name

七、禁用危险命令和压测

7.1 禁用危险命令

  1. 编辑配置文件
1
vim /etc/redis.conf
1
2
3
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""

7.2 压测工具

默认使用 50 个并发,100000 个请求

1
redis-benchmark -a redispwd -c 50 -n 100000
  • -a 密码,
  • -c 并发
  • -n 总请求数

重定向到文件中分析

1
redis-benchmark -a redispwd -c 50 -n 100000 | tee /tmp/yace.txt

关键分析日志,会测试多个命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
====== PING_INLINE ======
100000 requests completed in 0.66 seconds # 一共处理了10万个PING请求,在0.66秒中完成
50 parallel clients # 50个并发
3 bytes payload # 每个请求3字节

。。。。。
Latency by percentile distribution # (分位数值分布)
0.00% <= 0.1 milliseconds # (最快的一个请求,0.1ms就搞定了)
50.00% <= 0.2 milliseconds # (中位数/P50:一半的请求都在 0.2ms 内完成)
95.00% <= 0.5 milliseconds # (P95:95% 的请求都在 0.5ms 内完成,绝大多数很快)
99.00% <= 1.2 milliseconds # (P99:99% 的都还行,但剩下的 1% 开始变慢了)
99.90% <= 5.0 milliseconds # (P99.9:千分之一的请求卡到了 5ms)
100.00% <= 20 milliseconds # (最慢的那个倒霉蛋,用了 20ms)


Cumulative distribution of latencies # (延迟累积分布)
0.000% <= 0.1 milliseconds
80.000% <= 0.3 milliseconds # 80% 的请求都在 0.3ms 内做完了
98.500% <= 1.0 milliseconds # 98.5% 的请求在 1ms 内做完了
100.000% <= 20 milliseconds # 所有的请求都在 20ms 内做完了


Summary:
throughput summary: 95238.10 requests per second
latencies summary:
avg: 0.245 ms # Avg (平均耗时):
p50: 0.239 ms # (分位数值分布) 的 前50%
p99: 0.815 ms # (分位数值分布) 的 前99%

八、数据持久化

Redis 有两种数据持久化方式,一种是 RDB 快照,另一种是 AOF日志。

8.1 RDB 快照

默认是开启的。

  1. 查看存储设置的路径
1
CONFIG GET dir
  1. 查看快照文件的名称
1
CONFIG GET dbfilename
  1. 获取快照的存储策略
1
CONFIG GET SAVE
1
2
3
4
127.0.0.1:6379> CONFIG GET SAVE
1) "SAVE"
2) "3600 1 300 100 60 10000"
127.0.0.1:6379>
  • 3600 1 3600秒内有1次变化就保存
  • 300 100 300秒内有100次变化就保存
  • 60 10000 60秒内有10000次变化就保存
  1. 查看 RDB 快照是否需要压缩
1
CONFIG GET rdbcompression

8.2 AOF 日志

默认是关闭的,测试时可关闭RDB快照,防止互相影响。

  1. 查看 AOF 日志开关。
1
CONFIG GET appendonly
  1. AOF 日志的重写,否则文件会越来越大
  • 手动重写
1
BGREWRITEAOF
  • 自动重写,查看自动重写的条件
1
CONFIG GET *aof*

九、rdbtools 分析大key

什么是大 Key

字符串特别长,获取列表中元素数量特别多的 key

  1. 扫描大 keyredis7 版本的显示更加友好。
1
redis-cli -a redispwd --bigkeys

使用rdbtools 工具分析。需要使用 python3

1
yum install python3 -y
1
pip3 install rdbtools==0.1.15 -i https://mirrors.aliyun.com/pypi/simple/
1
rdb -c memory dump.rdb > /tmp/fenxi.csv

十、主从复制

单台机器有单点故障,宕机容易丢失数据,可以做主从,从复制主的所有的数据,主宕机后,手动或提升为主。从库只能读,不能写。

如果需要自动主从切换,需要引入哨兵。

从库需要添加配置,指向主

1
2
slaveof 192.168.10.101 6379 
masterauth "redispwd"

主从通用配置

1
2
3
4
5
6
7
bind 0.0.0.0
port 6379
dir "/data/redis"
requirepass "redispwd"
pidfile "redis.pid"
logfile "redis.log"
daemonize yes

启动后验证,同时可验证数据是否同步

1
info replication

十一、哨兵模式

哨兵,让主从能够自动切换,由哨兵来监控主的状态,出现故障时自动切换主从。为了防止哨兵的单点故障、偶尔选举新主不成功,所有一般使用三个哨兵节点。(1主2从3哨兵)

  1. 编辑配置文件(所有节点)防止主挂掉重新加入后,是从的身份,同步不了新主的数据。
1
vim /etc/redis.conf
1
masterauth "redispwd"
  1. 哨兵配置文件
1
vim /etc/sentinel.conf
1
2
3
4
5
6
7
8
9
bind 0.0.0.0
daemonize yes
port 26379
dir "/tmp"
logfile "sentinel.log"
sentinel monitor testmaster 192.168.10.101 6379 2
sentinel auth-pass testmaster redispwd
sentinel down-after-milliseconds testmaster 5000
sentinel failover-timeout testmaster 18000
  • sentinel monitor testmaster 192.168.10.101 6379 2
    • testmaster 主节点的别名
    • 2 需要两个节点投标
  • sentinel auth-pass testmaster redispwd,连接主节点时的密码
  • sentinel down-after-milliseconds testmaster 5000,5秒不回复代表下线
  • sentinel failover-timeout testmaster 18000,切换动作的最长等待时长 18秒
  1. 启动哨兵
1
redis-sentinel /etc/sentinel.conf
  1. 手动进行一次故障转移(如需要)
1
redis-cli -p 26379
1
sentinel failover testmaster

十二、分片集群搭建和高可用故障切换

主从的缺点是,一台数据库复制所有的数据,即 16384 个卡槽,容易成为性能瓶颈,此时可以存在多个主,每个主复制一部分数据,同时都有一个从,防止任意主故障后丢失数据。

环境准备及简单案例可查看这篇文章

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mkdir -pv /data/redis/{7001,7002}

cat > /data/redis/7001/redis.conf <<EOF
port 7001
bind 0.0.0.0
requirepass "redispwd"
protected-mode no
daemonize yes
pidfile /var/run/redis_7001.pid
dir /data/redis/7001
appendonly yes
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
EOF

cp /data/redis/7001/redis.conf /data/redis/7002/redis.conf
sed -i 's/7001/7002/g' /data/redis/7002/redis.conf
1
2
redis-server /data/redis/7001/redis.conf
redis-server /data/redis/7002/redis.conf
  1. 创建3主集群
1
2
3
4
redis-cli -a redispwd --cluster create \
192.168.10.101:7001 \
192.168.10.102:7001 \
192.168.10.103:7001
  1. 查看集群的相关信息
1
2
redis-cli -a redispwd -p 7001 cluster info
redis-cli -a redispwd -p 7001 cluster nodes
  1. 集群方式登录
1
redis-cli -p 7000 -a redispwd -c
  • -c 以集群方式写入,否则无法写入
  1. 添加从节点,(为了防止单机故障,主从不要设置在同一台机器上)
1
2
3
4
5
6
redis-cli -a redispwd \
--cluster add-node \
--cluster-slave \
--cluster-master-id <master的id> \
从节点的ip:端口 \
主节点的ip:端口
  1. 手动切换主从,(在从上操作)
1
redis-cli -a redispwd -p 7002 -c
1
CLUSTER FAILOVER
  1. 初始化时就指定从节点的数量
1
2
3
4
5
redis-cli --cluster create \
192.168.10.101:7001 192.168.10.101:7002 \
192.168.10.102:7001 192.168.10.102:7002 \
192.168.10.103:7001 192.168.10.103:7002 \
--cluster-replicas 1
  • --cluster-replicas 代表给每个主节点分配从节点的数量
  • 会智能将主从分配到不同主机上

十三、添加删除 master 节点

查看集群信息

1
2
redis-cli -a redispwd -p 7001 cluster info
redis-cli -a redispwd -p 7001 cluster nodes

13.1 添加新节点

  1. 添加主节点,(在集群的任意一台节点操作)
1
2
3
4
redis-cli -a redispwd \
--cluster add-node \
新的节点的ip:端口 \
老的节点的ip:端口
  1. 添加新的从节点
1
2
3
4
5
6
redis-cli -a redispwd \
--cluster add-node \
--cluster-slave \
--cluster-master-id <master的id> \
从节点的ip:端口 \
主节点的ip:端口
  1. 给新的主节点分配槽位,否则不会存储任何数据
1
redis-cli -a redispwd --cluster reshard 集群的任意主机:端口

按照提示分配槽位,可以从一个或多个旧节点分配,结束时输入 done

13.2 删除旧节点

为了保护数据,无法删除有槽位的主节点。需要先迁移槽位。

  1. 删除新主节点的从库
1
redis-cli -a redispwd --cluster del-node 对应主库的ip:主端口 对应从库的id
  1. 移除主库
1
redis-cli -a redispwd --cluster del-node 随便一个其他主节点:主端口  要移除主节点的id
  1. 重新分配槽位,按照提示分配
1
redis-cli -a redispwd --cluster reshard 集群的任意主机:端口