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 优化。

相关推荐
程序员清风27 分钟前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林5512 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊7 小时前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing7 小时前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠1 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840821 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide1 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家1 天前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺1 天前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户908324602731 天前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端