Java数据库与数据存储:Redis
1. 引言在当今互联网高并发场景下数据库的性能瓶颈往往成为系统扩展的最大障碍。Redis 作为一款高性能的内存数据库凭借其丰富的数据结构、极快的读写速度和灵活的持久化机制已经成为 Java 后端开发中不可或缺的组件。本文将系统性地介绍 Redis 的核心知识体系包括五种基本数据结构、持久化机制、集群部署模式以及面试中高频出现的缓存穿透、缓存雪崩和缓存击穿三大经典问题。无论你是准备面试还是实际项目开发这篇文章都能为你提供完整的知识框架。2. Redis 概述2.1 什么是 RedisRedisRemote Dictionary Server是一个开源的、基于内存的键值对存储系统由 Salvatore Sanfilippo 于 2009 年开发。它支持多种数据结构如字符串、哈希、列表、集合和有序集合并提供了丰富的操作命令。2.2 Redis 的核心特性高性能基于内存操作单线程模型避免了并发竞争读写速度可达 10 万次/秒以上丰富的数据结构支持 String、Hash、List、Set、ZSet 五种基本类型及 Bitmap、HyperLogLog、Geo 等高级类型持久化机制支持 RDB 快照和 AOF 日志两种持久化方式高可用支持主从复制、哨兵模式和集群模式原子性操作所有命令都是原子操作支持事务和 Lua 脚本2.3 Redis 的应用场景缓存系统减轻数据库压力提升系统响应速度分布式锁基于 SETNX 命令实现分布式锁排行榜利用 ZSet 实现实时排行榜计数器利用 INCR/DECR 实现访问计数、库存扣减消息队列利用 List 的 LPUSH/BRPOP 实现简单的消息队列会话管理存储用户登录状态和 Session 信息3. Redis 数据结构详解3.1 String字符串String 是 Redis 最基本的数据类型可以存储字符串、整数或浮点数最大容量为 512MB。常用命令SET key value# 设置键值GET key# 获取值INCR key# 值加1DECR key# 值减1SETEX key seconds value# 设置带过期时间的键值MSET key1 value1 key2 value2# 批量设置Java 使用示例// 使用 Spring Data RedisAutowiredprivateStringRedisTemplatestringRedisTemplate;// 设置缓存stringRedisTemplate.opsForValue().set(user:1001,张三,30,TimeUnit.MINUTES);// 获取缓存StringuserstringRedisTemplate.opsForValue().get(user:1001);// 计数器操作LongcountstringRedisTemplate.opsForValue().increment(page:view:count);应用场景缓存对象、计数器、分布式锁、Session 管理。3.2 Hash哈希Hash 是一个键值对集合适合存储对象类型的数据可以单独修改某个字段而不影响其他字段。常用命令HSET key field value# 设置字段值HGET key field# 获取字段值HGETALL key# 获取所有字段和值HDEL key field# 删除字段HINCRBY key field increment# 字段值增加Java 使用示例AutowiredprivateRedisTemplateString,ObjectredisTemplate;// 存储用户对象HashOperationsString,String,ObjecthashOpsredisTemplate.opsForHash();MapString,ObjectuserMapnewHashMap();userMap.put(name,李四);userMap.put(age,25);userMap.put(email,lisiexample.com);hashOps.putAll(user:1002,userMap);// 获取单个字段ObjectnamehashOps.get(user:1002,name);// 获取整个对象MapString,ObjectuserhashOps.entries(user:1002);应用场景存储对象信息、购物车、用户资料。3.3 List列表List 是一个双向链表支持从两端插入和弹出元素适合实现队列和栈。常用命令LPUSH key value# 从左侧插入RPUSH key value# 从右侧插入LPOP key# 从左侧弹出RPOP key# 从右侧弹出LRANGE key start stop# 获取范围内的元素LLEN key# 获取列表长度Java 使用示例// 实现消息队列ListOperationsString,StringlistOpsredisTemplate.opsForList();// 生产者发送消息listOps.rightPush(message:queue,消息1);listOps.rightPush(message:queue,消息2);// 消费者接收消息阻塞式StringmessagelistOps.leftPop(message:queue,10,TimeUnit.SECONDS);应用场景消息队列、最新消息列表、时间线。3.4 Set集合Set 是无序的字符串集合元素唯一支持集合运算交集、并集、差集。常用命令SADD key member# 添加元素SREM key member# 删除元素SMEMBERS key# 获取所有元素SISMEMBER key member# 判断元素是否存在SINTER key1 key2# 求交集SUNION key1 key2# 求并集Java 使用示例SetOperationsString,StringsetOpsredisTemplate.opsForSet();// 添加标签setOps.add(user:1001:tags,Java,Redis,Spring);// 判断是否包含某元素BooleanhasTagsetOps.isMember(user:1001:tags,Java);// 求共同关注SetStringcommonsetOps.intersect(user:1001:follows,user:1002:follows);应用场景标签系统、好友关系、去重操作。3.5 ZSet有序集合ZSet 在 Set 的基础上增加了分数score属性元素按分数排序适合实现排行榜。常用命令ZADD key score member# 添加元素及分数ZRANGE key start stop# 按分数升序获取ZREVRANGE key start stop# 按分数降序获取ZSCORE key member# 获取元素分数ZINCRBY key increment member# 增加元素分数ZRANK key member# 获取元素排名Java 使用示例ZSetOperationsString,StringzSetOpsredisTemplate.opsForZSet();// 添加排行榜数据zSetOps.add(ranking:game,玩家A,100);zSetOps.add(ranking:game,玩家B,85);zSetOps.add(ranking:game,玩家C,95);// 获取前三名SetStringtop3zSetOps.reverseRange(ranking:game,0,2);// 增加分数zSetOps.incrementScore(ranking:game,玩家B,20);应用场景排行榜、延时队列、优先级队列。4. Redis 持久化机制4.1 RDBRedis DataBase持久化RDB 是 Redis 默认的持久化方式通过创建快照Snapshot将内存中的数据保存到磁盘。工作原理在指定的时间间隔内将内存中的数据集快照写入磁盘默认文件名为dump.rdb通过 fork 子进程完成快照生成不影响主进程服务触发条件# 配置文件 redis.conf 中的默认配置save9001# 900秒内至少1次修改save30010# 300秒内至少10次修改save6010000# 60秒内至少10000次修改优点文件紧凑适合备份和灾难恢复恢复速度快对性能影响小缺点可能丢失最后一次快照后的数据fork 子进程时可能短暂阻塞4.2 AOFAppend Only File持久化AOF 通过记录每次写操作命令来持久化数据以追加的方式写入日志文件。工作原理将每次写命令追加到appendonly.aof文件支持三种同步策略always、everysec、no支持 AOF 重写机制压缩文件大小配置方式# 开启 AOFappendonlyyes# 同步策略appendfsync always# 每次写入都同步最安全但性能最差appendfsync everysec# 每秒同步一次推荐appendfsync no# 由操作系统决定同步时机优点数据安全性高最多丢失 1 秒数据日志文件可读便于排查问题缺点文件体积较大恢复速度较慢相同数据集下 AOF 文件比 RDB 大4.3 混合持久化Redis 4.0 引入了混合持久化机制结合 RDB 和 AOF 的优点使用 RDB 作为基础快照在快照之间使用 AOF 记录增量操作兼顾恢复速度和数据安全性# 开启混合持久化aof-use-rdb-preambleyes5. Redis 集群模式5.1 主从复制模式主从复制是最基础的集群模式通过将主节点的数据同步到从节点实现读写分离和数据备份。架构特点一个主节点Master负责写操作多个从节点Slave负责读操作从节点自动同步主节点数据配置方式# 在从节点配置文件中指定主节点replicaof192.168.1.1006379# 或使用命令动态设置SLAVEOF192.168.1.1006379复制原理从节点发送 SYNC 命令主节点执行 BGSAVE 生成 RDB 快照主节点将快照发送给从节点从节点加载快照主节点将增量命令发送给从节点优点实现读写分离提升读性能数据冗余备份配置简单缺点主节点故障时无法自动切换从节点过多时同步压力大5.2 哨兵模式Sentinel哨兵模式在主从复制基础上增加了自动故障转移能力实现高可用。架构特点哨兵进程监控主从节点的运行状态主节点故障时自动选举新的主节点客户端通过哨兵获取当前主节点地址哨兵配置# sentinel.confsentinel monitor mymaster192.168.1.10063792sentinel down-after-milliseconds mymaster5000sentinel failover-timeout mymaster15000故障转移流程主节点故障哨兵检测到主节点下线投票选举新主节点从节点升级为主节点其他从节点重新同步客户端连接新主节点优点自动故障转移高可用无需人工干预支持监控和通知缺点只有一个主节点写性能受限配置相对复杂5.3 Cluster 集群模式Cluster 模式是 Redis 3.0 引入的分布式解决方案支持数据分片和水平扩展。架构特点数据自动分片到 16384 个哈希槽每个节点负责一部分哈希槽支持多主多从无中心化架构支持在线扩容和缩容哈希槽分配# 集群节点分配哈希槽redis-cli-p7001cluster addslots0-5460 redis-cli-p7002cluster addslots5461-10922 redis-cli-p7003cluster addslots10923-16383集群配置示例# 创建集群至少3个主节点redis-cli--clustercreate192.168.1.101:7001192.168.1.102:7002\192.168.1.103:7003 --cluster-replicas1数据分片原理客户端请求计算哈希槽CRC16(key) % 16384定位节点执行操作优点支持水平扩展突破单机内存限制高可用支持自动故障转移无中心化避免单点瓶颈缺点不支持多键操作跨槽位客户端需要支持集群协议数据迁移期间可能影响性能6. 缓存穿透、缓存雪崩与缓存击穿6.1 缓存穿透问题描述查询一个不存在的数据缓存和数据库中都没有导致每次请求都直接打到数据库。产生原因恶意攻击构造大量不存在的 key业务逻辑缺陷查询了不存在的 ID解决方案方案一缓存空值publicObjectgetData(Stringkey){// 先从缓存查询ObjectvalueredisTemplate.opsForValue().get(key);if(value!null){returnvalue;}// 缓存未命中查询数据库ObjectdbValuequeryFromDatabase(key);if(dbValuenull){// 缓存空值设置较短的过期时间redisTemplate.opsForValue().set(key,,60,TimeUnit.SECONDS);returnnull;}// 缓存真实数据redisTemplate.opsForValue().set(key,dbValue,30,TimeUnit.MINUTES);returndbValue;}方案二布隆过滤器// 使用 Guava 布隆过滤器BloomFilterStringbloomFilterBloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()),1000000,// 预计元素数量0.01// 误判率);// 初始化时加载所有存在的 keybloomFilter.put(user:1001);bloomFilter.put(user:1002);publicObjectgetData(Stringkey){// 布隆过滤器判断if(!bloomFilter.mightContain(key)){returnnull;// 一定不存在直接返回}// 可能存在继续查询缓存和数据库// ...}6.2 缓存雪崩问题描述大量缓存同时过期或 Redis 服务宕机导致所有请求直接打到数据库造成数据库压力骤增甚至崩溃。产生原因缓存设置了相同的过期时间Redis 服务宕机缓存服务器重启解决方案方案一过期时间加随机值// 设置过期时间时加入随机值避免同时过期intbaseExpire30*60;// 基础过期时间30分钟intrandomExpirenewRandom().nextInt(300);// 随机0-300秒redisTemplate.opsForValue().set(key,value,baseExpirerandomExpire,TimeUnit.SECONDS);方案二多级缓存// 一级缓存本地缓存CaffeineCacheString,ObjectlocalCacheCaffeine.newBuilder().expireAfterWrite(5,TimeUnit.MINUTES).maximumSize(10000).build();// 二级缓存RedispublicObjectgetData(Stringkey){// 先查本地缓存ObjectlocalValuelocalCache.getIfPresent(key);if(localValue!null){returnlocalValue;}// 再查 RedisObjectredisValueredisTemplate.opsForValue().get(key);if(redisValue!null){localCache.put(key,redisValue);returnredisValue;}// 最后查数据库ObjectdbValuequeryFromDatabase(key);if(dbValue!null){redisTemplate.opsForValue().set(key,dbValue,30,TimeUnit.MINUTES);localCache.put(key,dbValue);}returndbValue;}方案三Redis 高可用使用哨兵模式或集群模式配置主从复制实现故障自动转移使用持久化机制重启后快速恢复6.3 缓存击穿问题描述某个热点 key 在缓存过期的瞬间大量并发请求同时访问该 key导致所有请求都打到数据库。产生原因热点数据过期高并发访问同一数据解决方案方案一互斥锁publicObjectgetData(Stringkey){// 先从缓存查询ObjectvalueredisTemplate.opsForValue().get(key);if(value!null){returnvalue;}

相关新闻

用 /balance-check 做系统化游戏平衡审计:Claude Code Game Studios 六阶段平衡检查技能详解

用 /balance-check 做系统化游戏平衡审计:Claude Code Game Studios 六阶段平衡检查技能详解

用 /balance-check 做系统化游戏平衡审计:Claude Code Game Studios 六阶段平衡检查技能详解 【免费下载链接】Claude-Code-Game-Studios Turn Claude Code into a full game dev studio — 49 AI agents, 72 workflow skills, and a complete coordination system …

2026/9/25 3:32:36 阅读更多 →
第44篇-安全架构设计:从分层防护到零信任

第44篇-安全架构设计:从分层防护到零信任

【软考系统架构设计师全链路通关实战】第 44 篇:安全架构设计:从分层防护到零信任 本系列定位:以软考系统架构设计师(高级)考试为主线,语言无关的架构方法论视角,覆盖官方教程(第二版…

2026/9/25 3:32:34 阅读更多 →
第46篇-信息系统架构设计:总体规划与企业信息化

第46篇-信息系统架构设计:总体规划与企业信息化

【软考系统架构设计师全链路通关实战】第 46 篇:信息系统架构设计:总体规划与企业信息化 本系列定位:以软考系统架构设计师(高级)考试为主线,语言无关的架构方法论视角,覆盖官方教程&#xff08…

2026/9/25 7:21:48 阅读更多 →

最新新闻

Nasiko A2A Registry 设计解析:把“Agent 发现“本身做成一个 A2A Agent

Nasiko A2A Registry 设计解析:把“Agent 发现“本身做成一个 A2A Agent

【免费下载链接】nasiko Developer Control Plane for your AI Agents 项目地址: https://gitcode.com/gh_mirrors/na/nasiko 点击查看 免费下载 在 Nasiko(Developer Control Plane for your AI Agents)中,Agent 之间的通信、发…

2026/9/25 22:57:20 阅读更多 →
LDA主题词提取实战:从原理到Python实现与调参

LDA主题词提取实战:从原理到Python实现与调参

简介:面向自然语言处理与文本挖掘场景的LDA主题建模与关键词提取资源包,基于潜在狄利克雷分配模型,适合需要学习主题模型原理或快速搭建文本分析工具的开发者和研究者,可用于从文档集合中自动发现隐藏主题并提取代表性词语。压缩包…

2026/9/25 22:57:20 阅读更多 →
从ProX到UltraX:LLM预训练数据精炼方法演进史与UltraX-0.6B精炼模型完整详解

从ProX到UltraX:LLM预训练数据精炼方法演进史与UltraX-0.6B精炼模型完整详解

从ProX到UltraX:LLM预训练数据精炼方法演进史与UltraX-0.6B精炼模型完整详解 【免费下载链接】UltraX-Preview 项目地址: https://ai.gitcode.com/OpenBMB/UltraX-Preview OpenBMB 开源社区发布的 UltraX-Preview 数据集是 LLM 预训练数据精炼的最新成果&am…

2026/9/25 22:57:20 阅读更多 →
S型曲线Demo:手把手理解扩散模型DDPM原理与实现

S型曲线Demo:手把手理解扩散模型DDPM原理与实现

简介:面向机器学习初学者的扩散模型微型demo,通过生成S型曲线演示扩散模型从随机噪声逐步还原数据分布的核心过程,特别适合刚接触生成模型、想绕过复杂公式直接看代码逻辑的读者。压缩包共8个文件,大小约9.74MB,主程序…

2026/9/25 22:57:20 阅读更多 →
Robomongo 内嵌 esprima 2.7.3:ECMAScript 解析器在 MongoDB Shell 脚本解析中的集成与应用

Robomongo 内嵌 esprima 2.7.3:ECMAScript 解析器在 MongoDB Shell 脚本解析中的集成与应用

数据库客户端桌面应用 【免费下载链接】robomongo Native cross-platform MongoDB management tool 项目地址: https://gitcode.com/gh_mirrors/ro/robomongo 点击查看 免费下载 Robomongo(即 Robo 3T)是一款原生的跨平台 MongoDB 管理工具&…

2026/9/25 22:57:20 阅读更多 →
rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 导读 本文围绕 rsuite 的 Calendar(日历)组件,重点讲解如何通过 ce…

2026/9/25 22:56:19 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →