Redis-cli 完全指南:从入门到精通
掌握Redis命令行工具,提升数据库运维效率
前言
Redis作为高性能的键值存储系统,在日常开发运维中,redis-cli是我们最常用的工具。它不仅是简单的命令行客户端,更是一个功能强大的管理工具。本文将全面介绍redis-cli的使用方法,从基础命令到高级技巧,帮助你更好地驾驭Redis。
一、redis-cli基础入门
1.1 安装与连接
Redis安装后会自动包含redis-cli工具。最基本的连接方式:
# 连接到本地默认端口
redis-cli
# 指定主机和端口
redis-cli -h 192.168.1.100 -p 6379
# 带密码认证
redis-cli -h 192.168.1.100 -p 6379 -a yourpassword
# 使用环境变量避免密码暴露
export REDISCLI_AUTH=yourpassword
redis-cli -h 192.168.1.100
1.2 连接参数详解
| 参数 | 说明 | 示例 |
|---|---|---|
-h | 服务器地址 | -h 127.0.0.1 |
-p | 端口号 | -p 6379 |
-a | 认证密码 | -a password |
-n | 数据库编号 | -n 2 |
--tls | SSL/TLS连接 | --tls --cacert ca.pem |
--timeout | 超时时间(秒) | --timeout 10 |
二、核心数据类型操作
2.1 字符串(String)
最基础的数据类型,适用于缓存、计数器等场景。
# 基本操作
SET user:1 "张三"
GET user:1
# 设置过期时间
SET session:abc "value" EX 3600
SETEX session:def 3600 "value"
# 原子操作
INCR page_views
INCRBY article:123:views 10
# 批量操作
MSET key1 value1 key2 value2
MGET key1 key2
# 不存在时设置(分布式锁常用)
SETNX lock:order "locked"
2.2 哈希(Hash)
适合存储对象类型数据。
# 存储用户信息
HSET user:1001 name "张三" age 25 email "zhangsan@example.com"
# 获取指定字段
HGET user:1001 name
# 获取所有字段
HGETALL user:1001
# 字段自增
HINCRBY user:1001 age 1
# 批量获取
HMGET user:1001 name email
2.3 列表(List)
有序可重复集合,适合消息队列、最新消息等场景。
# 从右侧推入(最新消息)
LPUSH news:list "news1" "news2"
RPUSH queue "task1" "task2"
# 阻塞式弹出(消息队列)
BRPOP queue 30
# 获取指定范围
LRANGE news:list 0 9 # 获取前10条
# 修剪列表
LTRIM news:list 0 99 # 保留前100条
2.4 集合(Set)
无序不可重复,适合标签、好友关系等。
# 添加标签
SADD article:1001:tags "redis" "database" "nosql"
# 获取所有标签
SMEMBERS article:1001:tags
# 随机获取
SRANDMEMBER article:1001:tags 2
# 集合运算
SINTER set1 set2 # 交集
SUNION set1 set2 # 并集
SDIFF set1 set2 # 差集
2.5 有序集合(Sorted Set)
带分数的有序集合,适合排行榜、延迟队列等。
# 添加分数
ZADD leaderboard 100 "player1" 95 "player2" 88 "player3"
# 获取前三名
ZREVRANGE leaderboard 0 2 WITHSCORES
# 增加分数
ZINCRBY leaderboard 5 "player1"
# 获取排名
ZRANK leaderboard "player1" # 正序排名
ZREVRANK leaderboard "player1" # 倒序排名
三、高级功能实战
3.1 发布订阅
实现简单的消息通知系统。
# 终端1 - 订阅频道
SUBSCRIBE channel:news
# 终端2 - 发布消息
PUBLISH channel:news "Redis 7.0 released!"
# 模式订阅
PSUBSCRIBE channel:*
# 查看订阅信息
PUBSUB CHANNELS
PUBSUB NUMSUB channel:news
3.2 事务处理
保证命令序列的原子性执行。
# 开始事务
MULTI
# 命令入队
SET key1 value1
SET key2 value2
INCR counter
# 执行事务
EXEC
# 取消事务
DISCARD
# 乐观锁(监控key)
WATCH key
MULTI
SET key newvalue
EXEC # 如果key被修改,事务将失败
3.3 Lua脚本
复杂操作的原子性执行。
# 限流脚本示例
EVAL "
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local current = redis.call('INCR', key)
if current == 1 then
redis.call('EXPIRE', key, ARGV[2])
end
if current > limit then
return 0
end
return 1
" 1 rate:limit:user1 10 60
# 调试脚本
redis-cli --ldb --eval rate_limit.lua rate:limit:user1 , 10 60
四、运维管理命令
4.1 Key管理
# 查找key(生产环境用SCAN)
SCAN 0 MATCH user:* COUNT 1000
# 查看key信息
TYPE key
TTL key
OBJECT encoding key
# 删除过期
DEL key
UNLINK key # 异步删除(非阻塞)
# 设置过期
EXPIRE key 3600
EXPIREAT key 1700000000
4.2 服务器管理
# 查看服务器信息
INFO
INFO replication # 复制信息
INFO memory # 内存信息
INFO stats # 统计信息
# 配置管理
CONFIG GET maxmemory
CONFIG SET maxmemory 2gb
CONFIG REWRITE # 持久化配置
# 客户端管理
CLIENT LIST
CLIENT KILL addr:port
CLIENT SETNAME "my_client"
# 持久化
SAVE # 同步保存(阻塞)
BGSAVE # 后台保存
LASTSAVE # 最后保存时间
4.3 监控与调试
# 实时监控(生产环境慎用)
MONITOR
# 查看慢查询
SLOWLOG GET 10
SLOWLOG LEN
SLOWLOG RESET
# 内存分析
MEMORY STATS
MEMORY USAGE key
MEMORY DOCTOR # 内存诊断
# 延迟监控
redis-cli --latency
redis-cli --latency-dist
redis-cli --intrinsic-latency 10
五、实用参数进阶
5.1 --raw 参数(重要)
处理中文、特殊字符的关键参数。
# 问题:直接查看中文显示乱码
redis-cli GET "username"
# 输出: "\xe5\xbc\xa0\xe4\xb8\x89"
# 解决:使用--raw参数
redis-cli --raw GET "username"
# 输出: 张三
# 导出中文数据
redis-cli --raw --scan --pattern "user:*" | while read key; do
echo "$key: $(redis-cli --raw GET $key)"
done
5.2 --bigkeys 查找大key
扫描并统计大key分布(建议在从库执行)。
# 查找大key
redis-cli --bigkeys
# 带休眠参数(降低负载)
redis-cli --bigkeys -i 0.1
# 输出示例:
# -------- summary -------
# Sampled 12567 keys in the keyspace!
# Total key length in bytes is 452345 (avg len 36.00)
#
# Biggest string found 'user:profile:10086' has 1572864 bytes
# Biggest list found 'news:list' has 54321 items
5.3 --stat 实时监控
实时显示Redis统计信息,类似vmstat。
redis-cli --stat
# ------- data ------ --------------------- load ------------------ - child -
# keys mem clients blocked requests connections
# 12345 1.2G 45 0 1245678 (+0) 456
# 12346 1.2G 46 0 1256789 (+11111) 457
5.4 管道模式批量操作
高效批量导入数据。
# 准备命令文件
echo "SET key1 value1" > commands.txt
echo "SET key2 value2" >> commands.txt
echo "INCR counter" >> commands.txt
# 批量执行
cat commands.txt | redis-cli --pipe
# 批量导入数据
awk '{print "SET user:" NR " " $0}' users.txt | redis-cli --pipe
5.5 集群操作
Redis Cluster管理命令。
# 检查集群状态
redis-cli --cluster check 127.0.0.1:6379
# 查看集群信息
redis-cli --cluster info 127.0.0.1:6379
# 重新分片
redis-cli --cluster reshard 127.0.0.1:6379
# 修复集群
redis-cli --cluster fix 127.0.0.1:6379
# 添加节点
redis-cli --cluster add-node 127.0.0.1:6380 127.0.0.1:6379
六、实战场景示例
6.1 缓存预热
# 从数据库导出数据到Redis
mysql -e "SELECT id, name FROM users" | while read id name; do
echo "SET user:$id '$name' EX 3600"
done | redis-cli --pipe
6.2 会话管理
# 创建会话(7天过期)
HSET session:token123 user_id 10086 login_time 1700000000
EXPIRE session:token123 604800
# 验证会话
redis-cli --raw HGET session:token123 user_id
# 清理过期会话
redis-cli --scan --pattern "session:*" | while read key; do
if [ $(redis-cli TTL $key) -le 0 ]; then
redis-cli DEL $key
fi
done
6.3 排行榜实现
# 更新分数
ZADD game:leaderboard 1000 "player:1001"
ZADD game:leaderboard 950 "player:1002"
# 获取Top 10
ZREVRANGE game:leaderboard 0 9 WITHSCORES
# 获取玩家排名
ZREVRANK game:leaderboard "player:1001"
# 获取玩家附近排名
ZREVRANGE game:leaderboard 0 -1 | grep -n "player:1001"
6.4 分布式锁
# 获取锁(Lua脚本保证原子性)
EVAL "
if redis.call('SETNX', KEYS[1], ARGV[1]) == 1 then
redis.call('EXPIRE', KEYS[1], ARGV[2])
return 1
else
return 0
end
" 1 lock:order:1001 "client-1" 30
# 释放锁(验证并删除)
EVAL "
if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('DEL', KEYS[1])
else
return 0
end
" 1 lock:order:1001 "client-1"
6.5 限流器
# 固定窗口限流
EVAL "
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local current = redis.call('INCR', key)
if current == 1 then
redis.call('EXPIRE', key, window)
end
if current > limit then
return 0
end
return 1
" 1 rate:api:user123 100 60
七、性能优化与注意事项
7.1 危险命令(生产环境慎用)
| 命令 | 风险 | 替代方案 |
|---|---|---|
KEYS * | 阻塞Redis,O(N)扫描 | SCAN 命令 |
FLUSHALL | 删除所有数据库数据 | FLUSHALL ASYNC |
MONITOR | 性能下降50%以上 | SLOWLOG + 日志 |
CONFIG SET | 可能影响稳定性 | 修改配置文件重启 |
7.2 大key处理
# 查找大key
redis-cli --bigkeys
# 分批删除大key
# Hash类型
HSCAN big_hash 0 COUNT 100 | xargs redis-cli HDEL big_hash
# Set类型
SSCAN big_set 0 COUNT 100 | xargs redis-cli SREM big_set
# List类型
LTRIM big_list 0 0 # 逐步删除
7.3 内存优化建议
# 查看内存使用
INFO memory
# 查看key内存占用
MEMORY USAGE key
# 启用内存碎片整理
CONFIG SET activedefrag yes
# 设置最大内存
CONFIG SET maxmemory 4gb
CONFIG SET maxmemory-policy allkeys-lru
八、快捷键与技巧
8.1 交互模式快捷键
| 快捷键 | 功能 |
|---|---|
Ctrl+C | 中断当前命令 |
Ctrl+D | 退出redis-cli |
Ctrl+L | 清屏 |
Tab | 命令自动补全 |
↑ ↓ | 历史命令 |
Ctrl+R | 搜索历史命令 |
8.2 实用别名配置
# 添加到 ~/.bashrc 或 ~/.zshrc
alias redis='redis-cli'
alias redis-prod='redis-cli -h prod.redis.com -p 6379 --raw'
alias redis-stats='redis-cli --stat'
alias redis-bigkeys='redis-cli --bigkeys -i 0.1'
alias redis-monitor='redis-cli --monitor | tee redis-monitor.log'
# 带环境变量
export REDISCLI_AUTH=yourpassword
export REDISCLI_HOST=localhost
export REDISCLI_PORT=6379
8.3 一键备份脚本
#!/bin/bash
# redis-backup.sh
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/redis_$DATE.rdb"
# 保存RDB
redis-cli BGSAVE
# 等待保存完成
while [ $(redis-cli LASTSAVE) -eq $(cat /tmp/lastsave 2>/dev/null || echo 0) ]; do
sleep 1
done
redis-cli LASTSAVE > /tmp/lastsave
# 复制RDB文件
cp /var/lib/redis/dump.rdb $BACKUP_FILE
# 压缩
gzip $BACKUP_FILE
echo "Backup completed: $BACKUP_FILE.gz"
九、常见问题排查
9.1 连接失败
# 检查连接
redis-cli -h 127.0.0.1 -p 6379 ping
# 如果失败,检查:
# 1. Redis是否运行:ps aux | grep redis
# 2. 端口是否开放:netstat -an | grep 6379
# 3. 防火墙设置:iptables -L -n | grep 6379
# 4. protected-mode配置:CONFIG GET protected-mode
9.2 响应缓慢
# 检查慢查询
SLOWLOG GET 10
# 查看延迟
redis-cli --latency
# 检查CPU使用率
redis-cli INFO stats | grep instantaneous_ops_per_sec
# 查看内存碎片
redis-cli INFO memory | grep mem_fragmentation_ratio
9.3 内存不足
# 查看内存使用情况
redis-cli INFO memory
# 查找占用内存的key
redis-cli --bigkeys
# 查看key内存占用前10
redis-cli --scan | while read key; do
echo "$(redis-cli MEMORY USAGE $key) $key"
done | sort -rn | head -10
结语
redis-cli是Redis生态中不可或缺的工具,掌握它能极大提升开发和运维效率。本文涵盖了从基础操作到高级技巧的方方面面,但Redis的功能远不止于此。建议在实际使用中多实践、多总结,将理论知识转化为实战经验。
记住,工具的目的是解决问题,选择合适的方法比掌握所有命令更重要。在生产环境中,始终要考虑操作的性能影响,优先使用非阻塞命令,保护好你的数据。
参考资料
本文内容基于Redis 7.0版本编写,部分命令在旧版本中可能不支持。如有疑问,请查阅对应版本的官方文档。

1409

被折叠的 条评论
为什么被折叠?



