第一章 Redis 安装验证与原生连接

安装 Redis 后,首要任务是通过redis-cli(Redis 自带命令行客户端)验证服务可用性,并掌握基础连接参数与配置查看方式。

1.1 安装后基础验证(redis-cli 核心命令)

无论通过yum/apt/ 源码编译安装,Redis 均默认自带redis-cli工具,直接在终端执行以下命令验证服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1. 本地连接(默认端口6379,无密码时)
redis-cli
# 成功连接后会显示Redis服务地址与端口,提示符如下:
127.0.0.1:6379>

# 2. 验证服务存活(核心命令:PING)
127.0.0.1:6379> PING
# 返回结果:PONG(表示服务正常运行)

# 3. 查看Redis版本(核心命令:INFO server)
127.0.0.1:6379> INFO server
# 关键输出(截取版本信息):
redis_version:6.2.6 # Redis版本
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:abc123def456
redis_mode:standalone # 运行模式(单机)
os:Linux 3.10.0-1160.el7.x86_64 x86_64 # 操作系统
process_id:1234 # Redis进程ID(PID)

# 4. 退出命令行(两种方式)
127.0.0.1:6379> QUIT # 方式1:显式退出
# 或
127.0.0.1:6379> Ctrl+C # 方式2:快捷键强制退出

1.2 带认证与远程连接(redis-cli 参数配置)

生产环境中 Redis 通常开启密码认证或需远程连接,redis-cli支持通过命令行参数指定连接信息,无需进入交互模式后再操作:

参数(英文) 中文解释 示例
-h 指定 Redis 服务 IP 地址 redis-cli -h 192.168.1.100(连接远程 IP)
-p 指定 Redis 服务端口 redis-cli -p 6380(连接非默认端口 6380)
-a 指定访问密码(简化认证) redis-cli -a YourStrongPass123(直接带密码连接)
-n 指定数据库编号(默认 0-15) redis-cli -n 1(连接第 1 个数据库)
-c 集群模式连接(后续集群章节用) redis-cli -c -h 192.168.1.100 -p 6379

实战示例:远程连接带密码的 Redis 服务,并指定数据库:

1
2
3
4
5
6
# 完整命令:远程IP+端口+密码+数据库
redis-cli -h 192.168.1.100 -p 6379 -a YourStrongPass123 -n 2

# 连接后验证:查看当前数据库的键数量(命令:DBSIZE)
192.168.1.100:6379[2]> DBSIZE
(integer) 0 # 表示当前数据库(第2个)无键

注意:-a参数会在命令行历史中暴露密码,生产环境更安全的方式是先连接再执行AUTH命令认证:

1
2
3
redis-cli -h 192.168.1.100 -p 6379 -n 2
192.168.1.100:6379[2]> AUTH YourStrongPass123 # 交互式输入密码
OK # 认证成功

1.3 Redis 核心配置查看与修改

Redis 配置分为静态配置(修改redis.conf文件,需重启生效)和动态配置(通过CONFIG命令修改,即时生效,重启后丢失),两种方式均为 Redis 原生操作。

1.3.1 动态查看配置(CONFIG GET)

通过CONFIG GET命令查看任意配置项,支持通配符*批量查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1. 查看单个配置:如查看绑定IP(bind)
127.0.0.1:6379> CONFIG GET bind
1) "bind"
2) "0.0.0.0" # 配置值(此处表示允许所有IP访问)

# 2. 查看持久化相关配置(通配符*)
127.0.0.1:6379> CONFIG GET save* # 查看所有以save开头的配置
1) "save"
2) "3600 1 300 100 60 10000" # RDB触发条件
1) "save-memory-limit"
2) "0" # 无内存限制(默认)

# 3. 查看AOF配置
127.0.0.1:6379> CONFIG GET appendonly*
1) "appendonly"
2) "yes" # AOF已开启
1) "appendfsync"
2) "everysec" # AOF同步策略(每秒同步)
1) "appendfilename"
2) "appendonly.aof" # AOF文件名

1.3.2 动态修改配置(CONFIG SET)

对于支持动态调整的配置项(如密码、AOF 同步策略),可通过CONFIG SET即时修改,无需重启服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 临时设置访问密码(重启后失效)
127.0.0.1:6379> CONFIG SET requirepass "NewStrongPass456"
OK
# 修改后需重新认证才能继续操作
127.0.0.1:6379> DBSIZE # 未认证会报错
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH "NewStrongPass456" # 重新认证
OK

# 2. 临时修改AOF同步策略为"everysec"(平衡安全与性能)
127.0.0.1:6379> CONFIG SET appendfsync "everysec"
OK
# 验证修改结果
127.0.0.1:6379> CONFIG GET appendfsync
1) "appendfsync"
2) "everysec"

1.3.3 静态修改配置(redis.conf 文件)

动态配置重启后失效,若需永久生效,需修改redis.conf文件(路径:/etc/redis.conf(yum/apt)或/usr/local/redis/conf/redis.conf(源码编译)):

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 编辑配置文件(用vi或nano)
sudo vi /etc/redis.conf

# 2. 永久开启密码(找到requirepass,取消注释并修改)
requirepass YourPermanentPass789 # 永久密码

# 3. 永久开启AOF(找到appendonly,改为yes)
appendonly yes

# 4. 保存退出后,重启Redis服务使配置生效
sudo systemctl restart redis # systemd系统(CentOS 7+/Ubuntu 16.04+)
# 或(非systemd系统)
sudo service redis restart

第二章 Redis 核心数据类型:原生命令 CRUD 实战

Redis 支持 5 种核心数据类型,所有操作均通过redis-cli命令完成,本节详细演示每种类型的创建(Create)、读取(Read)、更新(Update)、删除(Delete) 原生命令,包含参数格式与返回值说明。

2.1 String(字符串):最基础的键值对

String 是 Redis 最基础的数据类型,可存储文本、数字(支持自增 / 自减),单个键最大存储 512MB。

操作类型 命令格式 示例 返回值说明
Create `SET key value [EX seconds] [PX milliseconds] [NX XX]` SET user:100:name "张三" EX 30
Read GET key GET user:100:name "张三"(键存在)/(nil)(键不存在)
Update SET key new_value(覆盖)/INCR key(数字自增 1) SET user:100:name "张三丰"/INCR article:200:view OK(覆盖成功)/(integer) 1(自增后的值)
Delete DEL key [key...] DEL user:100:name (integer) 1(删除成功的键数)

实战示例

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
29
127.0.0.1:6379> # 1. 创建String(30秒过期)
127.0.0.1:6379> SET user:100:name "张三" EX 30
OK

127.0.0.1:6379> # 2. 读取String
127.0.0.1:6379> GET user:100:name
"张三"

127.0.0.1:6379> # 3. 更新String(覆盖值+延长过期时间)
127.0.0.1:6379> SET user:100:name "张三丰" EX 60
OK
127.0.0.1:6379> GET user:100:name
"张三丰"

127.0.0.1:6379> # 4. 数字自增(计数器场景)
127.0.0.1:6379> SET article:200:view 0 # 初始化阅读量
OK
127.0.0.1:6379> INCR article:200:view # 自增1
(integer) 1
127.0.0.1:6379> INCRBY article:200:view 5 # 自增5
(integer) 6
127.0.0.1:6379> GET article:200:view
"6"

127.0.0.1:6379> # 5. 删除String
127.0.0.1:6379> DEL user:100:name article:200:view
(integer) 2 # 成功删除2个键
127.0.0.1:6379> GET user:100:name
(nil) # 已删除

2.2 Hash(哈希):存储对象型数据

Hash 适合存储对象类数据(如用户信息、商品属性),键(Hash 键)下包含多个字段(field)与值(value),相当于 “键中键”。

操作类型 命令格式 示例 返回值说明
Create HSET hash_key field1 value1 [field2 value2...] HSET user:101 name "李四" age "25" email "lisi@test.com" (integer) 3(成功设置的字段数)
Read HGET hash_key field(单个字段)/HGETALL hash_key(所有字段) HGET user:101 age/HGETALL user:101 "25"(单个字段值)/["name","李四","age","25",...](所有字段键值对)
Update HSET hash_key field new_value(覆盖字段) HSET user:101 age "26" (integer) 0(字段已存在,更新成功)
Delete HDEL hash_key field [field...](删除字段)/DEL hash_key(删除整个 Hash) HDEL user:101 email/DEL user:101 (integer) 1(删除的字段数 / 键数)

实战示例

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
29
30
31
32
33
34
35
127.0.0.1:6379> # 1. 创建Hash(用户对象)
127.0.0.1:6379> HSET user:101 name "李四" age "25" email "lisi@test.com"
(integer) 3

127.0.0.1:6379> # 2. 读取Hash字段
127.0.0.1:6379> HGET user:101 age
"25"
127.0.0.1:6379> HGETALL user:101 # 查看所有字段
1) "name"
2) "李四"
3) "age"
4) "25"
5) "email"
6) "lisi@test.com"

127.0.0.1:6379> # 3. 更新Hash字段(修改年龄)
127.0.0.1:6379> HSET user:101 age "26"
(integer) 0 # 字段已存在,返回0表示更新
127.0.0.1:6379> HGET user:101 age
"26"

127.0.0.1:6379> # 4. 删除Hash字段(删除邮箱)
127.0.0.1:6379> HDEL user:101 email
(integer) 1
127.0.0.1:6379> HGETALL user:101 # 验证邮箱已删除
1) "name"
2) "李四"
3) "age"
4) "26"

127.0.0.1:6379> # 5. 删除整个Hash
127.0.0.1:6379> DEL user:101
(integer) 1
127.0.0.1:6379> HGETALL user:101
(empty array) # 已删除

2.3 List(列表):有序可重复的 “队列 / 栈”

List 是有序、可重复的元素集合,底层基于双向链表实现,支持从两端插入 / 删除元素,适合实现消息队列、最新列表等场景。

操作类型 命令格式 示例 返回值说明
Create LPUSH list_key value1 [value2...](左端插入)/RPUSH list_key value1 [value2...](右端插入) RPUSH mq:order order1001 order1002 order1003 (integer) 3(列表当前长度)
Read LRANGE list_key start end(获取区间元素,0开始,-1表示最后一个) LRANGE mq:order 0 -1 ["order1001","order1002","order1003"]
Update LSET list_key index new_value(修改指定索引元素) LSET mq:order 1 order1004 OK(修改成功)
Delete LPOP list_key(左端删除并返回元素)/RPOP list_key(右端删除)/DEL list_key(删除整个列表) LPOP mq:order/DEL mq:order "order1001"(删除的元素)/(integer) 1(删除的键数)

实战示例

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
29
30
127.0.0.1:6379> # 1. 创建List(右端插入,模拟消息队列生产者)
127.0.0.1:6379> RPUSH mq:order order1001 order1002 order1003
(integer) 3

127.0.0.1:6379> # 2. 读取List所有元素
127.0.0.1:6379> LRANGE mq:order 0 -1
1) "order1001"
2) "order1002"
3) "order1003"

127.0.0.1:6379> # 3. 更新List元素(修改索引1的元素)
127.0.0.1:6379> LSET mq:order 1 order1004
OK
127.0.0.1:6379> LRANGE mq:order 0 -1
1) "order1001"
2) "order1004"
3) "order1003"

127.0.0.1:6379> # 4. 删除List元素(左端删除,模拟消费者)
127.0.0.1:6379> LPOP mq:order
"order1001" # 返回删除的元素
127.0.0.1:6379> LRANGE mq:order 0 -1 # 剩余元素
1) "order1004"
2) "order1003"

127.0.0.1:6379> # 5. 删除整个List
127.0.0.1:6379> DEL mq:order
(integer) 1
127.0.0.1:6379> LRANGE mq:order 0 -1
(empty array)

2.4 Set(集合):无序不可重复的 “去重容器”

Set 是无序、不可重复的元素集合,支持交集、并集、差集等数学运算,适合去重(如用户标签)、共同好友计算等场景。

操作类型 命令格式 示例 返回值说明
Create SADD set_key value1 [value2...] SADD user:102:tags Java Redis Python (integer) 3(成功添加的元素数,重复元素不计)
Read SMEMBERS set_key(所有元素)/SISMEMBER set_key value(判断元素是否存在) SMEMBERS user:102:tags/SISMEMBER user:102:tags Java ["Java","Redis","Python"]/(integer) 1(存在为 1,不存在为 0)
Update SADD set_key new_value(添加新元素,重复自动忽略) SADD user:102:tags Golang (integer) 1(添加成功)
Delete SREM set_key value1 [value2...](删除元素)/DEL set_key(删除整个集合) SREM user:102:tags Python/DEL user:102:tags (integer) 1(删除的元素数 / 键数)

实战示例

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
29
30
31
32
33
34
35
36
37
127.0.0.1:6379> # 1. 创建Set(用户标签,自动去重)
127.0.0.1:6379> SADD user:102:tags Java Redis Python Redis # 重复的Redis会被忽略
(integer) 3 # 仅添加3个不重复元素

127.0.0.1:6379> # 2. 读取Set
127.0.0.1:6379> SMEMBERS user:102:tags # 无序返回
1) "Java"
2) "Redis"
3) "Python"
127.0.0.1:6379> SISMEMBER user:102:tags Java # 判断元素是否存在
(integer) 1 # 存在
127.0.0.1:6379> SISMEMBER user:102:tags Golang
(integer) 0 # 不存在

127.0.0.1:6379> # 3. 更新Set(添加新标签)
127.0.0.1:6379> SADD user:102:tags Golang
(integer) 1
127.0.0.1:6379> SMEMBERS user:102:tags
1) "Java"
2) "Redis"
3) "Python"
4) "Golang"

127.0.0.1:6379> # 4. 删除Set元素(删除Python标签)
127.0.0.1:6379> SREM user:102:tags Python
(integer) 1
127.0.0.1:6379> SMEMBERS user:102:tags
1) "Java"
2) "Redis"
3) "Golang"

127.0.0.1:6379> # 5. 集合运算(求两个用户的共同标签)
127.0.0.1:6379> SADD user:103:tags Redis Golang MySQL # 创建第二个用户的标签
(integer) 3
127.0.0.1:6379> SINTER user:102:tags user:103:tags # 交集(共同标签)
1) "Redis"
2) "Golang"

2.5 Sorted Set(ZSet):带权重的 “有序排行榜”

ZSet(有序集合)是有序、不可重复的元素集合,每个元素关联一个 “分数(score)”,通过分数排序,适合实现积分排行榜、热度排名等场景。

操作类型 命令格式 示例 返回值说明
Create ZADD zset_key score1 value1 [score2 value2...] ZADD rank:score 85 张三 92 李四 78 王五 (integer) 3(成功添加的元素数)
Read ZRANGE zset_key start end [WITHSCORES](升序)/ZREVRANGE zset_key start end [WITHSCORES](降序) ZREVRANGE rank:score 0 1 WITHSCORES ["李四","92","张三","85"](带分数的降序前 2 名)
Update ZADD zset_key new_score value(覆盖分数)/ZINCRBY zset_key incr_score value(分数自增) ZINCRBY rank:score 3 王五 (double) 81(自增后的分数)
Delete ZREM zset_key value1 [value2...](删除元素)/DEL zset_key(删除整个 ZSet) ZREM rank:score 王五/DEL rank:score (integer) 1(删除的元素数 / 键数)

实战示例

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
29
30
127.0.0.1:6379> # 1. 创建ZSet(积分排行榜)
127.0.0.1:6379> ZADD rank:score 85 张三 92 李四 78 王五
(integer) 3

127.0.0.1:6379> # 2. 读取ZSet(降序前2名,带分数)
127.0.0.1:6379> ZREVRANGE rank:score 0 1 WITHSCORES
1) "李四"
2) "92"
3) "张三"
4) "85"

127.0.0.1:6379> # 3. 更新ZSet(王五分数+3)
127.0.0.1:6379> ZINCRBY rank:score 3 王五
(integer) 81 # 王五新分数
127.0.0.1:6379> ZRANGE rank:score 0 -1 WITHSCORES # 升序查看所有
1) "王五"
2) "81"
3) "张三"
4) "85"
5) "李四"
6) "92"

127.0.0.1:6379> # 4. 删除ZSet元素(删除王五)
127.0.0.1:6379> ZREM rank:score 王五
(integer) 1
127.0.0.1:6379> ZREVRANGE rank:score 0 -1 WITHSCORES
1) "李四"
2) "92"
3) "张三"
4) "85"

第三章 Redis 持久化:原生命令与文件管理

Redis 持久化分为 RDB(快照)和 AOF(日志),所有持久化操作均通过 Redis 原生命令触发,无需依赖第三方工具。本节演示 RDB/AOF 的创建、查看、恢复全流程原生操作。

3.1 RDB 持久化:快照生成与恢复

RDB 通过save(同步)或bgsave(异步)命令生成dump.rdb快照文件,Redis 重启时会自动加载该文件恢复数据。

3.1.1 RDB 生成(原生命令)

命令 类型 特点 适用场景
SAVE 同步 主线程执行,阻塞所有客户端命令 测试环境、数据量极小场景
BGSAVE 异步 fork 子进程执行,主线程不阻塞 生产环境(推荐)

实战示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
127.0.0.1:6379> # 1. 异步生成RDB(生产推荐)
127.0.0.1:6379> BGSAVE
Background saving started # 子进程开始执行,主线程可继续操作
127.0.0.1:6379> GET user:100:name # 执行其他命令不阻塞
"张三"

127.0.0.1:6379> # 2. 查看RDB执行状态(通过INFO persistence)
127.0.0.1:6379> INFO persistence
# Persistence
loading:0 # 是否正在加载RDB/AOF(0=否)
rdb_changes_since_last_save:0 # 上次RDB后修改的键数
rdb_bgsave_in_progress:0 # 是否正在执行BGSAVE(0=否,1=是)
rdb_last_save_time:1699999999 # 上次RDB成功时间(时间戳)
rdb_last_bgsave_status:ok # 上次BGSAVE状态(ok=成功)
rdb_last_bgsave_time_sec:1 # 上次BGSAVE耗时(秒)

127.0.0.1:6379> # 3. 找到RDB文件(默认路径在redis.conf的dir配置中)
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis" # RDB/AOF文件存储路径
# 退出redis-cli,在终端查看文件
exit
ls /var/lib/redis/dump.rdb # 存在则表示RDB生成成功

3.1.2 RDB 恢复(原生流程)

Redis 重启时会自动加载dir路径下的dump.rdb文件,无需手动执行命令,恢复流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. 准备测试数据(确保RDB包含数据)
redis-cli
127.0.0.1:6379> SET test:rdb "restore_from_rdb"
OK
127.0.0.1:6379> BGSAVE # 生成包含test:rdb的RDB
Background saving started
127.0.0.1:6379> exit

# 2. 停止Redis服务
sudo systemctl stop redis

# 3. (可选)模拟数据丢失:删除内存数据(或直接重启,Redis会清空内存后加载RDB)
# 无需手动删除RDB文件,重启时会自动加载

# 4. 重启Redis服务,自动加载RDB
sudo systemctl start redis

# 5. 验证恢复结果
redis-cli
127.0.0.1:6379> GET test:rdb
"restore_from_rdb" # 恢复成功

3.2 AOF 持久化:日志开启与重写

AOF 通过记录所有写命令(如SET/HSET)到appendonly.aof文件实现持久化,需先通过配置开启,支持bgrewriteaof命令压缩文件(去除冗余命令)。

3.2.1 AOF 开启与日志生成

AOF 默认关闭,需通过动态命令(临时)或配置文件(永久)开启:

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
# 方式1:动态开启AOF(重启后失效)
redis-cli
127.0.0.1:6379> CONFIG SET appendonly yes
OK
# 验证开启状态
127.0.0.1:6379> CONFIG GET appendonly
1) "appendonly"
2) "yes"

# 方式2:永久开启AOF(修改redis.conf,重启生效)
sudo vi /etc/redis.conf
appendonly yes # 改为yes
sudo systemctl restart redis

# 生成AOF日志:执行写命令,AOF会自动记录
127.0.0.1:6379> SET test:aof "restore_from_aof"
OK
127.0.0.1:6379> HSET user:104 name "赵六"
(integer) 1

# 查看AOF文件(退出redis-cli,终端执行)
exit
cat /var/lib/redis/appendonly.aof # 可看到记录的SET/HSET命令
# 关键内容(Redis协议格式):
# *3\r\n$3\r\nSET\r\n$7\r\ntest:aof\r\n$16\r\nrestore_from_aof\r\n
# *3\r\n$4\r\nHSET\r\n$7\r\nuser:104\r\n$4\r\nname\r\n$4\r\n赵六\r\n

3.2.2 AOF 重写(压缩日志文件)

AOF 文件会随命令增多而变大,通过bgrewriteaof命令压缩(如 100 次INCR会重写为 1 次SET):

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
redis-cli
127.0.0.1:6379> # 1. 生成冗余AOF:执行10次INCR
127.0.0.1:6379> SET counter 0
OK
127.0.0.1:6379> INCR counter # 执行10次,AOF会记录10条INCR命令
(integer) 1
# ...(重复执行INCR到counter=10)

# 2. 查看AOF当前大小(终端执行,需退出redis-cli)
exit
du -sh /var/lib/redis/appendonly.aof # 如:4.0K

# 3. 执行AOF重写(redis-cli中)
redis-cli
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started # 异步重写

# 4. 查看重写状态
127.0.0.1:6379> INFO persistence
aof_rewrite_in_progress:0 # 0=重写完成
aof_last_rewrite_time_sec:1 # 重写耗时
aof_last_rewrite_status:ok # 重写成功

# 5. 验证AOF大小(终端)
exit
du -sh /var/lib/redis/appendonly.aof # 如:2.0K(大小减少,冗余命令已压缩)

3.2.3 AOF 恢复(原生流程)

Redis 重启时,若同时开启 RDB 和 AOF,会优先加载 AOF(数据更完整):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 确保AOF包含测试数据
redis-cli
127.0.0.1:6379> SET test:aof "restore_from_aof"
OK
127.0.0.1:6379> exit

# 2. 停止Redis
sudo systemctl stop redis

# 3. (可选)删除RDB文件,确保恢复来自AOF
sudo rm /var/lib/redis/dump.rdb

# 4. 重启Redis,自动加载AOF
sudo systemctl start redis

# 5. 验证恢复
redis-cli
127.0.0.1:6379> GET test:aof
"restore_from_aof" # 恢复成功

第四章 Redis 客户端连接管理:原生监控与控制

Redis 提供CLIENT系列原生命令,用于查看当前连接状态、终止异常连接、设置连接名称等,是运维中排查连接泄漏、控制并发连接的核心工具。

4.1 查看连接列表(CLIENT LIST)

CLIENT LIST命令返回所有当前连接的详细信息(如客户端 IP、端口、连接时间、状态等),结果以空格分隔字段:

1
2
3
4
5
6
7
8
9
10
11
12
redis-cli
127.0.0.1:6379> CLIENT LIST
# 输出示例(关键字段说明):
id=123 addr=127.0.0.1:54321 fd=8 name= age=30 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
# 字段解释:
# id:连接唯一ID(用于CLIENT KILL)
# addr:客户端IP:端口
# age:连接已建立时间(秒)
# idle:连接空闲时间(秒,无命令执行)
# flags:连接状态(N=普通客户端,M=主从复制的主节点,S=哨兵)
# db:当前使用的数据库编号
# cmd:客户端最后执行的命令

4.2 终止异常连接(CLIENT KILL)

通过CLIENT KILL命令终止指定连接(需指定id或addr),适用于清理长时间空闲、异常占用的连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> # 1. 先通过CLIENT LIST找到要终止的连接ID(如id=123)
127.0.0.1:6379> CLIENT LIST
id=123 addr=127.0.0.1:54321 ... # 目标连接

# 2. 按ID终止连接
127.0.0.1:6379> CLIENT KILL ID 123
OK # 终止成功

# 3. 按IP:端口终止连接(若不知道ID)
127.0.0.1:6379> CLIENT KILL ADDR 127.0.0.1:54321
OK

# 4. 验证:连接已消失
127.0.0.1:6379> CLIENT LIST | grep 54321 # 无输出,说明已终止

4.3 设置连接名称(CLIENT SETNAME)

为连接设置名称,便于在CLIENT LIST中识别连接用途(如 “order-service”“user-service”):

1
2
3
4
5
6
7
8
9
10
11
# 1. 当前连接设置名称为"order-service"
127.0.0.1:6379> CLIENT SETNAME order-service
OK

# 2. 查看设置结果(CLIENT LIST中name字段)
127.0.0.1:6379> CLIENT LIST
id=124 addr=127.0.0.1:54322 fd=9 name=order-service age=5 idle=0 ... # name已生效

# 3. 查看当前连接名称
127.0.0.1:6379> CLIENT GETNAME
"order-service"

第五章 Redis 基础监控:原生 INFO 命令

Redis 通过INFO命令提供服务状态、内存使用、CPU 消耗、键统计等核心监控数据,无需依赖第三方监控工具,可直接在redis-cli中查看。

5.1 查看整体状态(INFO)

执行INFO命令查看所有监控数据(按模块分类),或通过参数指定模块(如INFO memory仅查看内存):

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
redis-cli
127.0.0.1:6379> # 1. 查看内存使用(核心模块)
127.0.0.1:6379> INFO memory
# Memory
used_memory:868880 # Redis已使用内存(字节)
used_memory_human:848.52K # 人类可读格式
used_memory_rss:5054464 # 操作系统分配给Redis的内存(RSS)
used_memory_rss_human:4.82M
used_memory_peak:868880 # 内存使用峰值
used_memory_peak_human:848.52K
mem_fragmentation_ratio:5.82 # 内存碎片率(RSS/used_memory,1.0-1.5正常)
mem_allocator:jemalloc-5.1.0 # 内存分配器

127.0.0.1:6379> # 2. 查看键统计(核心模块)
127.0.0.1:6379> INFO keyspace
# Keyspace
db0:keys=5,expires=2,avg_ttl=123456 # 数据库0:5个键,2个有过期时间,平均TTL
db1:keys=3,expires=0,avg_ttl=0 # 数据库1:3个键,无过期时间

127.0.0.1:6379> # 3. 查看CPU消耗
127.0.0.1:6379> INFO cpu
# CPU
used_cpu_sys:0.20 # Redis内核态CPU时间(秒)
used_cpu_user:0.30 # Redis用户态CPU时间(秒)
used_cpu_sys_children:0.00 # 子进程(如BGSAVE)内核态CPU时间
used_cpu_user_children:0.01 # 子进程用户态CPU时间

5.2 查看命令统计(INFO stats)

INFO stats提供命令执行次数、连接数、持久化状态等统计数据,可用于排查性能瓶颈:

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> INFO stats
# Stats
total_connections_received:10 # 累计接收连接数
total_commands_processed:100 # 累计执行命令数
instantaneous_ops_per_sec:2 # 每秒执行命令数(当前)
total_net_input_bytes:10240 # 累计接收网络数据(字节)
total_net_output_bytes:20480 # 累计发送网络数据(字节)
rdb_saves:5 # 累计RDB保存次数
aof_rewrites:2 # 累计AOF重写次数

总结

本文完全基于 Redis 原生操作,覆盖从安装验证、数据类型 CRUD、持久化管理、连接监控到状态查看的全流程,核心要点:

  1. 连接与配置:通过redis-cli -h/-p/-a连接服务,CONFIG GET/SET动态管理配置;

  2. 数据操作:5 种核心类型的原生命令(SET/HSET/RPUSH/SADD/ZADD等),掌握 CRUD 逻辑;

  3. 持久化:BGSAVE生成 RDB,BGREWRITEAOF压缩 AOF,重启自动恢复;

  4. 监控管理:CLIENT LIST/KILL控制连接,INFO查看服务状态。