Redis核心命令与数据结构详解

发布于:2025-06-26 ⋅ 阅读:(18) ⋅ 点赞:(0)

思维导图概览

一、全局命令精要

⚠️ 1.1 危险命令KEYS 

# 生产环境禁止使用(时间复杂度O(n))
KEYS *  

# 安全替代方案(时间复杂度O(1))
DBSIZE

 ⏱ 1.2 过期时间管理

# 设置18秒后过期
EXPIRE lijin 18

# 毫秒级精度
PEXPIRE lijin 9000

# 指定时间戳过期
EXPIREAT key 1730332800

🔁 1.3 重命名陷阱

# 安全重命名(防止覆盖已有键)
RENAMENX old_key new_key

致命陷阱:SET操作会清除已有过期时间!修改已设置过期时间的键值后,必须重新设置过期时间。

二、数据结构深度解析

2.1 字符串(String)

核心场景:计数器、分布式Session、限流系统

# 原子自增操作
INCR article_view_101

# 分布式锁实现
SETNX lock:order_123 true
EXPIRE lock:order_123 30

# 批量操作提升性能
MSET user:1:name "LiJing" user:1:age 30
MGET user:1:name user:1:age

最佳实践:单值大小控制在500字节内

2.2 哈希(Hash)

核心场景:对象存储、商品属性

# 存储用户对象
HSET user:1001 name "LiJing" age 18 city "Changsha"

# 字段自增
HINCRBY user:1001 score 5

# 批量获取指定字段
HMGET user:1001 name age

优势对比

存储方式 优点 缺点
多String键 直观 键数量爆炸
JSON序列化 结构清晰 序列化开销大
Hash结构 内存优+字段控制 不支持嵌套

2.3 列表(List)

核心场景:消息队列、最新文章列表

# 实现消息队列
LPUSH news "Breaking: Redis 7 released!"
RPOP news

# 阻塞式消费
BRPOP order_queue 30

# 分页获取文章
LRANGE articles 0 9

数据结构转换

左进右出 → 队列(FIFO)
左进左出 → 栈(LIFO)
左进右出+阻塞 → 消息队列

2.4 集合(Set)

核心场景:标签系统、共同好友

# 用户标签管理
SADD user:1001:tags "tech" "redis" "database"

# 共同兴趣计算
SINTER user:1001:tags user:1002:tags

# 随机抽奖
SRANDMEMBER lucky_draw 3

特点:自动去重、无序存储、支持集合运算

2.5 有序集合(ZSet)

核心场景:排行榜、带权重队列

# 成绩排行榜
ZADD exam_scores 90 "LiJing" 95 "BoBo" 100 "MaSheng"

# 查询TOP3
ZREVRANGE exam_scores 0 2 WITHSCORES

# 更新分数
ZINCRBY exam_scores 5 "LiJing"

# 聚合多科成绩
ZUNIONSTORE total_score 2 math_score english_score WEIGHTS 0.5 0.5

排名规则:分数相同按字典序排序

三、键设计规范与陷阱规避

3.1 命名规范

业务名:对象名:id[:字段]

# 好例子
SET order:10086:status "paid"

# 坏例子(无意义过长)
SET user_order_status_10086 "paid"

3.2 集群限制

  • Redis集群仅支持db0

  • 多库设计在集群环境无效

3.3 过期时间陷阱

# 错误操作(覆盖过期时间)
SET key "new_value" 

# 正确操作(保留过期时间)
SET key "new_value" KEEPTTL

四、真实业务场景应用

4.1 电商系统实践

4.2 社交平台方案

# 共同好友计算
SINTER user:1001:friends user:1002:friends

# 可能认识的人(差集)
SDIFF user:1001:friends user:1002:friends

# 影响力排行榜
ZADD influence_rank 982134 "KOL_123" 751289 "KOL_456"

五、高级技巧与性能优化

5.1 管道批处理

# Python示例(提升10倍吞吐)
pipeline = r.pipeline()
for i in range(1000):
    pipeline.incr(f"counter:{i}")
pipeline.execute()

5.2 内存优化策略

  1. 小Hash:field数量<1000时使用ziplist编码

  2. 集合压缩:set-max-intset-entries配置

  3. 分片存储:大Hash按字段分片

5.3 延迟监控

# 检测慢查询
SLOWLOG GET 10

# 监控内存碎片
INFO MEMORY

Redis作为内存数据库,命令的合理使用直接决定系统性能。本文涵盖80%日常开发场景,剩余20%高级功能(Bitmaps/HyperLogLog/Streams)将在后续文章深度解析。

最后提醒:生产环境操作Redis时,务必通过redis-cli --stat实时监控,避免大键操作导致服务阻塞!