Redis 基础:数据类型、持久化与过期删除
一句话:Redis 是用内存当主存储、单线程处理命令的键值数据库。它存在的意义,就是把「慢」的磁盘 IO 挡在前面------让高并发的读请求先打到内存,保护后面的 MySQL。
一、Redis 是什么?为了解决什么问题?
是什么 :Redis(Remote Dictionary Server)是一个开源、基于内存 、键值对(Key-Value) 、支持持久化的 NoSQL 数据库。它既能当缓存,也能当数据库、消息队列、计数器用。
为什么快(面试常问):
- 数据在内存:读写不走磁盘,纳秒级访问。
- 单线程模型:核心命令执行是单线程的,避免了锁竞争和上下文切换(注意:Redis 6.0 后网络 IO 多线程了,但命令执行仍单线程)。
- IO 多路复用:用 epoll 这类机制,一个线程就能扛住海量连接。
- 高效数据结构:String / Hash / List / Set / ZSet 底层都有精心优化的实现(如跳表、压缩列表等)。
解决什么问题 :传统 MySQL 再强,瓶颈也在磁盘 IO。当读多写少、并发又高时,直接打 DB 会扛不住。Redis 把热点数据放内存,请求先查 Redis:
- 命中 → 直接返回,DB 无压力;
- 未命中 → 查 DB 再写回 Redis。
这也是它最常见的身份:缓存层。
二、五大核心数据类型
面试重点不是背命令,而是每个类型适合什么场景。
1. String(字符串)
最常用,能存字符串、整数、二进制(图片 base64 也行)。
bash
SET name "muggle" # 存
GET name # 取
INCR view:count # 原子自增,适合计数
SET lock:order "1" NX EX 10 # 不存在才设置+10秒过期(分布式锁雏形)
场景:缓存 JSON、计数器、分布式锁、限流。
2. Hash(哈希)
字段-值 的集合,适合存对象。
bash
HSET user:1 name "muggle" age 20
HGET user:1 name
场景:用户信息、商品详情等「一个对象多个字段」的数据。比把整个对象序列化成 String 存更省内存、改字段更方便。
3. List(列表)
双向链表,有序可重复。
bash
LPUSH queue "a" # 左插
RPUSH queue "b" # 右插
LRANGE queue 0 -1 # 取全部
场景:最新消息列表、简单消息队列(LPUSH + RPOP)。
4. Set(集合)
无序、唯一。
bash
SADD like:post:1 uid1 uid2
SINTER like:a like:b # 交集 → 共同好友/共同关注
场景:点赞、去重、共同好友、随机抽奖(SRANDMEMBER)。
5. ZSet(有序集合)⭐ 面试高频
每个成员带一个 score,按 score 排序,唯一。
bash
ZADD rank 100 muggle 90 tom
ZREVRANGE rank 0 9 WITHSCORES # 排行榜前10
场景 :排行榜、延迟队列(score 用执行时间戳)、带权重的优先级队列。
快速选型表:
| 类型 | 特点 | 典型场景 |
|---|---|---|
| String | 单值,可整数自增 | 缓存、计数、分布式锁 |
| Hash | 对象多字段 | 用户信息 |
| List | 有序可重复,两端操作 | 消息队列、时间线 |
| Set | 无序唯一 | 点赞、去重、交集 |
| ZSet | 按分数有序唯一 | 排行榜、延迟队列 |
三、持久化:内存数据怎么不丢?
Redis 数据在内存,重启就丢------所以需要持久化。两种机制:
RDB(快照)
每隔一段时间,把某一时刻 的内存数据全量 dump 成一个 .rdb 文件。
- ✅ 文件小、恢复快,适合做备份/灾难恢复。
- ❌ 会丢「最后一次快照之后」到宕机之间的数据。
- 触发:手动
SAVE/BGSAVE,或配置save 900 1(900秒内1次修改)。
AOF(追加日志)
把每一条写命令追加到日志文件,重启时重放命令恢复。
- ✅ 数据更安全,可配
appendfsync everysec(每秒刷盘,最多丢1秒)。 - ❌ 文件大、恢复慢。
- 有 rewrite(重写) 机制:定期把冗余命令压缩成最小命令集。
生产怎么选
Redis 4.0+ 支持混合持久化(RDB 做全量 + AOF 做增量),鱼和熊掌兼得,是主流配置。
| RDB | AOF | |
|---|---|---|
| 数据安全性 | 较低(丢一段时间) | 较高(秒级) |
| 文件大小 | 小 | 大 |
| 恢复速度 | 快 | 慢 |
| 用途 | 备份、容灾 | 日常持久化 |
四、键的过期与删除(别以为设了过期就立刻删)
Redis 不是「到点就删」,而是两种策略结合:
- 惰性删除:访问 key 时才检查是否过期,过期就删。优点省 CPU,缺点是没人访问就一直占内存。
- 定期删除:每隔一段时间,随机抽一批 key 检查,删掉过期的。
因为以上两种都不彻底,所以当内存满了,还有内存淘汰策略 (maxmemory-policy):
noeviction:不淘汰,写满报错(默认)。allkeys-lru:所有 key 里淘汰最久没用的。allkeys-lfu:淘汰最少用的(Redis 4.0+)。volatile-lru:只淘汰设了过期时间的 key 里最久没用的。
总结
Redis 基础 = 五个数据类型 + 两种持久化 + 过期删除与内存淘汰。这篇解决的是「原理层」,把底层认知打牢;下一篇《Redis 缓存实战》再讲它作为缓存层时最经典的穿透 / 击穿 / 雪崩问题,以及 Java 后端怎么用。