1. Redis-cli基础连接与运维实战第一次接触redis-cli时我盯着黑乎乎的终端窗口有点发怵。这玩意儿真的比图形界面好用吗直到有次服务器内存告急我用三行命令批量清理了20GB缓存数据才明白命令行才是运维的真爱。让我们从最基础的连接开始逐步解锁redis-cli的真正威力。1.1 本地无密码连接最简单的连接方式莫过于直接敲入redis-cli这相当于对本地6379端口的Redis发起你好的问候。我习惯先敲个PING测试连通性看到PONG回应就像听到老朋友的应答。不过实际生产环境几乎不会这么简单就像我家大门从不装锁一样危险。$ redis-cli 127.0.0.1:6379 PING PONG1.2 远程认证连接当Redis住在另一台服务器时我们需要带上门禁卡-h指定IP就像输入地址-p是门牌号默认6379-a则是密码钥匙。有次我忘了加-a参数反复连接十几次都失败最后发现终端里赫然显示着(error) NOAUTH Authentication required——这感觉就像刷卡时机器不断提示请重试。redis-cli -h 192.168.1.100 -p 6379 -a your_strong_password1.3 带缓存的原子操作组合命令才是redis-cli的精华所在。比如要清理缓存并立即检查剩余key数量可以用管道符一气呵成。曾经有个电商大促前我用这个组合拳5秒内清空了商品缓存redis-cli -h redis.prod.com -a $REDIS_PWD flushall redis-cli -h redis.prod.com -a $REDIS_PWD dbsize1.4 多数据库切换Redis默认有16个数据库0-15就像写字楼的楼层。用-n参数直达目标楼层配合select命令随时切换。有次我误操作把测试数据写进了生产库就是忘了这个关键参数。现在我的终端提示符永远显示着当前库编号redis-cli -n 1 127.0.0.1:6379[1] SELECT 0 OK 127.0.0.1:63792. 键值操作的黑科技2.1 批量操作秘籍用mget/mset批量操作键值对时记得控制每次操作的数量。我曾在线上环境一次性获取10万个key直接导致Redis短暂阻塞。后来学乖了用这个shell脚本分批次处理for i in {0..9}; do redis-cli --eval batch_ops.lua $i , 10000 done配套的Lua脚本能精准控制每次操作的key范围。这种方案比单纯用keys *安全得多毕竟keys命令会引发全库扫描——相当于让Redis停下所有工作来陪你玩寻宝游戏。2.2 过期时间的魔法给热key设置过期时间是个技术活。有次我设置了expire user:123 3600结果用户投诉每到整点就掉线。原来key在恰好满1小时时消失应该用expireat指定具体过期时刻# 设置明天凌晨2点过期 redis-cli expireat user:123 $(date -d tomorrow 02:00 %s)2.3 非阻塞删除技巧直接del大key可能导致服务卡顿就像突然搬走整面书柜会堵住走廊。unlink命令就聪明多了它先标记要删除的key等Redis闲下来再慢慢清理。实测删除1GB的hash结构用unlink能减少80%的延迟波动。3. 数据类型实战宝典3.1 字符串的隐藏玩法除了基本的set/get字符串类型还能玩出花样。比如用INCR做秒杀计数器配合EXPIRE自动清零用SETNX实现分布式锁时一定要设置超时——有次我忘了设导致系统死锁两小时。更安全的做法是redis-cli setnx lock:order 1 redis-cli expire lock:order 303.2 列表消息队列用LPUSH/RPOP实现简易消息队列时记得加个BRPOP做阻塞读取。我早期用轮询检查新消息把CPU利用率拉高了30%。后来改成这样既省资源又实时while true; do redis-cli brpop task_queue 0 # 处理消息... done3.3 集合的社交应用用户关注关系用集合再合适不过。SINTER计算共同好友SUNION合并兴趣标签SDIFF推荐可能认识的人。有个千万用户的应用用下面这条命令3毫秒算出两人的共同群组redis-cli sinter user:1000:groups user:2000:groups4. 运维监控高阶技巧4.1 性能诊断三板斧INFO命令是我的急救包。INFO memory看内存碎片率超过1.5就该重启了INFO persistence检查RDB/AOF状态INFO stats里的instantaneous_ops_per_sec是实时QPS。有次大促我就是靠这个发现有个客户端在疯狂执行keys *。4.2 管道加速批处理当需要插入10万条测试数据时单条发送要半小时。用管道技术能提速50倍原理是把多个命令打包发送。这是我常用的模板echo -e SET k1 v1\nSET k2 v2 | redis-cli --pipe4.3 Lua脚本原子操作用EVAL执行Lua脚本就像在Redis内部运行小程序。有次要实现先检查再扣库存的逻辑用Lua脚本完美避免竞态条件local stock tonumber(redis.call(GET, KEYS[1])) if stock 0 then redis.call(DECR, KEYS[1]) return 1 end return 0调用时只需redis-cli --eval decr_stock.lua item:123