前言

在现代互联网系统中,无论是电商秒杀、社交平台、在线教育还是金融系统,几乎都离不开 Redis。

很多开发者认为 Redis 只是一个 Key-Value 缓存工具,但实际上 Redis 已经发展成为:

  • 高性能缓存数据库
  • 分布式锁实现方案
  • 消息队列中间件
  • 排行榜系统
  • 实时统计系统
  • 地理位置服务
  • 流处理平台

甚至在很多互联网公司中:

MySQL负责存储数据
Redis负责承载流量

因此,掌握 Redis 已经成为 Java 后端工程师、架构师必备技能之一。

本文将从 Redis 的底层原理、数据结构、缓存设计、高并发场景、分布式锁、持久化、集群架构等多个角度进行全面剖析。


一、Redis简介

1.1 什么是Redis

Redis(Remote Dictionary Server)是一个:

基于内存的高性能 Key-Value 数据库

其特点:

  • 开源
  • 支持持久化
  • 支持事务
  • 支持发布订阅
  • 支持Lua脚本
  • 支持集群部署

官网:

https://redis.io

1.2 Redis为什么快

很多面试官喜欢问:

Redis为什么快?

原因主要有以下几点:

1、基于内存操作

MySQL:

select * from user where id=1

需要:

磁盘 -> 内存 -> CPU

Redis:

内存 -> CPU

速度差距:

磁盘:
10ms左右

内存:
100ns左右

差距超过:

100000倍

2、单线程模型

Redis核心命令执行:

单线程

很多人认为:

单线程一定慢

其实这是误区。

Redis瓶颈:

网络IO
内存读写

不是CPU计算。

单线程避免:

锁竞争
线程切换
上下文切换

反而效率更高。


3、IO多路复用

Redis采用:

epoll
select
kqueue

实现:

一个线程管理多个连接

流程:

客户端A
客户端B
客户端C

     ↓

  epoll监听

     ↓

 Redis主线程

因此可支撑:

10W+
并发连接

二、Redis数据类型详解

Redis面试最常考内容之一。


2.1 String

最常用类型。

存储结构

key -> value

例如:

set name zhangsan

获取:

get name

结果:

zhangsan

应用场景

缓存用户信息
set user:1001 '{"id":1001,"name":"Tom"}'

计数器
incr article:view:1

统计:

阅读量
点赞量
收藏量

2.2 Hash

类似Java中的Map。

存储结构

key

field -> value

例如:

hset user:1 name Tom
hset user:1 age 18

查询:

hget user:1 name

优势

相比String:

节省内存
方便更新部分字段

2.3 List

双向链表结构。

添加数据

lpush list 1
lpush list 2
lpush list 3

结果:

3 2 1

应用场景

消息队列

生产者:

lpush queue order

消费者:

rpop queue

2.4 Set

无序且唯一。

sadd user 1
sadd user 2
sadd user 3

重复元素:

sadd user 3

不会存储。


应用场景

用户标签
sadd vip_users 1001
sadd vip_users 1002

共同好友
sinter friendA friendB

2.5 Sorted Set(ZSet)

Redis最经典的数据结构。

内部:

Hash
+
SkipList(跳表)

添加:

zadd rank 100 Tom
zadd rank 90 Jack
zadd rank 95 Rose

查询排行榜:

zrevrange rank 0 9

应用场景

游戏排行榜
玩家       分数

Tom       100
Rose      95
Jack      90

热搜榜
微博热搜
抖音热榜
知乎热榜

三、Redis底层数据结构

很多人只知道:

String
Hash
List

但面试官问:

String底层是什么?

很多人就不会了。


3.1 SDS

Redis字符串:

Simple Dynamic String

不是C语言字符串。


C语言字符串

char *str="hello";

问题:

获取长度O(n)
容易缓冲区溢出

SDS

结构:

struct sdshdr{
    int len;
    int free;
    char buf[];
}

优势:

获取长度O(1)
自动扩容
防止越界

四、Redis持久化机制

Redis默认存储:

内存

服务器重启:

数据丢失

因此需要持久化。


4.1 RDB

快照机制。

执行:

bgsave

生成:

dump.rdb

优点

恢复速度快
文件体积小
适合备份

缺点

可能丢失:

最后一次快照之后的数据

4.2 AOF

Append Only File。

记录:

写命令日志

例如:

set name Tom
set age 18

写入:

appendonly.aof

优点

数据安全

最多丢失:

1秒

缺点

文件较大
恢复较慢

4.3 如何选择

生产环境推荐:

RDB + AOF

组合方案。


五、Redis缓存设计


5.1 缓存穿透

什么是缓存穿透

请求:

查询id=999999

Redis不存在。

MySQL也不存在。

每次都访问数据库。


攻击场景

黑客:

1亿次不存在请求

数据库直接崩溃。


解决方案

方案1:缓存空对象
set user:999999 null

设置:

expire 300

方案2:布隆过滤器

流程:

请求

 ↓

BloomFilter

 ↓

Redis

 ↓

MySQL

不存在直接拦截。


六、缓存击穿


6.1 什么是击穿

热点Key:

商品详情

突然过期。

瞬间:

10000请求

全部打到数据库。


解决方案

互斥锁

synchronized

或者:

setnx lock

流程:

线程1查询数据库

线程2等待

线程3等待

七、缓存雪崩


7.1 什么是雪崩

大量缓存:

同时过期

例如:

100万Key
00:00统一失效

数据库瞬间崩溃。


解决方案

随机过期时间

错误:

3600

正确:

3600 + Random(300)

例如:

3698
3812
3921

避免同时失效。


八、Redis分布式锁


8.1 为什么需要分布式锁

单机:

synchronized

有效。

分布式:

服务A
服务B
服务C

无效。


8.2 Redis实现

加锁:

set lock_key uuid nx ex 30

解释:

NX:
不存在才创建

EX:
过期时间

Java代码:

Boolean success =
redisTemplate.opsForValue()
.setIfAbsent(
    "lock",
    uuid,
    30,
    TimeUnit.SECONDS
);

8.3 解锁问题

错误写法:

del lock

可能删除别人的锁。


正确写法:

Lua脚本。

if redis.call("get",KEYS[1])==ARGV[1]
then
    return redis.call("del",KEYS[1])
else
    return 0
end

保证原子性。


九、Redis事务

Redis事务:

MULTI
EXEC
WATCH

开始事务:

multi

执行命令:

set name Tom
set age 18

提交:

exec

注意:

Redis事务:

不支持回滚

这是面试高频题。


十、Redis主从复制


架构

Master

 ↓ ↓ ↓

Slave
Slave
Slave

作用:

读写分离
高可用
数据备份

配置:

replicaof 192.168.1.10 6379

十一、Redis Sentinel哨兵模式

问题:

Master挂了怎么办?

引入:

Sentinel

架构:

 Sentinel
 Sentinel
 Sentinel

      ↓

    Master

   ↓     ↓

Slave  Slave

功能:

监控

监控主节点。


自动故障转移

Master挂了:

Slave升级Master

自动切换。


十二、Redis Cluster集群


为什么需要集群

单机限制:

CPU
内存
网络

Redis单节点:

几十GB

已经到极限。


Cluster方案

Redis:

16384

个槽位。


计算:

CRC16(key)%16384

例如:

user:1

计算:

slot=1000

存储到对应节点。


架构:

Node1
0~5000

Node2
5001~10000

Node3
10001~16383

十三、Redis面试高频问题


Redis为什么这么快?

回答:

1、纯内存操作
2、单线程模型
3、IO多路复用
4、高效数据结构

Redis和MySQL如何保证一致性?

方案:

先更新数据库

再删除缓存

即:

Cache Aside Pattern

流程:

update mysql

delete redis

延迟双删

update mysql

delete redis

sleep(500ms)

delete redis

解决并发问题。


十四、企业级Redis最佳实践

Key命名规范

推荐:

user:1001
order:20250501
product:1

避免:

abc
test
aaa

设置过期时间

避免永久缓存。

expire key 3600

大Key治理

避免:

1个Key
500MB

拆分:

user:1:page1
user:1:page2

热Key治理

热点数据:

明星直播
秒杀商品
热搜榜

采用:

本地缓存
Redis集群
多级缓存

十五、Redis在真实项目中的应用

在线教育平台

缓存:

课程详情
教师信息
章节目录

电商系统

缓存:

商品信息
库存信息
购物车

社交系统

缓存:

用户关系
粉丝列表
点赞记录

游戏系统

缓存:

排行榜
玩家在线状态
战绩统计

总结

Redis 已经不仅仅是一个缓存数据库,而是现代互联网系统中不可或缺的基础设施。

本文从:

  • Redis核心原理
  • 五大数据结构
  • SDS底层实现
  • 持久化机制
  • 缓存穿透
  • 缓存击穿
  • 缓存雪崩
  • 分布式锁
  • 主从复制
  • 哨兵模式
  • Redis Cluster
  • 企业级最佳实践

进行了全面分析。

对于 Java 后端开发岗位而言,Redis 已经成为面试必问技术栈。

如果你准备冲击:

✅ Java中级工程师
✅ Java高级工程师
✅ 架构师岗位

那么 Redis 的底层原理、缓存架构设计、高并发解决方案一定要深入掌握。


如果觉得本文对你有帮助,欢迎点赞、收藏、关注,后续将持续更新《Redis源码解析》《Redis面试宝典》《Redis高并发实战案例》等系列文章。 🚀

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐