Redis和三大消息队列
中间件核心概念解析
1. Redis
Redis是一种高性能的内存数据库,支持多种数据结构和持久化机制,常用于缓存、队列等场景。
(1)核心数据结构
数据结构 | 特性与典型应用场景 |
---|---|
String | 存储文本、数值(如计数器),支持原子操作(INCRINCR) |
Hash | 存储对象(如用户信息:user:id:1→{name:"Alice",age:25}user:id:1→{name:"Alice",age:25}) |
List | 双向链表,实现队列(LPUSH/RPOPLPUSH/RPOP)或栈(LPUSH/LPOPLPUSH/LPOP) |
Set | 无序集合,支持交并差集操作(如去重、共同好友) |
ZSet | 有序集合,按分值排序(如排行榜:ZADDleaderboard100"user1"ZADDleaderboard100"user1") |
HyperLogLog | 基数统计(估算不重复元素数量,误差约0.81%0.81%) |
(2)持久化机制
-
RDB(快照):
- 定时生成内存数据快照(二进制文件)。
- 优点:恢复速度快,适合备份。
- 缺点:可能丢失最后一次快照后的数据(如宕机时)。
-
AOF(追加日志):
- 记录所有写操作命令(文本日志)。
- 优点:数据丢失风险低(可配置每秒同步)。
- 缺点:文件体积大,恢复速度慢。
(3)缓存问题与解决方案
问题 | 现象 | 解决方案 |
---|---|---|
穿透 | 查询不存在的数据(如恶意攻击) | 布隆过滤器(快速判断数据是否存在) |
击穿 | 热点数据过期后,高并发请求压垮数据库 | 互斥锁(仅允许一个线程重建缓存) |
雪崩 | 大量缓存同时过期,导致数据库瞬时压力激增 | 设置随机过期时间(如基础时间+随机偏移基础时间+随机偏移) |
2. 消息队列
消息队列用于解耦系统组件,实现异步通信与流量削峰。
(1)Kafka
- 核心机制:
- 分区与副本:
- 每个主题(Topic)分为多个分区(Partition),支持水平扩展。
- 每个分区有多个副本(Replica),主副本(Leader)处理读写,从副本(Follower)同步数据。
- ISR列表:
- In-Sync Replicas(同步副本列表),只有ISR中的副本可参与选举Leader。
- 保障数据一致性:生产者需等待所有ISR副本确认写入(acks=allacks=all)。
- 分区与副本:
(2)RabbitMQ
- 核心特性:
- Exchange路由模型:通过直连(Direct)、主题(Topic)、扇出(Fanout)等Exchange类型路由消息。
- 消息确认机制:消费者手动ACK确认消息处理完成,避免消息丢失。
(3)RocketMQ
- 核心功能:
- 事务消息:
- 生产者发送半消息(暂存至Broker)。
- 执行本地事务并提交结果。
- Broker根据结果提交或回滚消息。
- 延迟消息:支持18个预设延迟级别(如1s、5s、10s),定时触发消息消费。
- 事务消息:
对比与总结
中间件 | 核心优势 | 典型场景 |
---|---|---|
Redis | 高性能内存操作,丰富数据结构 | 缓存、计数器、实时排行榜 |
Kafka | 高吞吐量,分区与副本保障可靠性 | 日志收集、流处理、大数据管道 |
RabbitMQ | 灵活的路由机制,强一致性保障 | 企业级异步通信、复杂路由场景 |
RocketMQ | 事务消息与延迟消息支持,阿里生态集成 | 电商订单、金融交易等强一致性场景 |