Java 后端 Redis 核心知识点与工程实践
Redis 是 Java 后端面试中出现频率最高的中间件之一。
对实习生而言,面试官并不期待你会调优或源码级理解, 但必须清楚 Redis 是什么、能干什么、怎么用、会踩什么坑。
本文从 工程实用角度,总结 Redis 核心知识。
一、Redis 是什么?解决什么问题?
Redis 本质是一个:
介绍 Java 后端 Redis 核心知识。涵盖 Redis 定义、RESP 通信协议、五大数据类型及应用场景。重点解析过期键删除机制(惰性删除 + 定期删除),区分淘汰策略。指出常见面试误区,如将 Redis 当数据库或 MQ。提供 Spring Data Redis API 示例及学习路径建议。
Redis 是 Java 后端面试中出现频率最高的中间件之一。
对实习生而言,面试官并不期待你会调优或源码级理解, 但必须清楚 Redis 是什么、能干什么、怎么用、会踩什么坑。
本文从 工程实用角度,总结 Redis 核心知识。
Redis 本质是一个:
基于内存的 Key–Value 数据结构服务器
它主要解决三类问题:
在真实系统中,Redis 常见位置是:
Java Service → Redis → MySQL
Java 和 Redis 之间,既不是 HTTP,也不是 RPC,而是 RESP 协议
因为你通常使用的是:
例如:
redisTemplate.opsForValue().set("key","value");
底层流程是:
Java Client → RESP 命令 → Redis → RESP 返回
本质:key → 一个二进制值
SET k v GET k INCR counter
典型场景:
HSET user:1 name Tom age 18 HGET user:1 name
适合:
比 String + JSON 更灵活
LPUSH queue task RPOP queue
典型场景:
SADD tags java redis SMEMBERS tags
典型场景:
ZADD rank 100 user1 ZREVRANGE rank 09 WITHSCORES
典型场景:
从逻辑层看,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
这是逻辑模型,不是底层实现 底层会根据数据规模使用不同编码优化
SET lock_key value NX EX 10
核心点:
INCR request_count
👉 Java 服务之间:
// 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 面试的分水岭题。
本文从表象、机制到底层实现,逐步解析 Redis 设计。
Redis 的 key 过期是通过 过期字典(expiration dictionary)+ 惰性删除 + 定期删除 共同实现的, 并不是为每个 key 单独维护一个定时器。
以下是对各概念的详细解析。
Redis 内部维护了 两张表:
db.dict : key -> value
db.expires : key -> expireTimestamp (毫秒)
👉 只有设置了过期时间的 key,才会出现在 expires 表中
例如:
SET a 123 EXPIRE a 10
内部变成:
dict: a -> 123
expires: a -> 1690000000000
很多人会误以为:
❌ 'Redis 给每个 key 都设置了一个定时器'
这是完全错误的,原因是:
不主动删 等你来访问 key 的时候,顺便检查
客户端 GET key
↓ 检查 key 是否设置了过期时间
↓ 如果过期了:
删除 key
返回 nil
👉 所以 惰性删除不够
Redis 会定期随机抽样一部分过期 key 来清理
hz = 10)expires 表中 随机抽取一批 key👉 这是一个 自适应算法
do {
sample N keys from expires
delete expired keys
} while (expired_ratio > threshold && time_not_exceeded)
这是一个关键的反问点。
规模问题
👉 所以 Redis 选择了:
概率正确 + 性能可控
可能存在三种状态:
👉 对用户来说是 '看起来已经过期'
👉 如果内存满了:
可理解为:
Redis 不追求过期时间的绝对精确, 而是通过惰性删除保证访问正确性, 通过定期删除控制内存占用, 在单线程模型下取得性能和一致性的平衡。
👉 回答:
不会。 即使 key 一直不被访问, 定期删除机制也会逐步清理过期 key, 同时在内存压力下, 淘汰策略也会兜底。
Redis 是基于内存的 Key–Value 数据结构服务器, Java 应用通过 TCP 上的 RESP 协议与 Redis 通信。 Redis 提供多种数据结构以支持高性能缓存、计数、 排行榜和简单消息队列等场景, 在系统中主要用于提升性能和解耦。
如果你是 Java 实习生:
👉 不需要一上来啃源码 👉 但一定要理解'为什么这么设计'

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online