Redis-cli 完全指南:从入门到精通

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
--tlsSSL/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版本编写,部分命令在旧版本中可能不支持。如有疑问,请查阅对应版本的官方文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值