关注

Java 实习生必须掌握的 Redis 核心知识点(工程向)

Java 实习生必须掌握的 Redis 核心知识点(工程向)

Redis 是 Java 后端面试中出现频率最高的中间件之一
对实习生而言,面试官并不期待你会调优或源码级理解,
必须清楚 Redis 是什么、能干什么、怎么用、会踩什么坑

本文从 工程实用角度,总结 Java 实习生需要掌握的 Redis 核心知识。


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

Redis 本质是一个:

基于内存的 Key–Value 数据结构服务器

它主要解决三类问题:

  1. 性能问题:数据库太慢
  2. 并发问题:共享状态、计数
  3. 解耦问题:缓存、简单通信

在真实系统中,Redis 常见位置是:

Java Service  →  Redis  →  MySQL

二、Java 与 Redis 如何通信?(高频面试点)

结论先给出:

Java 和 Redis 之间,既不是 HTTP,也不是 RPC,而是 RESP 协议

  • RESP(Redis Serialization Protocol)
  • 基于 TCP 长连接
  • 极简、低延迟

在 Java 中你感知不到 RESP

因为你通常使用的是:

  • Jedis
  • Lettuce
  • Redisson
  • Spring Data Redis

例如:

redisTemplate.opsForValue().set("key", "value");

底层流程是:

Java Client → RESP 命令 → Redis → RESP 返回

三、Redis 五大核心数据类型(重点)

1️⃣ String(最常用)

本质:key → 一个二进制值

SET k v
GET k
INCR counter

典型场景

  • 缓存 JSON
  • 分布式计数器
  • 分布式锁(SET NX EX)

2️⃣ Hash(对象型数据)

HSET user:1 name Tom age 18
HGET user:1 name

适合

  • 用户信息
  • 配置对象

👉 比 String + JSON 更灵活


3️⃣ List(有序、可重复)

LPUSH queue task
RPOP queue

典型场景

  • 简单消息队列
  • 任务队列

4️⃣ Set(无序、唯一)

SADD tags java redis
SMEMBERS tags

典型场景

  • 去重
  • 标签系统
  • 共同好友

5️⃣ ZSet(有序集合,面试常问)

ZADD rank 100 user1
ZREVRANGE rank 0 9 WITHSCORES

典型场景

  • 排行榜
  • 延时队列

四、Redis 的数据模型抽象(加分项)

从逻辑层看,Redis 可以抽象为:

String:
map<string, bytes>

Hash:
map<string, map<string, bytes>>

List:
map<string, list<bytes>>

Set:
map<string, set<bytes>>

ZSet:
map<string, map<string, double>> + score ordered index

这是逻辑模型,不是底层实现
底层会根据数据规模使用不同编码优化


五、Redis 常见使用场景(必须会讲)

1️⃣ 缓存

  • 读多写少
  • 减轻数据库压力

2️⃣ 分布式锁(知道即可)

SET lock_key value NX EX 10

核心点:

  • 原子性
  • 超时释放

3️⃣ 计数 / 限流

INCR request_count

4️⃣ 简单消息队列

  • List(简单)
  • Stream(推荐)

六、Redis 和 HTTP / RPC 的关系(容易混)

  • Redis 不是 HTTP 服务
  • 也不是 RPC 服务
  • 它是 数据结构服务器

👉 Java 服务之间:

  • 用 HTTP / RPC 调用
  • 用 Redis 共享数据或解耦

七、Java 实习生常见 Redis 面试坑

❌ 把 Redis 当数据库

  • Redis 是缓存 / 中间件
  • 不是强一致存储

❌ 忽略缓存失效

  • TTL 没设
  • 缓存穿透 / 雪崩

❌ 用 Redis 当 MQ

  • List 没 ack
  • 消息丢失风险

八、你至少要会的 Java API(Spring)

// String
redisTemplate.opsForValue().set("k", "v");

// Hash
redisTemplate.opsForHash().put("user:1", "name", "Tom");

// List
redisTemplate.opsForList().leftPush("queue", "task");

// Set
redisTemplate.opsForSet().add("tags", "java");

// ZSet
redisTemplate.opsForZSet().add("rank", "u1", 100);

九、Redis 如何删除过期 key?

这个问题非常核心,而且是 Redis 面试的分水岭题
我不直接甩结论,而是用**「从表象 → 机制 → 底层实现」**一步一步给你拆清楚,你会发现 Redis 的设计其实非常“工程化”。


1、先给一句「标准结论」(你可以直接背)

Redis 的 key 过期是通过
过期字典(expiration dictionary)+ 惰性删除 + 定期删除
共同实现的,
并不是为每个 key 单独维护一个定时器。


这是核心答案,下面我帮你把每个词拆明白。


2、Redis 是怎么“记录” key 的过期时间的?

关键点 1:过期时间不是存在 value 里的

Redis 内部维护了 两张表

db.dict      : key -> value
db.expires   : key -> expireTimestamp (毫秒)

👉 只有设置了过期时间的 key,才会出现在 expires 表中

例如:

SET a 123
EXPIRE a 10

内部变成:

dict:     a -> 123
expires:  a -> 1690000000000

3、Redis 如何删除过期 key?(重点)

很多人会误以为:

❌ “Redis 给每个 key 都设置了一个定时器”

这是完全错误的,原因是:

  • key 数量可能是百万 / 千万级
  • 定时器会把 CPU 打爆

4、Redis 实际采用的是:两种策略配合


策略一:惰性删除(Lazy Deletion)

是什么?

不主动删
等你来访问 key 的时候,顺便检查

流程是:

客户端 GET key
   ↓
检查 key 是否设置了过期时间
   ↓
如果过期了:
    删除 key
    返回 nil

优点

  • 几乎不耗 CPU
  • 简单

缺点

  • 如果 key 一直不被访问,就永远不会删

👉 所以 惰性删除不够


策略二:定期删除(Active Expiration)

是什么?

Redis 会定期随机抽样一部分过期 key 来清理

执行频率

  • 默认 每秒 10 次hz = 10

每次做什么?

  1. expires 表中 随机抽取一批 key
  2. 检查是否过期
  3. 如果过期就删除
  4. 如果过期比例过高 → 继续抽

👉 这是一个 自适应算法

伪代码理解:

do {
  sample N keys from expires
  delete expired keys
} while (expired_ratio > threshold && time_not_exceeded)

⚠️ 重点:不是全量扫描!

  • 随机抽样
  • 时间受限
  • 不阻塞主线程太久

5、为什么 Redis 不用“定时器”?

这是一个非常好的反问点

原因只有一个:

规模问题

  • 百万 key = 百万定时器
  • 定时器调度本身就是 O(logN)
  • Redis 是单线程,顶不住

👉 所以 Redis 选择了:

概率正确 + 性能可控


6、过期 key 一定会“立刻”删除吗?

❌ 不一定

可能存在三种状态:

  1. 逻辑过期

    • 已经过期时间
    • 但还在内存里
  2. 访问触发删除

    • GET 时删
  3. 定期扫描删除

    • 后台清理

👉 对用户来说是 “看起来已经过期”


7、过期 key 和内存淘汰策略的关系(进阶)

⚠️ 这是很多人漏掉的点

  • 过期 ≠ 淘汰
  • 过期是:时间到了必须删
  • 淘汰是:内存不够被迫删

淘汰策略例如:

  • LRU
  • LFU
  • allkeys / volatile

👉 如果内存满了:

  • 即使 key 没过期
  • 也可能被淘汰

8、结合 Java 实习生的“工程理解版”

你可以这样理解:

Redis 不追求过期时间的绝对精确,
而是通过惰性删除保证访问正确性,
通过定期删除控制内存占用,
在单线程模型下取得性能和一致性的平衡。


9、面试官追问时,你可以这样接(高级)

Q:那 Redis 会不会内存泄漏?

👉 回答:

不会。
即使 key 一直不被访问,
定期删除机制也会逐步清理过期 key,
同时在内存压力下,
淘汰策略也会兜底。


面试一句话总结(直接背)

Redis 是基于内存的 Key–Value 数据结构服务器,
Java 应用通过 TCP 上的 RESP 协议与 Redis 通信。
Redis 提供多种数据结构以支持高性能缓存、计数、
排行榜和简单消息队列等场景,
在系统中主要用于提升性能和解耦。


给 Java 实习生的学习建议(真心话)

如果你是 Java 实习生:

  • 第一阶段:会用(String / Hash / List)
  • 第二阶段:理解场景(缓存 / 锁 / 计数)
  • 第三阶段:知道坑(雪崩 / 穿透)

👉 不需要一上来啃源码
👉 但一定要理解“为什么这么设计”

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/m0_58809631/article/details/157362248

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--