1. Redis基础命令概览
Redis作为当今最流行的内存数据库之一,其命令行接口是开发者日常操作的必备工具。不同于传统关系型数据库,Redis的命令集设计体现了其作为键值存储的独特哲学——简洁、高效、原子化。我初次接触Redis时,最惊讶的是它仅用几十个核心命令就能支撑起复杂的应用场景。
基础命令主要分为五大类:键操作、字符串、哈希、列表、集合/有序集合。比如SET命令看似简单,但配合NX/XX等参数就能实现分布式锁的基础功能。而GET命令返回nil与不存在的键这两种情况,在实际开发中需要特别注意区别处理。
经验提示:Redis命令是大小写不敏感的,但官方文档统一使用大写形式,实际使用时推荐保持一致以提升可读性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 键空间操作命令详解
2.1 键生命周期管理
DEL、EXPIRE、TTL这三个命令构成了键生命周期管理的铁三角。在电商秒杀系统中,我们常用组合命令:
bash复制# 设置商品库存并30分钟后自动清除
SET sku:1001_stock 100 EX 1800
KEYS命令虽然方便,但在生产环境要慎用——它会阻塞Redis单线程模型。替代方案是使用SCAN命令迭代遍历,我曾在用户画像系统中用以下模式处理千万级键:
bash复制SCAN 0 MATCH "user:profile:*" COUNT 500
2.2 键类型检测与存在性
TYPE和EXISTS命令在动态类型语言集成时特别有用。Python开发者常犯的错误是:
python复制# 错误示范:直接判断exists为布尔值
if not r.exists('key'):
# 可能误判键过期的情况
正确的做法是结合TYPE检查:
python复制key_type = r.type('key')
if key_type == 'none':
# 键不存在处理
3. 字符串类型命令实战
3.1 原子计数器实现
INCR/DECR系列命令的原子性特性,使其成为浏览量统计的首选方案。在博客系统中,这样的命令组合既高效又可靠:
bash复制INCR article:1001:views
GET article:1001:views
对于需要设置上限的计数器,我推荐使用Lua脚本保证原子性:
lua复制local current = redis.call('GET', KEYS[1])
if tonumber(current) < tonumber(ARGV[1]) then
return redis.call('INCR', KEYS[1])
end
return current
3.2 位图高级应用
SETBIT和GETBIT命令可以实现超空间节省的用户签到系统。我曾用1MB空间存储了800万用户的月度签到数据:
bash复制# 用户10086在第一天签到
SETBIT sign:202307 10086 1
# 统计当月签到人数
BITCOUNT sign:202307
4. 哈希与列表命令最佳实践
4.1 哈希表字段操作
用户会话存储是HSET的典型用例。相比字符串JSON序列化,哈希存储节省了大量空间:
bash复制HSET user:session:token123 last_active 1689321600 ip "192.168.1.100"
HGETALL user:session:token123
避坑指南:HGETALL在字段多时会阻塞,建议用HSCAN或直接获取特定字段。
4.2 列表消息队列
用LPUSH+BRPOP实现简易消息队列时,要注意连接超时设置:
bash复制# 生产者
LPUSH order:queue '{"order_id":1001}'
# 消费者(阻塞30秒)
BRPOP order:queue 30
在物流系统中,我们通过调整阻塞时间平衡实时性和资源消耗。
5. 集合与有序集合高级用法
5.1 社交关系处理
SADD和SINTER能高效处理共同好友关系。微博式社交网络的实现:
bash复制# 用户关注
SADD user:1001:following 1002 1003
# 获取共同关注
SINTER user:1001:following user:1002:following
5.2 排行榜实现
电商热销榜用ZADD+ZREVRANGE实现毫秒级响应:
bash复制ZADD product:rank 1523 "sku:1001" 987 "sku:1002"
ZREVRANGE product:rank 0 9 WITHSCORES
我曾通过调整分数算法解决秒杀商品排名问题:
bash复制# 综合销量和时间衰减
ZINCRBY product:rank 1 "sku:1001"
ZINCRBY product:rank -0.1 "sku:1001"
6. 事务与管道优化技巧
6.1 原子批量操作
MULTI/EXEC事务在库存扣减场景中必不可少:
bash复制MULTI
DECR stock:1001
INCR order:count
EXEC
但要注意事务内不要包含耗时操作,否则会阻塞整个实例。
6.2 管道性能提升
在数据迁移时,管道(Pipeline)能将吞吐量提升10倍以上:
python复制pipe = r.pipeline()
for key in keys:
pipe.get(key)
results = pipe.execute()
实测对比:
| 操作方式 | 10000次GET耗时 |
|---|---|
| 普通模式 | 12.8秒 |
| 管道模式 | 1.2秒 |
7. 运维相关关键命令
7.1 状态监控
INFO命令输出的30+个模块信息是性能调优的金矿。我习惯定期采集这些指标:
bash复制# 内存碎片率
INFO memory | grep ratio
# 持久化状态
INFO persistence
7.2 配置动态调整
CONFIG SET可以在线修改部分参数,比如应对突发流量:
bash复制CONFIG SET maxmemory 8gb
CONFIG SET timeout 300
但要注意这些修改重启后会失效,需要同步到配置文件。
8. 危险命令防御方案
8.1 生产环境禁用命令
在redis.conf中禁用高风险命令:
conf复制rename-command FLUSHALL ""
rename-command KEYS ""
8.2 慢查询分析
SLOWLOG帮助我们发现性能瓶颈:
bash复制SLOWLOG GET 5
典型慢查询特征:
- 大键操作(O(N)复杂度)
- 未使用索引的模糊查询
- 事务中包含大量命令
在Redis集群中使用命令时,要特别注意键哈希标签的规范使用,确保相关键分布在相同节点。比如使用{}强制定位:
bash复制# 保证user和session在同一个节点
SET {user1001}:profile "data"
SET {user1001}:session "token"
掌握这些命令的细节差异和最佳实践,能让你在真实业务场景中游刃有余。我建议搭建测试环境,针对每个命令进行边界测试——比如尝试对不同类型的键执行不匹配的操作,观察返回错误,这种经验比文档更让人记忆深刻。
