## Redis概述
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets)和有序集合(sorted sets)等类型。
### 1.1、NoSQL
NoSQL,泛指非关系型的数据库,是不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储,收集万亿比特的数据。这些类型的数据存储没有固定的形式,没有多余操作就可以横向扩展。
### 1.2、什么是Redis
Redis是NoSQL中的一种存储工具,他是一个key-value存储系统。默认有16个数据库从0到15来进行表示。Redis的存储类型:包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。在此基础上,Redis支持各种不同方式的排序。
Redis 被广泛应用在缓存方向,与传统数据库不同的是 Redis 的数据是存在内存中的,因此读写速度非常快。
Redis为分布式缓存,在多客户端的情况下,共用一份缓存数据,缓存具有一致性。
Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,为了可靠性。
### 1.3、Redis特点
**性能极高** – Redis读的速度是11W次/s,写的速度是81K次/s
**支持数据的持久化**,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
**丰富的数据类型**,Redis不仅仅支持简单的key-value类型的数据,同时还提供Strings, Lists, Hashes, Sets 及 Ordered Sets 等数据结构的存储。
**支持数据的备份**,即master-slave模式的数据备份。
Redis 核心特点一览表
特性类别 | 关键特点 | 技术说明 |
---|---|---|
存储方式 | 内存存储 | 所有数据存储在内存中,读写速度达微秒级 |
线程模型 | 单线程执行 + 多线程I/O(6.0+) | 命令顺序执行保证原子性,6.0版本后网络I/O多线程处理 |
数据结构 | 8种核心数据结构 | String/Hash/List/Set/ZSet/Bitmap/HyperLogLog/Geo/Stream |
持久化 | 双持久化方案 | RDB(快照备份) + AOF(操作日志)两种模式 |
高可用 | 三级扩展方案 | 主从复制 → 哨兵监控 → 集群分片的三级扩展体系 |
性能表现 | 超高吞吐量 | 单机可达10万+ QPS,延迟<1ms |
适用场景 | 高频读写场景 | 缓存/会话管理/实时排行榜/计数器等热点数据 |
使用限制 | 内存容量限制 | 单实例通常管理10-100GB数据,需设置淘汰策略 |
关键特性详解:
-
内存存储:数据完全内存驻留,支持异步持久化到磁盘
-
单线程优势:避免锁竞争,O(1)时间复杂度命令保证高性能
-
数据结构:每种结构有专属命令,如ZSET的ZADD/ZRANGE
-
持久化组合:可单独或同时使用RDB和AOF,建议生产环境同时开启
-
集群方案:从单机→主从→哨兵→集群的渐进式扩展路径
-
典型场景:缓存击穿保护/分布式锁/延迟队列等解决方案
### 1.4、Redis优缺点
Redis 快、强、多功能,但贵、容量有限、查询弱,适合高速缓存 & 特定数据结构,不适合海量存储 & 复杂业务逻辑。
类别 | 优点 | 缺点 |
---|---|---|
性能 | ⚡ 极快(内存操作,微秒级响应) 📊 高吞吐(单线程无锁,6.0+ 多线程 I/O) | 🐌 慢查询会阻塞(如 KEYS * 、大集合操作) |
数据结构 | 🧩 丰富(String、Hash、List、Set、Sorted Set、Stream 等) | 🔍 查询能力弱(无 SQL 复杂查询,只能 Key/结构操作) |
持久化 | 💾 支持 RDB(快照)和 AOF(日志) | ⏳ 持久化影响性能(RDB 快照可能阻塞,AOF 文件大) |
扩展性 | 🏗 集群模式支持横向扩展(Redis Cluster) | 🔗 跨节点操作受限(事务/Lua 要求 Key 同 slot) |
成本 | - | 💰 内存昂贵(不适合海量数据存储) |
一致性 | - | 🔄 缓存与数据库同步难(需额外策略保证一致性) |
适用场景 | ✅ 缓存、会话、排行榜、计数器、消息队列(轻量级) | ❌ 不适合:大数据存储、复杂事务、强关系查询 |
### 1.5、redis的雪崩和穿透
穿透 vs 雪崩对比
对比项 | 缓存穿透 | 缓存雪崩 |
---|---|---|
触发原因 | 查询不存在的数据 | 大量缓存同时失效 |
影响范围 | 特定不存在的数据 | 所有失效缓存对应的数据 |
防御重点 | 非法请求过滤 | 失效时间分散 |
典型症状 | 数据库收到不存在的key查询 | 数据库收到大量正常key查询 |
(1)缓存穿透 (Cache Penetration)
定义
缓存穿透是指查询一个根本不存在的数据,导致请求直接落到数据库上,可能压垮数据库。
典型场景
-
恶意攻击:故意请求不存在的数据(如ID=-1或超大ID)
-
业务误操作:错误地查询不存在的键
解决方案
方案 | 原理 | 优缺点 |
---|---|---|
布隆过滤器 | 预存所有合法key的哈希值,快速判断key是否存在 | 有误判率,需维护过滤器 |
空值缓存 | 对不存在的key也缓存空值(设置较短TTL) | 可能缓存大量无用空值 |
参数校验 | 在API层对请求参数做严格校验 | 简单但无法防恶意攻击 |
(2)缓存雪崩 (Cache Avalanche)
定义
大量缓存同时失效或缓存服务宕机,导致所有请求直接访问数据库,造成数据库压力激增甚至崩溃。
典型场景
-
同一时间大量key过期(如缓存预热时设置相同TTL)
-
Redis集群宕机
-
热点数据突然失效
解决方案
方案 | 原理 | 实现要点 |
---|---|---|
错峰过期 | 给缓存过期时间添加随机值 | TTL = base_time + random_offset |
多级缓存 | 采用本地缓存+Redis的多层结构 | 使用Caffeine/Ehcache作为一级缓存 |
熔断降级 | 数据库压力过大时返回降级内容 | 通过Hystrix/Sentinel实现 |
集群高可用 | 保证Redis服务稳定性 | 哨兵模式/Cluster模式 |