Redis详解
一、Redis数据结构
一、是什么?
Redis是内存键值数据库,提供8种核心数据结构:
- String(字符串)
- List(列表)
- Hash(哈希表)
- Set(集合)
- ZSet(有序集合)
- Bitmap(位图)
- HyperLogLog(基数统计)
- Stream(流,Redis 5.0+)
二、解决什么问题
解决传统键值存储功能单一的问题,通过丰富的数据结构支持复杂业务场景(如排行榜、实时统计),同时保持高性能(10万+ QPS)。
三、核心操作示例
java
// String
jedis.set("user:1", "Alice");
// List
jedis.lpush("queue", "task1");
// Hash
jedis.hset("user:1", "age", "30");
// ZSet
jedis.zadd("rank", 90, "Alice");
四、应用场景
- String:缓存、计数器
- ZSet:游戏排行榜
- Stream:消息队列(替代Kafka轻量场景)
- HyperLogLog:UV统计(误差0.81%)
五、内存优化
二、线程模型
一、是什么?
Redis 6.0前纯单线程,6.0+引入多线程网络I/O(核心逻辑仍单线程)。
二、解决什么问题
- 单线程:避免锁竞争,保证原子性
- 多线程I/O:解决网络瓶颈(提升吞吐量300%)
三、配置参数
conf
# redis.conf
io-threads 4 # 启用4个I/O线程
io-threads-do-reads yes
四、应用场景
- 单线程:命令简单场景(GET/SET)
- 多线程:高并发推送(如直播间弹幕)
三、事务
一、是什么?
通过MULTI/EXEC
打包命令,但不支持回滚(部分失败继续执行)。
二、解决什么问题
保证命令序列的原子执行(如:库存扣减+订单创建)。
三、Java事务示例
java
Transaction tx = jedis.multi();
tx.decr("stock");
tx.sadd("order:2023", "item1");
tx.exec(); // 若stock不足,sadd仍会执行!
四、VS数据库事务
特性 | Redis事务 | MySQL事务 |
---|---|---|
原子性 | 命令级 | 语句级 |
回滚 | ❌不支持 | ✅支持 |
隔离性 | 串行执行 | 多级别 |
四、日志(AOF)
一、是什么?
Append Only File,记录所有写操作命令(文本格式)。
二、解决什么问题
数据持久化(默认RDB快照可能丢失最新数据)。
三、写回策略
四、应用场景
- 金融交易:
always
模式(牺牲性能保数据) - 通用缓存:
everysec
模式(平衡点)
五、内存管理
一、过期删除策略
- 惰性删除:访问时检查过期
- 定期删除:随机扫描过期键(默认10次/秒)
二、内存淘汰策略
conf
# redis.conf
maxmemory-policy volatile-lru # 8种策略可选
策略 | 特点 |
---|---|
volatile-lru | 淘汰最近最少用+有过期时间 |
allkeys-lfu | 全键淘汰+使用频率最低 |
noeviction | 禁止写入(默认) |
三、内存优化技巧
java
// 使用Hash替代多个String
jedis.hset("user:1", Map.of("name","Alice","age","30"));
// 比2个String节省50%内存
六、架构模式
一、单机模式
- 特点:简单,无高可用
- 瓶颈:内存容量限制
二、主从复制
- 作用:读写分离(写Master,读Slave)
- 风险:数据丢失(异步复制)
三、哨兵模式(Sentinel)
- 功能:自动故障转移(主宕机选新主)
- 部署:至少3节点(避免脑裂)
bash
redis-sentinel sentinel.conf
四、集群模式(Cluster)
- 数据分片:16384个槽(slot)
- 重定向机制:
java
// JedisCluster自动处理MOVED错误
try (JedisCluster cluster = new JedisCluster(nodes)) {
cluster.set("key", "value"); // 可能重定向到其他节点
}
总结对比
特性 | 单机 | 主从 | 哨兵 | 集群 |
---|---|---|---|---|
数据容量 | 单机内存 | 单机内存 | 单机内存 | 多节点扩展 |
高可用 | ❌ | 半自动 | ✅自动故障转移 | ✅自动故障转移 |
扩容 | ❌ | ❌ | ❌ | ✅在线扩缩容 |
适用场景 | 开发测试 | 读多写少 | 高可用要求 | 大数据+高并发 |
核心建议:
- 优先选择Redis 7.0+(2022年发布,性能提升30%)
- 生产环境至少使用哨兵模式
- 内存超过50GB用集群模式
- 慎用
KEYS *
命令(用SCAN
替代)
示例:电商系统架构