Redis(一)
Redis 基础核心
(1)定义与核心特性
Redis 是基于 C 语言开发的开源内存 NoSQL 数据库,以 KV 键值对存储数据,支持持久化,读写速度极快。核心特性包括:支持多种数据类型、事务、Lua 脚本、发布订阅、集群方案(Sentinel/Cluster),无外部依赖,推荐 Linux 生产环境部署。
(2)高性能原因
- 纯内存操作:数据读写均在内存中,访问速度为纳秒级,远超磁盘 IO;
- 高效 I/O 模型:单线程事件循环 + I/O 多路复用,避免线程切换和锁竞争;
- 优化的数据结构:内置多种数据类型,底层动态选择最优编码(如 ziplist、skiplist);
- 简洁通信协议:RESP 协议解析高效,序列化 / 反序列化开销小。
(3)与 Memcached 对比
| 对比维度 | Redis | Memcached |
|---|---|---|
| 数据类型 | 支持 String/List/Hash/Set/Zset 等丰富类型 | 仅支持简单 KV 类型 |
| 持久化 | 支持 RDB/AOF/ 混合持久化 | 不支持,数据仅存内存 |
| 集群支持 | 3.0+ 原生支持集群 | 无原生集群,依赖客户端分片 |
| 线程模型 | 单线程(6.0+ 网络 IO 多线程) | 多线程非阻塞 IO 模型 |
| 特性支持 | 支持事务、Lua 脚本、发布订阅 | 不支持 |
| 过期删除 | 定期删除 + 惰性删除 | 仅惰性删除 |
(4)与本地缓存对比
Redis 优势在于数据一致性强、内存空间更大、支持持久化、集中管理、功能丰富;本地缓存受单服务器内存限制,多服务器部署易数据不一致,仅适用于简单场景。
Redis 核心应用场景
- 分布式缓存:存储高频访问数据(如用户信息、商品详情),减轻数据库压力;
- 分布式锁:基于 Redisson 实现,保障分布式环境下数据一致性;
- 限流:Redis+Lua 脚本或 Redisson 的 RRateLimiter,基于令牌桶算法实现;
- 消息队列:List(简易队列)、Stream(5.0+,支持消费组、ACK、持久化);
- 延时队列:Redisson 内置延时队列(基于 Sorted Set),避免 Redis 过期事件监听的缺陷;
- 分布式 Session:String/Hash 存储 Session 数据,支持多服务器共享;
- 复杂场景:Bitmap 统计活跃用户、Sorted Set 实现排行榜、HyperLogLog 统计 UV。
Redis 数据类型及应用
(1)基础数据类型
- String:二进制安全,存储字符串、整数、序列化对象,应用于缓存、计数、分布式锁(SETNX);
- Hash:存储对象字段,适合频繁修改对象部分字段(如购物车),节省网络流量;
- List:有序可重复,支持首尾操作,应用于简易消息队列、最新消息列表;
- Set:无序不可重复,支持交集 / 并集 / 差集,应用于去重、共同好友、抽奖系统;
- Zset(有序集合):按分数排序,应用于排行榜、带权重的消息队列。
(2)特殊数据类型
- Bitmap:二进制位存储,节省空间,用于活跃用户统计、签到功能;
- HyperLogLog:基数统计,占用空间小,用于 UV 统计(允许少量误差);
- Geospatial:地理位置存储,支持距离计算、附近的人功能。
(3)关键选型建议
- 对象存储:简单对象用 String,需频繁修改部分字段用 Hash;
- 购物车:用 Hash(用户 ID 为 key,商品 ID 为 field,数量为 value);
- 排行榜:优先 Zset(支持排序和排名查询);
- UV 统计:数据量大用 HyperLogLog,精准统计用 Set。
Redis 核心机制
(1)线程模型
- 核心逻辑单线程:Redis 6.0 前所有命令执行单线程;6.0 后网络 IO 引入多线程,命令执行仍单线程,避免线程安全问题;
- 后台线程:处理大键删除、AOF 刷盘、临时文件关闭等耗时操作,不阻塞主线程。
(2)持久化机制
支持 RDB(快照持久化,适合备份)、AOF(日志持久化,数据丢失少)、混合持久化(结合两者优势),核心解决内存数据断电丢失问题。
(3)过期键处理
- 过期存储:通过过期字典记录键的过期时间(UNIX 时间戳);
- 删除策略:定期删除(随机抽查过期键)+ 惰性删除(查询时检查过期),平衡 CPU 和内存开销;
- 集中过期应对:避免键集中过期,开启 lazy free 机制异步删除,降低主线程阻塞风险。
(4)内存淘汰策略
当内存达到 maxmemory 阈值时触发,核心策略包括:
volatile-lru:淘汰过期键中最近最少使用的;allkeys-lru:淘汰所有键中最近最少使用的(推荐热点数据场景);volatile-lfu/allkeys-lfu:淘汰最不经常使用的键;noeviction:默认策略,禁止淘汰,新写入报错。
Redis 高级特性
(1)Redis Module
4.0+ 支持动态加载模块扩展功能,官方推荐模块包括:RediSearch(搜索引擎)、RedisJSON(JSON 处理)、RedisBloom(布隆过滤器)、RedisCell(限流)。
(2)消息队列实现
- List:通过 RPUSH/LPOP 或阻塞式 BRPOP 实现简易队列,无广播和 ACK 机制;
- Pub/Sub:支持发布订阅,但无持久化,客户端断开或 Redis 宕机导致消息丢失;
- Stream:5.0+ 新增,支持消费组、ACK、持久化,类似 Kafka,是最优 Redis 消息队列方案。
(3)分布式锁实现
基于 Redisson 实现,底层结合 Lua 脚本保证命令原子性,支持自动续期、超时释放,避免死锁。
(4)延时任务实现
- 不推荐:Redis 过期事件监听(时效性差、易丢消息);
- 推荐:Redisson 延时队列(基于 Sorted Set 实现,支持持久化,消息不易丢失)。
关键底层原理
(1)String 底层实现
基于 SDS(简单动态字符串),而非 C 语言原生字符串,优势包括:避免缓冲区溢出、O (1) 获取长度、减少内存分配、二进制安全,支持 5 种动态类型(sdshdr8/16/32/64),根据字符串长度动态选择。
(2)Zset 底层为何用跳表
跳表相比平衡树 / 红黑树 / B+ 树,实现更简单,插入删除无需旋转 / 染色,范围查询效率高,适合内存数据库场景,无需复杂 IO 优化。