Skip to content

参考:命令速查、持久化对比与易错点

基于 Redis 7.x · 核于 2026-08

速查

  • Redis 定义:内存键值数据结构存储,单线程事件循环 + IO 多路复用,单实例十万级 QPS、微秒级延迟。
  • 六大结构:strings(缓存/计数)、hashes(对象)、lists(队列)、sets(去重/集合运算)、sorted sets(排行榜/延迟队列)、streams(持久化消息队列)。
  • 持久化:RDB(快照,小而快但丢数据)/ AOF(日志,everysec 丢 1 秒)/ 混合(4.0+,生产推荐)。
  • 高可用:主从(异步复制,读写分离)/ Sentinel(3+ 节点监控,自动故障转移,不分片)/ Cluster(16384 槽分片 + 高可用一体)。
  • 缓存模式:cache-aside(旁路,推荐)/ write-through(同步穿透)/ write-back(异步回写,可能丢数据)。
  • 三大问题:穿透(查不存在的,布隆过滤器)/ 击穿(热 key 过期,互斥锁)/ 雪崩(大量同时过期,过期加随机 + 高可用)。
  • Lua vs MULTI:Lua 才是真原子;MULTI/EXEC 不支持回滚。
  • 许可:7.4 起改 RSALv2/SSPL(非 OSI 开源),Valkey(Linux 基金会 fork,BSD)是替代。

一、六大数据结构命令速查

结构其他
stringsSET/SETEX/SETNX/INCR/APPENDGET/STRLENSETBIT/BITCOUNT(bitmap)/PFADD/PFCOUNT(hll)
hashesHSET/HSETNX/HINCRBY/HDELHGET/HMGET/HGETALL/HLENHSCAN(增量遍历大 hash)
listsLPUSH/RPUSH/LPOP/RPOP/LSETLRANGE/LINDEX/LLENBLPOP/BRPOP(阻塞)/LTRIM(保留区间)
setsSADD/SREM/SMOVESMEMBERS/SISMEMBER/SCARD/SRANDMEMBERSINTER/SUNION/SDIFF/SPOP
sorted setsZADD/ZINCRBY/ZREMZSCORE/ZRANK/ZREVRANK/ZRANGE/ZRANGEBYSCOREZPOPMIN/ZPOPMAX/BZPOPMAX
streamsXADD(带 MAXLEN ~ NXLEN/XRANGE/XREAD/XREADGROUPXACK/XPENDING/XCLAIM/XGROUP

二、数据结构选型表

需求命令示例
缓存 JSON/HTMLstringsSET page:home <html> EX 60
原子计数器/限流stringsINCR count:user1
存对象(多字段)hashesHSET user:1 name a age 30
消息队列(无 ACK)listsLPUSH q task + BRPOP q 0
消息队列(可靠)streamsXADD + XREADGROUP + XACK
排行榜sorted setsZADD rank 100 a + ZREVRANGE rank 0 9
延迟队列sorted setsZRANGEBYSCORE delay 0 now
标签/共同好友setsSINTER/SUNION/SDIFF
活跃用户统计(位)bitmapsSETBIT login:20260807 uid 1
去重基数(UV)hyperloglogPFADD uv:20260807 uid + PFCOUNT
分布式锁strings + LuaSET lock v NX EX 10 + Lua 验证删

三、持久化对比

维度RDBAOF(everysec)混合(4.0+)
数据安全两次快照间丢最多丢 1 秒最多丢 1 秒
恢复速度较快(RDB 主体)
文件体积大(要 rewrite)
fork 开销每次快照 fork仅 rewrite fork仅 rewrite fork
生产推荐备份用单用偏慢推荐aof-use-rdb-preamble yes

四、三大缓存问题对策

问题触发对策
穿透查不存在的 key缓存空值(短过期)/ 布隆过滤器前置
击穿单热 key 过期互斥锁(setnx 抢锁查 DB 回填)/ 永不过期 + 异步更新
雪崩大量同时过期 / Redis 挂过期时间加随机值 / 多级缓存 / 限流降级 / 高可用(Sentinel/Cluster)

五、易错点清单

  • 「Redis 是多线程的」:错。命令执行单线程;6.0 起仅网络 IO(读写 buffer)用多线程,命令仍串行。所以慢命令(KEYS、大 key 操作)阻塞全实例。
  • 「MULTI/EXEC 是真事务」:错。它只「打包顺序执行」,不支持回滚——某条命令运行时出错,后面的继续执行不回滚。要原子 + 条件判断用 Lua。
  • 「RDB 一定丢数据」:不完全对。RDB 在快照间隔会丢,但 SAVE(阻塞)或 BGSAVE + 频繁 save 配置可降低丢失。AOF everysec 也最多丢 1 秒,二者都不是零丢失。
  • 「主从复制是强一致」:错。复制是异步的,主写完立即回客户端,未同步到从的写在主挂时会丢——所以 Redis 复制是最终一致,不当金融真相源。
  • 「Cluster 支持跨节点事务」:错。Cluster 中多 key 命令(MULTI/Lua)涉及的 key 必须在同一槽(用 hash tag {} 保证),否则报错。跨节点无分布式事务。
  • 「list 当队列消息可靠」:错。RPOP 取出消息后消费者崩溃就丢(无 ACK)。要可靠用 stream(XACK)或外接 RabbitMQ/Kafka。
  • 「set 过期会自动清理」:部分对。Redis 用惰性 + 定期删除——惰性是访问时才删,定期是周期抽样。大量过期但不访问的 key 会占内存直到定期删到,要靠淘汰策略兜底。
  • 「布隆过滤器能删除元素」:错。标准布隆过滤器不支持删除(一位可能被多个元素共享)。要删除用 Counting Bloom Filter 或 Cuckoo Filter。
  • 「Redis 7.4 还是 BSD 开源」:错。7.4 起改 RSALv2/SSPL,不被 OSI 认为是开源。要纯开源选 Valkey(Linux 基金会 fork,BSD)。
  • 「分布式锁 SETNX 就够了」:错。SETNX + EXPIRE 两步非原子(SETNX 后崩溃则锁永不过期)。要用 SET key val NX EX 10(一条命令原子),释放锁用 Lua(验证持锁者再删,避免误删别人的锁)。

六、进阶方向

权威链接