Java技术八股学习Day33

Redis(一)

Redis 基础核心

(1)定义与核心特性

Redis 是基于 C 语言开发的开源内存 NoSQL 数据库,以 KV 键值对存储数据,支持持久化,读写速度极快。核心特性包括:支持多种数据类型、事务、Lua 脚本、发布订阅、集群方案(Sentinel/Cluster),无外部依赖,推荐 Linux 生产环境部署。

(2)高性能原因
  • 纯内存操作:数据读写均在内存中,访问速度为纳秒级,远超磁盘 IO;
  • 高效 I/O 模型:单线程事件循环 + I/O 多路复用,避免线程切换和锁竞争;
  • 优化的数据结构:内置多种数据类型,底层动态选择最优编码(如 ziplist、skiplist);
  • 简洁通信协议:RESP 协议解析高效,序列化 / 反序列化开销小。
(3)与 Memcached 对比
对比维度 Redis Memcached
数据类型 支持 String/List/Hash/Set/Zset 等丰富类型 仅支持简单 KV 类型
持久化 支持 RDB/AOF/ 混合持久化 不支持,数据仅存内存
集群支持 3.0+ 原生支持集群 无原生集群,依赖客户端分片
线程模型 单线程(6.0+ 网络 IO 多线程) 多线程非阻塞 IO 模型
特性支持 支持事务、Lua 脚本、发布订阅 不支持
过期删除 定期删除 + 惰性删除 仅惰性删除
(4)与本地缓存对比

Redis 优势在于数据一致性强、内存空间更大、支持持久化、集中管理、功能丰富;本地缓存受单服务器内存限制,多服务器部署易数据不一致,仅适用于简单场景。

Redis 核心应用场景

  • 分布式缓存:存储高频访问数据(如用户信息、商品详情),减轻数据库压力;
  • 分布式锁:基于 Redisson 实现,保障分布式环境下数据一致性;
  • 限流:Redis+Lua 脚本或 Redisson 的 RRateLimiter,基于令牌桶算法实现;
  • 消息队列:List(简易队列)、Stream(5.0+,支持消费组、ACK、持久化);
  • 延时队列:Redisson 内置延时队列(基于 Sorted Set),避免 Redis 过期事件监听的缺陷;
  • 分布式 Session:String/Hash 存储 Session 数据,支持多服务器共享;
  • 复杂场景:Bitmap 统计活跃用户、Sorted Set 实现排行榜、HyperLogLog 统计 UV。

Redis 数据类型及应用

(1)基础数据类型
  • String:二进制安全,存储字符串、整数、序列化对象,应用于缓存、计数、分布式锁(SETNX);
  • Hash:存储对象字段,适合频繁修改对象部分字段(如购物车),节省网络流量;
  • List:有序可重复,支持首尾操作,应用于简易消息队列、最新消息列表;
  • Set:无序不可重复,支持交集 / 并集 / 差集,应用于去重、共同好友、抽奖系统;
  • Zset(有序集合):按分数排序,应用于排行榜、带权重的消息队列。
(2)特殊数据类型
  • Bitmap:二进制位存储,节省空间,用于活跃用户统计、签到功能;
  • HyperLogLog:基数统计,占用空间小,用于 UV 统计(允许少量误差);
  • Geospatial:地理位置存储,支持距离计算、附近的人功能。
(3)关键选型建议
  • 对象存储:简单对象用 String,需频繁修改部分字段用 Hash;
  • 购物车:用 Hash(用户 ID 为 key,商品 ID 为 field,数量为 value);
  • 排行榜:优先 Zset(支持排序和排名查询);
  • UV 统计:数据量大用 HyperLogLog,精准统计用 Set。

Redis 核心机制

(1)线程模型
  • 核心逻辑单线程:Redis 6.0 前所有命令执行单线程;6.0 后网络 IO 引入多线程,命令执行仍单线程,避免线程安全问题;
  • 后台线程:处理大键删除、AOF 刷盘、临时文件关闭等耗时操作,不阻塞主线程。
(2)持久化机制

支持 RDB(快照持久化,适合备份)、AOF(日志持久化,数据丢失少)、混合持久化(结合两者优势),核心解决内存数据断电丢失问题。

(3)过期键处理
  • 过期存储:通过过期字典记录键的过期时间(UNIX 时间戳);
  • 删除策略:定期删除(随机抽查过期键)+ 惰性删除(查询时检查过期),平衡 CPU 和内存开销;
  • 集中过期应对:避免键集中过期,开启 lazy free 机制异步删除,降低主线程阻塞风险。
(4)内存淘汰策略

当内存达到 maxmemory 阈值时触发,核心策略包括:

  • volatile-lru:淘汰过期键中最近最少使用的;
  • allkeys-lru:淘汰所有键中最近最少使用的(推荐热点数据场景);
  • volatile-lfu/allkeys-lfu:淘汰最不经常使用的键;
  • noeviction:默认策略,禁止淘汰,新写入报错。

Redis 高级特性

(1)Redis Module

4.0+ 支持动态加载模块扩展功能,官方推荐模块包括:RediSearch(搜索引擎)、RedisJSON(JSON 处理)、RedisBloom(布隆过滤器)、RedisCell(限流)。

(2)消息队列实现
  • List:通过 RPUSH/LPOP 或阻塞式 BRPOP 实现简易队列,无广播和 ACK 机制;
  • Pub/Sub:支持发布订阅,但无持久化,客户端断开或 Redis 宕机导致消息丢失;
  • Stream:5.0+ 新增,支持消费组、ACK、持久化,类似 Kafka,是最优 Redis 消息队列方案。
(3)分布式锁实现

基于 Redisson 实现,底层结合 Lua 脚本保证命令原子性,支持自动续期、超时释放,避免死锁。

(4)延时任务实现
  • 不推荐:Redis 过期事件监听(时效性差、易丢消息);
  • 推荐:Redisson 延时队列(基于 Sorted Set 实现,支持持久化,消息不易丢失)。

关键底层原理

(1)String 底层实现

基于 SDS(简单动态字符串),而非 C 语言原生字符串,优势包括:避免缓冲区溢出、O (1) 获取长度、减少内存分配、二进制安全,支持 5 种动态类型(sdshdr8/16/32/64),根据字符串长度动态选择。

(2)Zset 底层为何用跳表

跳表相比平衡树 / 红黑树 / B+ 树,实现更简单,插入删除无需旋转 / 染色,范围查询效率高,适合内存数据库场景,无需复杂 IO 优化。

相关推荐
似水明俊德4 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
Leinwin4 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
薛定谔的悦4 小时前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
enjoy嚣士5 小时前
springboot之Exel工具类
java·spring boot·后端·easyexcel·excel工具类
Thera7775 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
罗超驿5 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist
炘爚5 小时前
C语言(文件操作)
c语言·开发语言
阿蒙Amon5 小时前
C#常用类库-详解SerialPort
开发语言·c#
盐水冰6 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
Hello小赵6 小时前
视频压缩编码学习(一)—— 基础知识大集合
学习