Redis-cli 完全指南:从入门到精通
Redis-cli 完全指南从入门到精通掌握Redis命令行工具提升数据库运维效率前言Redis作为高性能的键值存储系统在日常开发运维中redis-cli是我们最常用的工具。它不仅是简单的命令行客户端更是一个功能强大的管理工具。本文将全面介绍redis-cli的使用方法从基础命令到高级技巧帮助你更好地驾驭Redis。一、redis-cli基础入门1.1 安装与连接Redis安装后会自动包含redis-cli工具。最基本的连接方式# 连接到本地默认端口redis-cli# 指定主机和端口redis-cli-h192.168.1.100-p6379# 带密码认证redis-cli-h192.168.1.100-p6379-ayourpassword# 使用环境变量避免密码暴露exportREDISCLI_AUTHyourpassword redis-cli-h192.168.1.1001.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:abcvalueEX3600SETEX session:def3600value# 原子操作INCR page_views INCRBY article:123:views10# 批量操作MSET key1 value1 key2 value2 MGET key1 key2# 不存在时设置分布式锁常用SETNX lock:orderlocked2.2 哈希(Hash)适合存储对象类型数据。# 存储用户信息HSET user:1001 name张三age25emailzhangsanexample.com# 获取指定字段HGET user:1001 name# 获取所有字段HGETALL user:1001# 字段自增HINCRBY user:1001 age1# 批量获取HMGET user:1001 name email2.3 列表(List)有序可重复集合适合消息队列、最新消息等场景。# 从右侧推入最新消息LPUSH news:listnews1news2RPUSH queuetask1task2# 阻塞式弹出消息队列BRPOP queue30# 获取指定范围LRANGE news:list09# 获取前10条# 修剪列表LTRIM news:list099# 保留前100条2.4 集合(Set)无序不可重复适合标签、好友关系等。# 添加标签SADD article:1001:tagsredisdatabasenosql# 获取所有标签SMEMBERS article:1001:tags# 随机获取SRANDMEMBER article:1001:tags2# 集合运算SINTER set1 set2# 交集SUNION set1 set2# 并集SDIFF set1 set2# 差集2.5 有序集合(Sorted Set)带分数的有序集合适合排行榜、延迟队列等。# 添加分数ZADD leaderboard100player195player288player3# 获取前三名ZREVRANGE leaderboard02WITHSCORES# 增加分数ZINCRBY leaderboard5player1# 获取排名ZRANK leaderboardplayer1# 正序排名ZREVRANK leaderboardplayer1# 倒序排名三、高级功能实战3.1 发布订阅实现简单的消息通知系统。# 终端1 - 订阅频道SUBSCRIBE channel:news# 终端2 - 发布消息PUBLISH channel:newsRedis 7.0 released!# 模式订阅PSUBSCRIBE channel:*# 查看订阅信息PUBSUB CHANNELS PUBSUB NUMSUB channel:news3.2 事务处理保证命令序列的原子性执行。# 开始事务MULTI# 命令入队SET key1 value1 SET key2 value2 INCR counter# 执行事务EXEC# 取消事务DISCARD# 乐观锁监控keyWATCH 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 1rate:limit:user11060# 调试脚本redis-cli--ldb--evalrate_limit.lua rate:limit:user1 ,1060四、运维管理命令4.1 Key管理# 查找key生产环境用SCANSCAN0MATCH user:* COUNT1000# 查看key信息TYPE key TTL key OBJECT encoding key# 删除过期DEL key UNLINK key# 异步删除非阻塞# 设置过期EXPIRE key3600EXPIREAT key17000000004.2 服务器管理# 查看服务器信息INFO INFO replication# 复制信息INFO memory# 内存信息INFO stats# 统计信息# 配置管理CONFIG GET maxmemory CONFIG SET maxmemory 2gb CONFIG REWRITE# 持久化配置# 客户端管理CLIENT LIST CLIENT KILL addr:port CLIENT SETNAMEmy_client# 持久化SAVE# 同步保存阻塞BGSAVE# 后台保存LASTSAVE# 最后保存时间4.3 监控与调试# 实时监控生产环境慎用MONITOR# 查看慢查询SLOWLOG GET10SLOWLOG LEN SLOWLOG RESET# 内存分析MEMORY STATS MEMORY USAGE key MEMORY DOCTOR# 内存诊断# 延迟监控redis-cli--latencyredis-cli --latency-dist redis-cli --intrinsic-latency10五、实用参数进阶5.1 --raw 参数重要处理中文、特殊字符的关键参数。# 问题直接查看中文显示乱码redis-cli GETusername# 输出: \xe5\xbc\xa0\xe4\xb8\x89# 解决使用--raw参数redis-cli--rawGETusername# 输出: 张三# 导出中文数据redis-cli--raw--scan--patternuser:*|whilereadkey;doecho$key:$(redis-cli--rawGET $key)done5.2 --bigkeys 查找大key扫描并统计大key分布建议在从库执行。# 查找大keyredis-cli--bigkeys# 带休眠参数降低负载redis-cli--bigkeys-i0.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 items5.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) 4575.4 管道模式批量操作高效批量导入数据。# 准备命令文件echoSET key1 value1commands.txtechoSET key2 value2commands.txtechoINCR countercommands.txt# 批量执行catcommands.txt|redis-cli--pipe# 批量导入数据awk{print SET user: NR $0}users.txt|redis-cli--pipe5.5 集群操作Redis Cluster管理命令。# 检查集群状态redis-cli--clustercheck127.0.0.1:6379# 查看集群信息redis-cli--clusterinfo127.0.0.1:6379# 重新分片redis-cli--clusterreshard127.0.0.1:6379# 修复集群redis-cli--clusterfix127.0.0.1:6379# 添加节点redis-cli--clusteradd-node127.0.0.1:6380127.0.0.1:6379六、实战场景示例6.1 缓存预热# 从数据库导出数据到Redismysql-eSELECT id, name FROM users|whilereadidname;doechoSET user:$id$name EX 3600done|redis-cli--pipe6.2 会话管理# 创建会话7天过期HSET session:token123 user_id10086login_time1700000000EXPIRE session:token123604800# 验证会话redis-cli--rawHGET session:token123 user_id# 清理过期会话redis-cli--scan--patternsession:*|whilereadkey;doif[$(redis-cli TTL $key)-le0];thenredis-cli DEL$keyfidone6.3 排行榜实现# 更新分数ZADD game:leaderboard1000player:1001ZADD game:leaderboard950player:1002# 获取Top 10ZREVRANGE game:leaderboard09WITHSCORES# 获取玩家排名ZREVRANK game:leaderboardplayer:1001# 获取玩家附近排名ZREVRANGE game:leaderboard0-1|grep-nplayer:10016.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 1lock:order:1001client-130# 释放锁验证并删除EVAL if redis.call(GET, KEYS[1]) ARGV[1] then return redis.call(DEL, KEYS[1]) else return 0 end 1lock:order:1001client-16.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 1rate:api:user12310060七、性能优化与注意事项7.1 危险命令生产环境慎用命令风险替代方案KEYS *阻塞RedisO(N)扫描SCAN命令FLUSHALL删除所有数据库数据FLUSHALL ASYNCMONITOR性能下降50%以上SLOWLOG 日志CONFIG SET可能影响稳定性修改配置文件重启7.2 大key处理# 查找大keyredis-cli--bigkeys# 分批删除大key# Hash类型HSCAN big_hash0COUNT100|xargsredis-cli HDEL big_hash# Set类型SSCAN big_set0COUNT100|xargsredis-cli SREM big_set# List类型LTRIM big_list00# 逐步删除7.3 内存优化建议# 查看内存使用INFO memory# 查看key内存占用MEMORY USAGE key# 启用内存碎片整理CONFIG SET activedefragyes# 设置最大内存CONFIG SET maxmemory 4gb CONFIG SET maxmemory-policy allkeys-lru八、快捷键与技巧8.1 交互模式快捷键快捷键功能CtrlC中断当前命令CtrlD退出redis-cliCtrlL清屏Tab命令自动补全↑↓历史命令CtrlR搜索历史命令8.2 实用别名配置# 添加到 ~/.bashrc 或 ~/.zshrcaliasredisredis-clialiasredis-prodredis-cli -h prod.redis.com -p 6379 --rawaliasredis-statsredis-cli --stataliasredis-bigkeysredis-cli --bigkeys -i 0.1aliasredis-monitorredis-cli --monitor | tee redis-monitor.log# 带环境变量exportREDISCLI_AUTHyourpasswordexportREDISCLI_HOSTlocalhostexportREDISCLI_PORT63798.3 一键备份脚本#!/bin/bash# redis-backup.shBACKUP_DIR/backup/redisDATE$(date%Y%m%d_%H%M%S)BACKUP_FILE$BACKUP_DIR/redis_$DATE.rdb# 保存RDBredis-cli BGSAVE# 等待保存完成while[$(redis-cli LASTSAVE)-eq$(cat/tmp/lastsave2/dev/null||echo0)];dosleep1doneredis-cli LASTSAVE/tmp/lastsave# 复制RDB文件cp/var/lib/redis/dump.rdb$BACKUP_FILE# 压缩gzip$BACKUP_FILEechoBackup completed:$BACKUP_FILE.gz九、常见问题排查9.1 连接失败# 检查连接redis-cli-h127.0.0.1-p6379ping# 如果失败检查# 1. Redis是否运行ps aux | grep redis# 2. 端口是否开放netstat -an | grep 6379# 3. 防火墙设置iptables -L -n | grep 6379# 4. protected-mode配置CONFIG GET protected-mode9.2 响应缓慢# 检查慢查询SLOWLOG GET10# 查看延迟redis-cli--latency# 检查CPU使用率redis-cli INFO stats|grepinstantaneous_ops_per_sec# 查看内存碎片redis-cli INFO memory|grepmem_fragmentation_ratio9.3 内存不足# 查看内存使用情况redis-cli INFO memory# 查找占用内存的keyredis-cli--bigkeys# 查看key内存占用前10redis-cli--scan|whilereadkey;doecho$(redis-cli MEMORY USAGE $key)$keydone|sort-rn|head-10结语redis-cli是Redis生态中不可或缺的工具掌握它能极大提升开发和运维效率。本文涵盖了从基础操作到高级技巧的方方面面但Redis的功能远不止于此。建议在实际使用中多实践、多总结将理论知识转化为实战经验。记住工具的目的是解决问题选择合适的方法比掌握所有命令更重要。在生产环境中始终要考虑操作的性能影响优先使用非阻塞命令保护好你的数据。参考资料Redis官方文档Redis命令参考Redis-cli工具文档本文内容基于Redis 7.0版本编写部分命令在旧版本中可能不支持。如有疑问请查阅对应版本的官方文档。

相关新闻

最新新闻

日新闻

周新闻

月新闻