Redis 基础
📌 一、Redis 核心定位与特性
定义与价值
Redis(Remote Dictionary Server)是内存型键值数据库,支持多种数据结构,兼具缓存、消息队列、分布式锁等功能。核心优势在于高性能(单机10万+ QPS)和丰富的数据模型,适用于高并发场景。核心特性
- 内存存储:数据全内存操作,读写速度极快
- 多数据结构:支持9种数据类型(5种基础+4种高级),灵活应对复杂业务
- 持久化:提供 RDB 快照 和 AOF 日志两种数据落盘方案
- 高可用:通过主从复制、哨兵模式、集群实现故障自动转移
- 原子操作:所有命令单线程执行,保证操作原子性
🧩 二、核心数据类型详解
1. 基础数据类型(5种)
类型 | 结构特性 | 典型场景 | 命令示例 |
---|---|---|---|
String | 文本/二进制数据 | 缓存、计数器 | SET user:1 "Alice" INCR views |
Hash | 字段-值映射表 | 用户信息存储 | HSET user:1001 name "Bob" age 28 |
List | 双向链表 | 消息队列、最新动态 | LPUSH tasks "task1" RPOP tasks |
Set | 无序唯一集合 | 共同好友、标签系统 | SADD tags:1001 "tech" "news" |
Sorted Set | 带分数的有序集合 | 排行榜、优先级队列 | ZADD rank 95 "PlayerA" |
2. 高级数据类型(4种)
- Bitmaps:位级操作(如记录30天签到)
SETBIT sign:202408 15 1 # 8月15日签到 BITCOUNT sign:202408 # 统计当月签到天数
- HyperLogLog:海量数据去重(误差率0.81%)
PFADD ip:202408 192.168.1.1 PFCOUNT ip:202408 # 估算独立IP数
- GEO:地理位置计算(基于Sorted Set实现)
GEOADD shops 116.40 39.90 "Beijing" GEORADIUS shops 116.41 39.91 5 km # 5公里内门店
- Stream:支持消费组的消息队列
XADD orders * product "Phone" price 599 XREAD COUNT 2 STREAMS orders 0-0
💾 三、持久化机制精解
1. RDB(快照持久化)
# redis.conf 配置示例
save 900 1 # 15分钟内1次修改触发
save 300 10 # 5分钟内10次修改触发
dbfilename dump.rdb
- 优点:恢复速度快(二进制压缩文件),适合冷备份
- 缺点:可能丢失最近一次快照后的数据
2. AOF(操作日志追加)
appendonly yes
appendfsync everysec # 每秒同步
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
- 优点:数据丢失少(最多丢1秒数据),日志可读
- 缺点:文件体积大,恢复速度慢
3. 混合持久化(Redis 4.0+)
aof-use-rdb-preamble yes # RDB+AOF组合
- 原理:AOF文件前半部分为RDB格式,后半部分为增量命令
⚙️ 四、高可用架构实战
1. 主从复制(读写分离)
# 从节点配置 (redis.conf)
replicaof 192.168.1.100 6379
masterauth yourpassword
- 主节点处理写,从节点处理读,提升读并发能力
2. 哨兵模式(故障转移)
# sentinel.conf 配置
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 5000
- 自动监控主节点状态,主宕机时选举新主节点
3. Cluster集群(数据分片)
# 节点配置
cluster-enabled yes
cluster-config-file nodes.conf
# 创建集群
redis-cli --cluster create 192.168.1.100:7000 192.168.1.101:7000 --cluster-replicas 1
- 数据分片存储(16384个槽),支持水平扩展
🚀 五、典型应用场景
1. 缓存加速
- 模式:数据库查询结果缓存
- 案例:商品详情页查询从 2s → 50ms
2. 分布式锁
# Python实现(原子操作)
lock = redis.set("res:lock", "uuid", nx=True, ex=10)
if lock:
# 执行业务逻辑
redis.delete("res:lock")
3. 实时排行榜
ZADD leaderboard 95 "PlayerA" 87 "PlayerB"
ZREVRANGE leaderboard 0 9 WITHSCORES # TOP10
4. 消息队列
# List实现简单队列
LPUSH orders "order1001"
RPOP orders
🔧 六、性能调优关键点
内存优化
- 避免 BigKey(单Key数据过大)
- 使用
ziplist
压缩小哈希 - 配置淘汰策略:
maxmemory-policy allkeys-lru
网络优化
- Pipeline 批量操作减少网络往返
pipe = redis.pipeline() for i in range(1000): pipe.set(f"key{i}", f"value{i}") pipe.execute()
监控命令
INFO memory # 内存分析 SLOWLOG GET 10 # 慢查询追踪
💎 总结:Redis 学习路径与实践指南
📚 知识体系全景
🛠️ 实践建议
- 数据类型选择:根据场景需求匹配结构(如对象存储用Hash,排序用Sorted Set)
- 持久化策略:
- 容忍分钟级丢失 → RDB
- 要求高可靠 → AOF每秒同步
- 平衡方案 → RDB+AOF混合
- 性能陷阱规避:
- 禁用
KEYS *
→ 用SCAN
替代 - 大Key拆分 → 单Value不超过10KB
- 禁用
学习资源推荐:
- 命令手册:https://redis.io/commands
- 经典教材:《Redis设计与实现》
- 源码解析:https://github.com/huangz1990/redis-3.0-annotated