【Redis 】数据类型、持久化与过期删除

Redis 基础:数据类型、持久化与过期删除

一句话:Redis 是用内存当主存储、单线程处理命令的键值数据库。它存在的意义,就是把「慢」的磁盘 IO 挡在前面------让高并发的读请求先打到内存,保护后面的 MySQL。


一、Redis 是什么?为了解决什么问题?

是什么 :Redis(Remote Dictionary Server)是一个开源、基于内存键值对(Key-Value)支持持久化的 NoSQL 数据库。它既能当缓存,也能当数据库、消息队列、计数器用。

为什么快(面试常问):

  1. 数据在内存:读写不走磁盘,纳秒级访问。
  2. 单线程模型:核心命令执行是单线程的,避免了锁竞争和上下文切换(注意:Redis 6.0 后网络 IO 多线程了,但命令执行仍单线程)。
  3. IO 多路复用:用 epoll 这类机制,一个线程就能扛住海量连接。
  4. 高效数据结构: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 不是「到点就删」,而是两种策略结合:

  1. 惰性删除:访问 key 时才检查是否过期,过期就删。优点省 CPU,缺点是没人访问就一直占内存。
  2. 定期删除:每隔一段时间,随机抽一批 key 检查,删掉过期的。

因为以上两种都不彻底,所以当内存满了,还有内存淘汰策略maxmemory-policy):

  • noeviction:不淘汰,写满报错(默认)。
  • allkeys-lru:所有 key 里淘汰最久没用的。
  • allkeys-lfu:淘汰最少用的(Redis 4.0+)。
  • volatile-lru:只淘汰设了过期时间的 key 里最久没用的。

总结

Redis 基础 = 五个数据类型 + 两种持久化 + 过期删除与内存淘汰。这篇解决的是「原理层」,把底层认知打牢;下一篇《Redis 缓存实战》再讲它作为缓存层时最经典的穿透 / 击穿 / 雪崩问题,以及 Java 后端怎么用。

相关推荐
空杆推不起1 小时前
穿透 Flink CDC 表层用法:数据库日志捕获机制、Flink Source 运行时、端到端一致性底层原理详解
大数据·数据库·flink
朱容zr3331332 小时前
请解释“回表”的概念。
java·前端·数据库
☆凡尘清心☆2 小时前
CentOS Stream 9 编译安装 Redis 7.2.7 完整版详细步骤
linux·redis·centos
大黄说说2 小时前
EF Core 避坑指南:查询慢、循环查询、并发更新问题如何解决
java·服务器·数据库
城管不管2 小时前
重生——第五次面试2026.8.1一面
java·数据库·后端·ai·面试·职场和发展·agent
ocean'2 小时前
防火墙策略路由
linux·服务器·数据库
晚安code2 小时前
RocketMQ 延迟消息实战:延迟双删策略解决 Redis 缓存一致性
redis·rocketmq
纪念 2292 小时前
数据库基础
数据库·笔记·学习方法
songgz2 小时前
zVM统一OS与DB
jvm·数据库·vm