Redis 键(key)

Redis 键(Key)全攻略

键是 Redis 的基石 —— 掌握键的设计、操作、管理、过期、遍历、命名规范,你就掌握了 Redis 的“命脉”。


一、键(Key)是什么?

Redis 所有数据都以 Key-Value 形式存储
Key字符串类型,唯一标识一条数据。

SET user:1001:name "张三"    → key = "user:1001:name"
HSET user:1001 age 25       → key = "user:1001"

二、键的命名规范(生产必备!)

规则示例说明
模块:对象:ID:字段user:1001:name清晰可读
使用冒号 : 分隔order:20251112:status层次分明
避免特殊字符user@1001 → 错误仅限 a-z 0-9 _ - : .
长度控制 < 100 字节过长影响性能建议 < 50 字符
语义化命名cache:article:1001便于运维

推荐命名模板

场景命名模板
用户信息user:{uid}
用户字段user:{uid}:name
会话sess:{token}
缓存cache:{type}:{id}
排行榜rank:{game}:{date}
分布式锁lock:{resource}:{id}
临时数据tmp:job:{id}

三、键的常用操作命令

命令说明示例
EXISTS key是否存在EXISTS user:10011
DEL key [key ...]删除DEL user:1001 temp:1
EXPIRE key seconds设置过期(秒)EXPIRE cache:1 3600
PEXPIRE key ms毫秒级过期PEXPIRE lock:1 30000
TTL key剩余时间(秒)TTL cache:13500
PTTL key剩余时间(毫秒)PTTL lock:1
PERSIST key移除过期PERSIST cache:1
RENAME key newkey重命名RENAME old new
RENAMENX key newkey不存在才重命名RENAMENX a b
TYPE key返回数据类型TYPE user:1001hash
OBJECT ENCODING key内部编码OBJECT ENCODING list:1ziplist

四、键的过期机制(TTL)

1. 设置过期

SET cache:article:1 "content" EX 3600    # 1小时
SET lock:order:1 "ok" PX 30000          # 30秒

2. 过期策略

策略说明
定时删除创建定时器,过期立即删 → CPU 压力大
惰性删除访问时才检查 → 内存可能浪费
定期删除每隔一段时间清理 → Redis 实际采用

Redis 结合 惰性 + 定期删除,内存友好


五、键的遍历(慎用 KEYS!)

错误做法(生产禁用)

KEYS *                  → O(N),阻塞服务器!
KEYS user:*             → 大数据量会卡死

正确做法:SCAN 渐进式遍历

SCAN 0 MATCH user:* COUNT 100
# 返回: 1) "12345"  2) 1) "user:1001" 2) "user:1002" ...

SCAN 优势

  • 非阻塞
  • 可控速度(COUNT
  • 支持通配符

实战:安全删除所有缓存

# Python 示例(推荐)
import redis
r = redis.Redis()

cursor = 0
while True:
    cursor, keys = r.scan(cursor, match="cache:article:*", count=100)
    if keys:
        r.delete(*keys)
    if cursor == 0:
        break

六、键的空间与管理

查看键数量

DBSIZE                  → 当前数据库 key 总数
INFO keyspace           → 每个 db 的 key 数

切换数据库

SELECT 0 ~ 15           → Redis 默认 16 个 db

生产建议只用 db0,用命名空间区分


七、键的设计原则(高性能 + 可维护)

原则说明
避免大 keyList/Hash/Set > 10万 元素 → 拆分
合理过期缓存设置 TTL,防止内存泄漏
命名空间隔离prod:user:1 vs dev:user:1
键名短而清晰u:1001:n → 不如 user:1001:name
避免频繁 SCAN/KEYS用业务逻辑管理

八、键的内存占用分析

# 查看单个 key 内存
MEMORY USAGE user:1001
# 输出:256 bytes

# 查看所有 key 内存分布(Redis 7.0+)
MEMORY STATS

大 key 排查脚本

redis-cli --bigkeys
# 输出:
# -------- summary -------
# Sampled 100000 keys
# Biggest string found "cache:large" with 10 MB
# Biggest hash found "user:stats" with 50000 fields

九、键的生命周期管理

graph TD
    A[创建 SET/HSET/ZADD] --> B{设置过期?}
    B -->|是| C[EXPIRE/PX]
    B -->|否| D[永久存储]
    C --> E[惰性/定期删除]
    E --> F[内存释放]
    D --> G[手动 DEL / PERSIST]

十、实战案例:键在业务中的应用

场景键设计命令
用户登录态sess:{token}SET sess:abc123 "1001" EX 86400
分布式锁lock:order:1001SET lock:order:1001 "ok" NX PX 30000
文章缓存cache:article:1001SET cache:article:1001 "{json}" EX 600
排行榜rank:game:20251112ZADD rank:game:20251112 1500 "p1"
临时任务tmp:job:uuidSET tmp:job:abc EX 3600

十一、一键速查表(贴墙必备)

# 键操作
EXISTS k          → 1/0
DEL k1 k2         → 删除数
EXPIRE k 3600     → 1小时
TTL k             → 剩余秒
TYPE k            → string/hash/zset
SCAN 0 MATCH u:* COUNT 100

# 内存
MEMORY USAGE k
INFO keyspace
DBSIZE

十二、常见问题与解决方案

问题原因解决方案
内存暴涨未设置 TTL批量加过期
响应卡顿使用 KEYS *改用 SCAN
大 key 阻塞List 有 100万元素拆分为 list:1:0~10000
键冲突命名混乱统一命名规范

十三、工具推荐

工具用途
redis-cli --bigkeys查找大 key
redis-cli --scan --pattern "user:*"安全遍历
RedisInsight图形化查看键、TTL、内存
redis-cli MEMORY DOCTOR内存诊断

完成!你已精通 Redis 键管理!

# 一行命令:查看所有 user 键并设置 1 小时过期
redis-cli --scan --pattern "user:*" | xargs -r redis-cli EXPIRE 3600

下一步推荐

  1. Redis 大 key 优化
  2. 分布式锁实现(SET NX PX)
  3. 缓存穿透/雪崩解决方案

需要我帮你

  • 生成项目专属键命名规范
  • 分析线上大 key 并给拆分方案
  • 写一个自动清理过期键的脚本

回复:命名规范 | 大key | 清理脚本 即可!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部