Redis 是一个开源的内存数据结构存储系统,支持多种数据类型和原子操作,广泛应用于缓存、消息队列、分布式锁等场景。以下是其核心知识点:
一、核心特性
-
内存存储
数据完全存储在内存中,读写速度极快(单节点可达数十万至百万 ops/s)。
-
丰富的数据类型
支持 String、Hash、List、Set、Sorted Set 等基础类型,以及 Bitmap、HyperLogLog、Geo 等扩展类型。
-
原子性与事务
单个命令原子执行;通过
MULTI/EXEC实现事务(不支持回滚);Lua 脚本可保证多命令原子性。 -
持久化机制
-
RDB:定时生成内存快照,恢复速度快但可能丢失数据。
-
AOF:记录写命令日志,数据更完整但文件较大。
-
混合持久化:结合 RDB 和 AOF,平衡性能与数据安全。
-
二、核心数据结构与使用场景
| 数据类型 | 特点与用途 | 典型命令 |
|---|---|---|
| String | 最基础类型,存储字符串或二进制数据(如图片),支持计数器、缓存等场景 | SET, GET, INCR |
| Hash | 键值对集合,适合存储对象(如用户信息),节省内存 | HSET, HGET, HGETALL |
| List | 双向链表,支持消息队列、任务调度,可阻塞操作(如 BLPOP) |
LPUSH, RPOP, LRANGE |
| Set | 无序集合,支持去重、交集/并集/差集操作,适合标签系统、共同关注等场景 | SADD, SMEMBERS, SINTER |
| Sorted Set | 带分数的有序集合,用于排行榜、延迟队列(按分数排序) | ZADD, ZRANGE, ZREVRANK |
| Bitmap | 位图操作,高效统计二值状态(如签到、用户活跃) | SETBIT, GETBIT |
| HyperLogLog | 基数估算,内存极小,用于 UV 统计(误差约 0.81%) | PFADD, PFCOUNT |
| Stream | 日志流结构,支持消息队列(ACK、消费组),适合可靠消息传递 | XADD, XREADGROUP |
三、高可用与扩展
-
主从复制
异步复制数据到从节点,支持读扩展和备份,但存在数据延迟风险。
-
哨兵模式(Sentinel)
自动监控主节点状态,触发故障转移(选举新主节点)。
-
集群模式(Cluster)
数据分片存储(16384 个哈希槽),支持水平扩展,需注意跨槽操作限制。
四、内存管理与性能优化
-
内存淘汰策略
设置
maxmemory限制,配置策略如volatile-lru(淘汰最近最少使用的带过期时间的键)。 -
持久化与恢复
-
RDB 优先用于快速恢复,AOF 用于数据完整性。
-
混合持久化(AOF + RDB)平衡性能与数据安全。
-
-
性能优化技巧
-
使用管道(Pipelining)减少 RTT。
-
避免
KEYS *、SMEMBERS等 O(N) 命令,改用SCAN分页。 -
热点数据分散存储,避免单点瓶颈。
-
五、常见问题与解决方案
-
缓存穿透
-
问题:查询不存在的数据导致数据库压力大。
-
方案:缓存空值或使用布隆过滤器。
-
-
缓存击穿
-
问题:热点数据过期后大量请求涌入数据库。
-
方案:互斥锁(Redisson)或逻辑过期(异步重建)。
-
-
缓存雪崩
-
问题:大量 Key 同时失效。
-
方案:为 TTL 添加随机值,分散失效时间。
-
六、典型应用场景
-
缓存:减轻数据库压力,提升响应速度。
-
分布式锁 :通过
SETNX或 RedLock 实现资源互斥访问。 -
消息队列:基于 List 或 Stream 实现异步通信。
-
排行榜:利用 Sorted Set 按分数排序。
七、常用命令示例
# 字符串操作
SET key value # 设置键值
GET key # 获取键值
# 哈希操作
HSET user name "Alice" # 存储对象字段
HGETALL user # 获取所有字段及值
# 列表操作
LPUSH task "task1" # 左端插入元素
RPOP task # 右端弹出元素
# 事务操作
MULTI # 开启事务
EXEC # 提交事务
通过合理选择数据结构和配置持久化策略,Redis 能在高性能场景下稳定运行。建议结合具体业务需求,参考官方网页及最佳实践。