Redis 是后端开发必备、必考、高频商用的核心中间件。很多开发者仅掌握基础的 set/get 操作,对底层原理、数据结构、持久化机制、缓存经典问题等核心知识掌握不扎实。
本文整合Redis 核心原理 + 实操命令 + 业务场景 + 面试考点,内容精炼无废话,适合开发复盘、面试突击、技术博客沉淀,新手也能轻松看懂。
适合人群:Java 后端开发者、Redis 初学者、面试备考、日常开发复盘
运行环境:Redis 6.2+(语法通用,全版本兼容)
一、Redis 是什么?核心优势(面试必问)
Redis(Remote Dictionary Server)是 C 语言开发的开源高性能内存键值数据库,也被称作「数据结构服务器」。
区别于普通缓存,Redis 支持丰富的数据结构,可落地热点缓存、计数器、分布式锁、限流、简易消息队列、会话存储、排行榜等多种业务场景。
Redis 五大核心特点
-
纯内存读写:核心操作基于内存执行,读写性能极强,单机 QPS 可达 10w+
-
单线程模型:核心读写逻辑单线程执行,无线程竞争、无锁开销,规避多线程并发问题
-
数据类型丰富:支持 5 大基础类型 + Geo、Bitmap、Stream 等特殊类型,适配各类业务数据存储
-
命令天然原子:单条 Redis 命令执行过程不可中断,无需手动加锁即可保证并发安全
-
支持数据持久化:提供 RDB、AOF 两种持久化方案,解决内存数据断电丢失问题
二、Redis 五大基础数据类型(详解 + 命令示例 + 业务场景)
1. String 字符串(最常用)
核心特点:Redis 最基础的数据类型,Key-Value 结构,Value 最大支持 512MB,可存储字符串、数字、JSON 等格式数据。
适用场景:热点数据缓存、接口限流、计数器、分布式锁、用户 Session 存储
实操命令
# 新增/修改数据
set username zhangsan
set age 18
# 查询数据
get username
# 设置带过期时间的键(秒级)
set token abc123 ex 300
# 原子递增(计数器、限流核心用法)
incr age
incrby age 10
# 删除键
del username
2. Hash 哈希(对象存储神器)
核心特点:一个 Key 对应多个 Field-Value 键值对,专为结构化对象设计,无需序列化 JSON,支持单独修改单个字段,开销更低。
适用场景:用户信息缓存、购物车数据、商品结构化信息存储
实操命令
# 单个字段赋值
hset user:1001 name lisi
hset user:1001 age 20
# 批量字段赋值
hmset user:1002 name wangwu age 22
# 查询单个字段/全部字段
hget user:1001 name
hgetall user:1001
# 字段数值自增
hincrby user:1001 age 1
# 删除指定字段
hdel user:1001 age
3. List 列表(有序可重复)
核心特点:基于双向链表实现,元素有序、可重复,头尾读写效率极高,支持阻塞式弹出。
适用场景:简易消息队列、用户浏览记录、时间线排序、排队任务列表
实操命令
# 左侧、右侧插入元素
lpush list1 a b c
rpush list1 d e
# 范围查询(0 -1 代表查询全部元素)
lrange list1 0 -1
# 头部、尾部弹出元素
lpop list1
rpop list1
# 阻塞弹出(无数据则等待指定秒数)
brpop list1 10
4. Set 集合(无序去重)
核心特点:元素无序、自动去重,支持交集、并集、差集等集合运算。
适用场景:点赞记录、关注粉丝、数据去重、共同好友统计、活动抽奖
实操命令
# 添加元素(自动去重)
sadd user:like:1001 1002 1003 1002
# 查询集合所有元素
smembers user:like:1001
# 判断元素是否存在
sismember user:like:1001 1002
# 求两个集合交集(统计共同好友)
sinter follow:A follow:B
5. ZSet 有序集合(排序神器)
核心特点:唯一可排序的数据结构,元素自动去重,通过自定义 score 分数实现精准排序。
适用场景:各类排行榜、积分排名、权重排序、简易延时任务
实操命令
# 添加元素(key score value)
zadd rank 90 user1
zadd rank 95 user2
zadd rank 88 user3
# 按分数升序查询
zrange rank 0 -1
# 按分数降序查询(排行榜核心用法,展示分数)
zrevrange rank 0 -1 withscores
三、Redis 过期机制(必懂)
Redis 支持为所有 Key 设置过期时间,到期自动失效删除,是缓存失效、限时业务的核心实现原理。
1、过期时间设置方式
# 秒级过期
set key val ex 60
# 毫秒级过期
set key val px 60000
# 为已存在的键续期/设置过期
expire key 60
2、过期删除策略(面试高频)
-
惰性删除:仅当访问 Key 时校验是否过期,节省 CPU 资源,缺点是过期键会临时占用内存
-
定期删除:后台定时随机抽取部分 Key 清理过期数据,平衡性能与内存占用
Redis 不会全局扫描清理过期键,避免大批量操作阻塞主线程,保证服务高性能运行。
四、Redis 内存淘汰策略(面试必考 8 种)
当 Redis 内存占用达到上限时,会触发内置的内存淘汰策略自动清理数据,释放内存,默认策略为 volatile-lru。
八大淘汰策略速记(面试必背)
-
volatile-lru(默认):从带过期时间的键中,淘汰最近最少使用的数据
-
allkeys-lru:从所有键中,淘汰最近最少使用的数据
-
volatile-lfu:从带过期时间的键中,淘汰使用频率最低的数据
-
allkeys-lfu:从所有键中,淘汰使用频率最低的数据
-
volatile-random:从带过期时间的键中,随机淘汰数据
-
allkeys-random:从所有键中,随机淘汰数据
-
volatile-ttl:从带过期时间的键中,优先淘汰即将过期的数据
-
noeviction:不淘汰任何数据,内存满后直接报错(极少使用)
五、Redis 两大持久化机制(RDB + AOF)
Redis 数据存储在内存中,断电、重启会导致数据丢失,持久化机制的核心作用就是将内存数据落地到磁盘,保证数据持久不丢失。
1. RDB(快照)
周期性生成内存数据全量快照,保存为\.rdb 文件,重启服务可通过快照恢复数据。
优点:文件体积小、重启恢复速度快、对服务性能影响小
缺点:两次快照间隔内的增量数据会丢失,数据一致性一般
2. AOF(日志追加)
持续记录所有写操作命令,追加到 \.aof 日志文件,服务重启后重放日志命令即可恢复全部数据。
优点:数据安全性极高,最多丢失 1 秒增量数据
缺点:日志文件体积大,服务重启数据恢复速度慢
生产最佳方案
生产最优方案:RDB + AOF 双持久化开启,兼顾数据安全性与恢复效率。
六、Redis 三大缓存问题(击穿、穿透、雪崩)
缓存穿透、缓存击穿、缓存雪崩是后端开发、面试核心重难点,三者场景、解决方案完全不同,精准区分如下:
1. 缓存穿透
场景:客户端查询数据库不存在的数据,缓存无对应数据,所有请求直接穿透到数据库,压垮库压力。
解决方案:接口参数校验、缓存空值/过期短时间、布隆过滤器过滤无效 Key
2. 缓存击穿
场景:某热点 Key 缓存过期瞬间,海量并发请求直接打到数据库,瞬间击穿缓存。
解决方案:热点 Key 永不过期、加本地/分布式互斥锁、后台定时主动续期
3. 缓存雪崩
场景:大批量 Key 同时过期,或 Redis 集群宕机,缓存整体失效,海量流量全部压入数据库。
解决****方案:过期时间加随机值打散失效时间、搭建 Redis 高可用集群、接口熔断降级、多级缓存架构
七、Redis 分布式锁(生产必备)
分布式集群场景下,单机锁失效,Redis 分布式锁是解决分布式并发竞争的主流方案。
生产级原子加锁命令(核心)
# NX:不存在才创建(加锁成功) EX:秒级自动过期
set lock:order 1 nx ex 30
NX:保证加锁互斥性,仅无锁时可加锁成功
EX:设置自动过期时间,避免服务宕机导致死锁
避坑重点:禁止使用 setnx + expire 分两条命令加锁,非原子操作会引发死锁问题!
八、总结(学习&面试速记)
1、Redis 高性能核心:内存读写 + 单线程无锁竞争 + IO 多路复用
2、五大数据类型分工:String 通用缓存、Hash 存对象、List 做队列、Set 去重统计、ZSet 实现排序
3、数据安全保障:RDB+AOF 双持久化机制,兼顾性能与数据安全
4、缓存核心问题:吃透穿透、击穿、雪崩三大场景的问题根源与解决方案
5、分布式锁规范:必须使用 SET NX EX 原子命令 实现,杜绝死锁风险
个人随笔
本文全覆盖 Redis 基础、实操、原理、面试考点,内容精炼实用,适配日常开发查阅和面试突击。坚持沉淀技术博客,积累专属技术资产,助力技术进阶!
如有知识点疏漏或错误,欢迎大家评论指正交流!