Skip to content

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"); // 可能重定向到其他节点
}

总结对比

特性单机主从哨兵集群
数据容量单机内存单机内存单机内存多节点扩展
高可用半自动✅自动故障转移✅自动故障转移
扩容✅在线扩缩容
适用场景开发测试读多写少高可用要求大数据+高并发

核心建议:

  1. 优先选择Redis 7.0+(2022年发布,性能提升30%)
  2. 生产环境至少使用哨兵模式
  3. 内存超过50GB用集群模式
  4. 慎用KEYS *命令(用SCAN替代)

示例:电商系统架构