第一章 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、持久化管理、连接监控到状态查看的全流程,核心要点:
连接与配置:通过redis-cli -h/-p/-a连接服务,CONFIG GET/SET动态管理配置;
数据操作:5 种核心类型的原生命令(SET/HSET/RPUSH/SADD/ZADD等),掌握 CRUD 逻辑;
持久化:BGSAVE生成 RDB,BGREWRITEAOF压缩 AOF,重启自动恢复;
监控管理:CLIENT LIST/KILL控制连接,INFO查看服务状态。