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 2 3
| net.core.somaxconn = 10240 vm.overcommit_memory = 1
|
net.core.somaxconn :TCP 全连接队列长度
vm.overcommit_memory:内存分配策略,这个如果没修改,可能会引起 RDB 快照 操作失败,数据丢失
立即生效并验证
1.2 编译安装
一台机器编译,之后将编译产物 scp 到目标机器即可。
- 安装依赖环境
- 下载,以
7.4.7 版本为例。
官方地址地址
1
| wget https://download.redis.io/releases/redis-7.4.7.tar.gz
|
- 解压
1
| tar xf redis-7.4.7.tar.gz -C /usr/local
|
- 进去指定文件夹
1
| cd /usr/local/redis-7.4.7
|
- 编译安装,
-j 指定编译时的 CPU 数量,加速编译。
1
| make -j 2 && make install
|
1.3 验证
- 默认安装在
/usr/local/bin 下
1
| ls -l /usr/local/bin/redis*
|
- 验证版本,
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 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
| redis-server /etc/redis.conf
|
- 使用
systemd 启动
二、常用数据类型的基本操作
常用数据类型
2.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 格式连接
- 也可以进入
redis-cli 后输入密码
2.2 字符串操作
类比 Python 中的字典。
- 设置键值对
- 获取
key 的值
- 删除
key
- 非交互式操作
Redis
1
| redis-cli -a redispwd SET Name Alice
|
1
| redis-cli -a redispwd GET Name
|
注意:
- 命令不区分大小写,
set 等于 SET
key 区分大小写,name 不等于 Name
- 大写模式可
TAB 补全命令
shell 脚本批量写入数据
1
| for i in $(seq -w 10);do redis-cli -a redispwd SET key${i} Value${i};done
|
2.3 列表操作
数组对象,可以重复,有顺序。
- 右添加元素
- 左添加元素
- 查看列表
1
| LRANGE <列表名> <起始位置> <终止位置>
|
- 右弹出,从右边删除
n 个元素,并显示(先显示最右边的)
1
| RPOP <列表名> <弹出元素的数量,默认值1>
|
- 左弹出,从左边删除
n 个元素,并显示(先显示最右边的)
1
| LPOP <列表名> <弹出元素的数量,默认值1>
|
2.4 集合操作
集合没有顺序,不可重复。
- 添加元素
- 列出所有的元素
- 删除指定的元素
- 随机弹出元素
- 判断元素是否在集合中
(integer) 1 代表在集合中
(integer) 0 代表不在集合中
2.5 哈希
多个键值对的组合。
- 写入
hash 对象
1 2 3 4
| hset people name alice hset people age 19 hset people sex man hset people location taiyuan
|
- 获取
hash 所有的 key 和值
- 获取
hash 对象的某个 key 的值
- 删除整个
hash 对象
- 删除
hash 对象的某个 key
2.6 发布订阅
- 订阅一个频道
- 往频道发生消息
1
| publish fabu "this is a test message"
|
三、切换数据库及运维监控命令
3.1 数据库操作
Redis 默认有16个库,默认登录后在 0 库。不同的库数据是独立的。
- 验证库的数量,或在配置文件中查看
- 切换数据库
3.2 运维监控命令
查看 key
查看所有的 key (危险命令,谨慎操作),数据量大的时候容易卡死
随机获取一个 key
获取最多 11 个key,会返回下一个编号,依次类推,可以遍历全部 key(直到返回 0`)
- 实时获取
Redis 的状态
1
| redis-cli -a redispwd --stat
|
keys 键的数量
mem 内存占用
clients 当前连接数
blocked 被阻塞的客户端
requests 请求数量
connections 累计连接数
- 实时查看
redis 的操作(实时查看执行的命令)
1
| redis-cli -a redispwd monitor
|
- 获取系统的当前状态(一瞬间的状态)
1
| redis-cli -a redispwd info
|
1
| redis-cli -a redispwd info <模块名>
|
Server 服务端信息
Client 客户端信息
Memory 内存占用
Persistence 持久化存储信息
Stats 状态信息,(监控重点)
Replication 主从状态监控和哨兵信息
CPU ,sys、user 占用
Cluster Redis 集群信息
Keyspace 键的分布信息,key 的分布的库和过期时间等信息
四、配置的动态更新
有两份配置
- 一份在磁盘,修改生效需重启
Redis
- 一份在内存,大部分配置可直接修改,但是临时生效,不过可以写回磁盘。
- 获取某个配置
- 修改某个配置项
1
| config set maxclients 20000
|
- 将配置写回磁盘
五、多用户管理
感觉不那么重要,让 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 文件 (推荐生产环境)
在 redis.conf 中开启独立文件支持:
1
| aclfile /etc/redis/users.acl
|
在命令行配置好用户后,执行保存命令:
这会将内存中的所有用户规则写入 users.acl 文件。
5.5 操作流程总结
假设你要上线一个新业务:
管理员登录:
redis-cli -a default_password
创建用户:
ACL SETUSER new_biz on >strong_pass ~biz:* +@read +@write
验证用户:
AUTH new_biz strong_pass
GET biz:1 (成功)
FLUSHDB (报错:无权限)
保存配置:
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 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 条慢日志。
- 获取慢日志,默认获取
10 条。
- 获取所有慢日志的数量
- 清空慢日志
- 日志各个字段阶段
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 的有效期
- 创建
key 的同时,设置 key 的有效期,单位是秒
- 给已有的
key 设置有效期
- 查看有效期
七、禁用危险命令和压测
7.1 禁用危险命令
- 编辑配置文件
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
|
重定向到文件中分析
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 50 parallel clients 3 bytes payload
。。。。。 Latency by percentile distribution 0.00% <= 0.1 milliseconds 50.00% <= 0.2 milliseconds 95.00% <= 0.5 milliseconds 99.00% <= 1.2 milliseconds 99.90% <= 5.0 milliseconds 100.00% <= 20 milliseconds
Cumulative distribution of latencies 0.000% <= 0.1 milliseconds 80.000% <= 0.3 milliseconds 98.500% <= 1.0 milliseconds 100.000% <= 20 milliseconds
Summary: throughput summary: 95238.10 requests per second latencies summary: avg: 0.245 ms p50: 0.239 ms p99: 0.815 ms
|
八、数据持久化
Redis 有两种数据持久化方式,一种是 RDB 快照,另一种是 AOF日志。
8.1 RDB 快照
默认是开启的。
- 查看存储设置的路径
- 查看快照文件的名称
- 获取快照的存储策略
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次变化就保存
- 查看
RDB 快照是否需要压缩
1
| CONFIG GET rdbcompression
|
8.2 AOF 日志
默认是关闭的,测试时可关闭RDB快照,防止互相影响。
- 查看
AOF 日志开关。
AOF 日志的重写,否则文件会越来越大
什么是大 Key ?
字符串特别长,获取列表中元素数量特别多的 key
- 扫描大
key,redis7 版本的显示更加友好。
1
| redis-cli -a redispwd --bigkeys
|
使用rdbtools 工具分析。需要使用 python3
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主2从3哨兵)
- 编辑配置文件(所有节点)防止主挂掉重新加入后,是从的身份,同步不了新主的数据。
- 哨兵配置文件
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
| redis-sentinel /etc/sentinel.conf
|
- 手动进行一次故障转移(如需要)
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
|
- 创建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 2
| redis-cli -a redispwd -p 7001 cluster info redis-cli -a redispwd -p 7001 cluster nodes
|
- 集群方式登录
1
| redis-cli -p 7000 -a redispwd -c
|
- 添加从节点,(为了防止单机故障,主从不要设置在同一台机器上)
1 2 3 4 5 6
| redis-cli -a redispwd \ --cluster add-node \ --cluster-slave \ --cluster-master-id <master的id> \ 从节点的ip:端口 \ 主节点的ip:端口
|
- 手动切换主从,(在从上操作)
1
| redis-cli -a redispwd -p 7002 -c
|
- 初始化时就指定从节点的数量
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 2 3 4
| redis-cli -a redispwd \ --cluster add-node \ 新的节点的ip:端口 \ 老的节点的ip:端口
|
- 添加新的从节点
1 2 3 4 5 6
| redis-cli -a redispwd \ --cluster add-node \ --cluster-slave \ --cluster-master-id <master的id> \ 从节点的ip:端口 \ 主节点的ip:端口
|
- 给新的主节点分配槽位,否则不会存储任何数据
1
| redis-cli -a redispwd --cluster reshard 集群的任意主机:端口
|
按照提示分配槽位,可以从一个或多个旧节点分配,结束时输入 done
13.2 删除旧节点
为了保护数据,无法删除有槽位的主节点。需要先迁移槽位。
- 删除新主节点的从库
1
| redis-cli -a redispwd --cluster del-node 对应主库的ip:主端口 对应从库的id
|
- 移除主库
1
| redis-cli -a redispwd --cluster del-node 随便一个其他主节点:主端口 要移除主节点的id
|
- 重新分配槽位,按照提示分配
1
| redis-cli -a redispwd --cluster reshard 集群的任意主机:端口
|