当前位置: 首页 > article >正文

高性能服务架构缓存设计:Redis+Caffeine

这是一个或许对你有用的社群 一对一交流/面试小册/简历优化/求职解惑欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料《项目实战视频》从书中学往事上“练”《互联网高频面试题》面朝简历学习春暖花开《架构 x 系统设计》摧枯拉朽掌控面试高频场景题《精进 Java 学习指南》系统学习互联网主流技术栈《必读 Java 源码专栏》知其然知其所以然这是一个或许对你有用的开源项目国产Star破10w的开源项目前端包括管理后台、微信小程序后端支持单体、微服务架构RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能多模块https://gitee.com/zhijiantianya/ruoyi-vue-pro微服务https://gitee.com/zhijiantianya/yudao-cloud视频教程https://doc.iocoder.cn【国内首批】支持 JDK17/21SpringBoot3、JDK8/11Spring Boot2双版本背景为什么要使用本地缓存设计一个本地内存需要有什么功能本地缓存方案选型1. 使用ConcurrentHashMap实现本地缓存2. 基于Guava Cache实现本地缓存3. Caffeine4. Encache本地缓存问题及解决1. 缓存一致性2. 如何提高本地缓存命中率3. 本地内存的技术选型问题背景在高性能的服务架构设计中缓存是一个不可或缺的环节。在实际的项目中我们通常会将一些热点数据存储到Redis或Memcached 这类缓存中间件中只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时也能降低数据库的压力。随着不断的发展这一架构也产生了改进在一些场景下可能单纯使用Redis类的远程缓存已经不够了还需要进一步配合本地缓存使用例如Guava cache或Caffeine从而再次提升程序的响应速度与服务性能。于是就产生了使用本地缓存作为一级缓存再加上远程缓存作为二级缓存的两级缓存架构。在先不考虑并发等复杂问题的情况下两级缓存的访问流程可以用下面这张图来表示基于 Spring Boot MyBatis Plus Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/ruoyi-vue-pro视频教程https://doc.iocoder.cn/video/为什么要使用本地缓存本地缓存基于本地环境的内存访问速度非常快对于一些变更频率低、实时性要求低的数据可以放在本地缓存中提升访问速度使用本地缓存能够减少和Redis类的远程缓存间的数据交互减少网络I/O开销降低这一过程中在网络通信上的耗时基于 Spring Cloud Alibaba Gateway Nacos RocketMQ Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/yudao-cloud视频教程https://doc.iocoder.cn/video/设计一个本地内存需要有什么功能存储并可以读、写原子操作(线程安全)如ConcurrentHashMap可以设置缓存的最大限制超过最大限制有对应淘汰策略如LRU、LFU过期时间淘汰如定时、懒式、定期持久化统计监控本地缓存方案选型1. 使用ConcurrentHashMap实现本地缓存缓存的本质就是存储在内存中的KV数据结构对应的就是jdk中线程安全的ConcurrentHashMap但是要实现缓存还需要考虑淘汰、最大限制、缓存过期时间淘汰等等功能优点是实现简单不需要引入第三方包比较适合一些简单的业务场景。缺点是如果需要更多的特性需要定制化开发成本会比较高并且稳定性和可靠性也难以保障。对于比较复杂的场景建议使用比较稳定的开源工具。2. 基于Guava Cache实现本地缓存Guava是Google团队开源的一款 Java 核心增强库包含集合、并发原语、缓存、IO、反射等工具箱性能和稳定性上都有保障应用十分广泛。Guava Cache支持很多特性支持最大容量限制支持两种过期删除策略插入时间和访问时间支持简单的统计功能基于LRU算法实现使用代码如下dependency groupIdcom.google.guava/groupId artifactIdguava/artifactId version31.1-jre/version /dependency Slf4j public class GuavaCacheTest { public static void main(String[] args) throws ExecutionException { CacheString, String cache CacheBuilder.newBuilder() .initialCapacity(5) // 初始容量 .maximumSize(10) // 最大缓存数超出淘汰 .expireAfterWrite(60, TimeUnit.SECONDS) // 过期时间 .build(); String orderId String.valueOf(123456789); // 获取orderInfo如果key不存在callable中调用getInfo方法返回数据 String orderInfo cache.get(orderId, () - getInfo(orderId)); log.info(orderInfo {}, orderInfo); } private static String getInfo(String orderId) { String info ; // 先查询redis缓存 log.info(get data from redis); // 当redis缓存不存在查db log.info(get data from mysql); info String.format({orderId%s}, orderId); return info; } }3. CaffeineCaffeine是基于java8实现的新一代缓存工具缓存性能接近理论最优。可以看作是Guava Cache的增强版功能上两者类似不同的是Caffeine采用了一种结合LRU、LFU优点的算法W-TinyLFU在性能上有明显的优越性使用代码如下dependency groupIdcom.github.ben-manes.caffeine/groupId artifactIdcaffeine/artifactId version2.9.3/version /dependency Slf4j public class CaffeineTest { public static void main(String[] args) { CacheString, String cache Caffeine.newBuilder() .initialCapacity(5) // 超出时淘汰 .maximumSize(10) //设置写缓存后n秒钟过期 .expireAfterWrite(60, TimeUnit.SECONDS) //设置读写缓存后n秒钟过期,实际很少用到,类似于expireAfterWrite //.expireAfterAccess(17, TimeUnit.SECONDS) .build(); String orderId String.valueOf(123456789); String orderInfo cache.get(orderId, key - getInfo(key)); System.out.println(orderInfo); } private static String getInfo(String orderId) { String info ; // 先查询redis缓存 log.info(get data from redis); // 当redis缓存不存在查db log.info(get data from mysql); info String.format({orderId%s}, orderId); return info; } }4. EncacheEncache是一个纯Java的进程内缓存框架具有快速、精干等特点是Hibernate中默认的CacheProvider。同Caffeine和Guava Cache相比Encache的功能更加丰富扩展性更强支持多种缓存淘汰算法包括LRU、LFU和FIFO缓存支持堆内存储、堆外存储、磁盘存储支持持久化三种支持多种集群方案解决数据共享问题使用代码如下dependency groupIdorg.ehcache/groupId artifactIdehcache/artifactId version3.9.7/version /dependency Slf4j public class EhcacheTest { private static final String ORDER_CACHE orderCache; public static void main(String[] args) { CacheManager cacheManager CacheManagerBuilder.newCacheManagerBuilder() // 创建cache实例 .withCache(ORDER_CACHE, CacheConfigurationBuilder // 声明一个容量为20的堆内缓存 .newCacheConfigurationBuilder(String.class, String.class, ResourcePoolsBuilder.heap(20))) .build(true); // 获取cache实例 CacheString, String cache cacheManager.getCache(ORDER_CACHE, String.class, String.class); String orderId String.valueOf(123456789); String orderInfo cache.get(orderId); if (StrUtil.isBlank(orderInfo)) { orderInfo getInfo(orderId); cache.put(orderId, orderInfo); } log.info(orderInfo {}, orderInfo); } private static String getInfo(String orderId) { String info ; // 先查询redis缓存 log.info(get data from redis); // 当redis缓存不存在查db log.info(get data from mysql); info String.format({orderId%s}, orderId); return info; } }本地缓存问题及解决1. 缓存一致性两级缓存与数据库的数据要保持一致一旦数据发生了修改在修改数据库的同时本地缓存、远程缓存应该同步更新。解决方案1: MQ一般现在部署都是集群部署有多个不同节点的本地缓存; 可以使用MQ的广播模式当数据修改时向MQ发送消息节点监听并消费消息删除本地缓存达到最终一致性解决方案2Canal MQ如果你不想在你的业务代码发送MQ消息还可以适用近几年比较流行的方法订阅数据库变更日志再操作缓存。Canal 订阅Mysql的 Binlog日志当发生变化时向MQ发送消息进而也实现数据一致性。2. 如何提高本地缓存命中率参考如何提高缓存命中率3. 本地内存的技术选型问题从易用性角度Guava Cache、Caffeine和Encache都有十分成熟的接入方案使用简单。从功能性角度Guava Cache和Caffeine功能类似都是只支持堆内缓存Encache相比功能更为丰富从性能上进行比较Caffeine最优、GuavaCache次之Encache最差(下图是三者的性能对比结果对于本地缓存的方案中我比较推荐Caffeine性能上遥遥领先。虽然Encache功能更为丰富甚至提供了持久化和集群的功能但是这些功能完全可以依靠其他方式实现。真实的业务工程中建议使用Caffeine作为本地缓存另外使用redis或者memcache作为分布式缓存构造多级缓存体系保证性能和可靠性。欢迎加入我的知识星球全面提升技术能力。 加入方式“长按”或“扫描”下方二维码噢星球的内容包括项目实战、面试招聘、源码解析、学习路线。文章有帮助的话在看转发吧。 谢谢支持哟 (*^__^*

相关文章:

高性能服务架构缓存设计:Redis+Caffeine

👉 这是一个或许对你有用的社群🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 《项目实战(视频)》:从书中学,往事上…...

TlbbGmTool:从数据库小白到《天龙八部》单机版管理大师的蜕变之旅

TlbbGmTool:从数据库小白到《天龙八部》单机版管理大师的蜕变之旅 【免费下载链接】TlbbGmTool 某网络游戏的单机版本GM工具 项目地址: https://gitcode.com/gh_mirrors/tl/TlbbGmTool 你是否曾经面对《天龙八部》单机版数据库的复杂结构感到无从下手&#x…...

Windows风扇控制终极指南:5分钟学会FanControl智能调校

Windows风扇控制终极指南:5分钟学会FanControl智能调校 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

STM32+EMMC+GL3227E固件调试:从扇区偏移到数据同步的实战解析

1. 问题现象与背景分析 最近在调试一个嵌入式存储系统时遇到了奇怪的现象:STM32主控将数据写入EMMC存储后,通过GL3227E桥接芯片连接电脑却无法识别。更诡异的是,电脑格式化后的EMMC,STM32写入的数据在电脑端又"消失"了。…...

2026 流量卡办理全攻略:从下单、激活到售后,新手一遍看懂不踩坑

现在人人都离不开手机流量,不管是日常刷视频、追剧观影,还是备用机上网冲浪,一张划算又正规的通用流量卡,已经成为大众刚需。但很多新手第一次在线办理优惠号卡,普遍一头雾水:分不清流量卡是否正规靠谱、办…...

终极解决方案:3分钟快速修复VC++运行库缺失问题,彻底告别软件启动失败

终极解决方案:3分钟快速修复VC运行库缺失问题,彻底告别软件启动失败 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否经常遇到游戏或…...

点云成像三维焊缝识别与机器人跟踪【附代码】

✨ 长期致力于点云成像、焊缝识别定位、机器人、点云拼接、焊缝轨迹跟踪研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅如需沟通交流,点击《获取方式》 (1)基于圆柱体拟合与ICP拼接的点云…...

CTR预估实战:DeepFM模型在Criteo数据集上的调参避坑指南(附PyTorch代码)

DeepFM模型在Criteo数据集上的调优实战:从79%到81% AUC的进阶之路 当CTR预估模型的AUC指标卡在79%的瓶颈时,真正的挑战才刚刚开始。本文将以工业级数据集Criteo为战场,分享如何通过系统化的调参策略和特征工程技巧,将DeepFM模型的…...

AVL许可排队严重?不想买新许可,回收闲置即刻算例

AVL许可排队严重?不买新许可,回收闲置许可就能解决,我就踩过这个坑关键词分析:AVL里藏着的宝藏AVL许可排队严重?别急着买新许可!我们先来看看这个问题到底藏哪儿。2026年我帮某制造业客户做系统优化时&…...

Chromatic:掌握Chromium/V8的终极通用修改器,开启浏览器调试新纪元

Chromatic:掌握Chromium/V8的终极通用修改器,开启浏览器调试新纪元 【免费下载链接】chromatic Universal modifier for Chromium/V8 | 广谱注入 Chromium/V8 的通用修改器 项目地址: https://gitcode.com/gh_mirrors/be/chromatic 还在为浏览器调…...

用微信小程序点灯!STC89C51+ESP8266物联网入门实战(附完整源码)

用微信小程序点灯!STC89C51ESP8266物联网入门实战(附完整源码) 当你第一次看到手机上的按钮能控制真实世界的灯泡时,那种"魔法成真"的震撼感,正是物联网的魅力所在。本文将带你用不到百元的硬件成本&#xf…...

告别Arduino IDE:用Python玩转ESP8266,保姆级Micropython固件烧录与点灯实战

从Arduino到Micropython:用Python解锁ESP8266的物联网潜能 当硬件爱好者第一次接触Arduino时,往往会被其简单的开发方式所吸引。但随着项目复杂度提升,C/C的编译等待、内存管理和语法冗长开始成为创新路上的绊脚石。这就是为什么越来越多的开…...

JEB Pro 5.40 (macOS, Linux, Windows) - Android 反编译器和调试器

JEB Pro 5.40 (macOS, Linux, Windows) - 逆向工程平台 Reverse Engineering for Professionals. 请访问原文链接:https://sysin.org/blog/jeb/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org JEB Decompiler JEB 是逆向工程…...

手把手教你用RecFusion和3D Scan:Kinect v2与RealSense D435三维重建完整流程与软件配置

手把手教你用RecFusion和3D Scan:Kinect v2与RealSense D435三维重建完整流程与软件配置 刚拿到Kinect v2或RealSense D435时,许多开发者最迫切的需求不是理解原理,而是快速完成第一次三维扫描。本文将用最简明的操作流,带你在30分…...

手把手教你用STM32和电位器,临时搭建一个TTL转485调试器(附电路图)

应急调试利器:用STM32和电位器快速搭建TTL转485监听器 在嵌入式开发现场调试时,最让人头疼的莫过于设备串口输出异常却找不到合适的调试工具。上周在客户工厂就遇到了这样的窘境——需要监控设备TTL串口数据,但手边只有RS485转换器和几根杜邦…...

为什么92%的AI创作者不敢打印自己的Midjourney作品?揭秘树莓派印相避坑指南,含色彩管理ICC配置包(限免72小时)

更多请点击: https://intelliparadigm.com 第一章:为什么92%的AI创作者不敢打印自己的Midjourney作品? 当一张由 Midjourney 生成的「超写实森林神殿」在屏幕上熠熠生辉时,创作者往往兴奋地截图、转发、设为壁纸——却极少有人按…...

研发交付管理:资源化与项目制的实践思考

说明(阅读前):本文系 方法论层面的归纳,依据常见软件研发组织实践整理,不涉及任何特定企业的内部制度、人数或薪酬细节;文中角色名称(如研发经理、项目发起人)为 通用称谓&#xff0…...

【Leona】BoxId 是什么-设备指纹参数

BoxId 是什么?从 Leona.sense() 到 /v1/verdict 的可落地闭环:签名、落库、错误处理与回归验证(基于公开示例) TL;DR BoxId 不是“风险结论”,而是一次“证据报告兑换券”:端上拿 BoxId,后端换证…...

计算机人别卷开发了!这个方向让我毕业年入_20_万,兼职还能赚8K

一、我那 “躺赢” 的同学:从找不到工作到 offer 拿到手软 去年毕业季,我们班一半人在死磕 LeetCode 求开发岗,月薪 8K 都要抢破头;而隔壁宿舍的阿凯,没卷一道算法题,却拿到了 3 家企业的安全岗 offer&…...

告别疲劳计算烦恼:用nCode DesignLife搞定汽车悬架非线性载荷分析(附信号处理技巧)

告别疲劳计算烦恼:用nCode DesignLife搞定汽车悬架非线性载荷分析(附信号处理技巧) 悬架系统作为汽车底盘的核心部件,其疲劳寿命直接关系到整车可靠性与安全性。但在实际工程分析中,工程师们常常被一个棘手问题困扰&am…...

ARM DAP调试架构核心机制与实践指南

1. ARM调试访问端口(DAP)架构解析调试访问端口(Debug Access Port, DAP)是ARM调试架构中的核心组件,它作为调试器与芯片内部调试资源的桥梁,提供了标准化的访问接口。DAP的设计遵循ARM Debug Interface v5.1(ADIv5.1)规范,支持两种物理接口协…...

ClaudeCode入门08-Git配合(小白入门:不知道怎么写Git提交记录?让AI自动帮你写好)

🎯 本文目标 学会用 Claude Code 自动化 Git 工作流:自动写 Commit Message、管理分支、处理冲突。 😰 Git 新手的痛点 git commit -m "fix" git commit -m "update" git commit -m "修改了一些东西" 不知道 Conventional Commits 是什么 …...

Davinci vs. 其他BI工具怎么选?从私有化部署和二次开发角度深度对比

Davinci vs. 主流BI工具技术选型指南:私有化部署与二次开发实战解析 当企业数据量突破TB级时,我们技术团队曾面临一个关键抉择:是继续支付每年六位数的商业BI服务费,还是转向可深度定制的开源方案?这个决策不仅关乎成本…...

AI建站工具从0到1全流程保姆级攻略:零代码生成网站就这么简单

AI建站工具从0到1全流程保姆级攻略:零代码生成网站就这么简单被外包公司几万块的报价劝退?被老板催着下周上线活动页却连域名是什么都不清楚?别慌,用AI建站工具,不写一行代码、不学复杂技术,普通人也能在两…...

Davinci vs. 其他开源BI工具(Superset/Metabase)实战对比:我们团队为什么最终选了它?

Davinci vs. 其他开源BI工具实战对比:技术选型的深度思考 在数据驱动决策的时代,企业级BI工具的选择直接影响着数据分析的效率和深度。当我们团队面临开源BI工具选型时,Davinci、Apache Superset和Metabase成为了主要候选对象。经过三个月的实…...

Java面试跳槽需要提前准备什么内容?

今年时间属实过得挺快的,想必有很多小伙伴这会已经在为下半年面试跳槽做准备了。临近面试肯定是要想办法提升自己的面试能力,这个时候如果还去一昧地提升自己的代码能力对面试是毫无帮助的。大多数人在面试的时候都会遇到以下几种情况(大家可…...

Spring Boot + JWT 实现无状态认证

1. JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为 JSON 对象传输。JWT 是目前最流行的跨域认证解决方案,特别适合前后端分离的架构。 1.1 JWT 的结构 JWT 由三…...

知网AI率30%50%80%哪个最难降?比话降AI知网专精方案!

知网AI率30%50%80%哪个最难降?比话降AI知网专精方案! 很多硕博毕业生有个直觉:知网 AI 率 80% 比 30% 难降很多。这个直觉只对了一半。 真相是:难度不是看数字高低,是看「工具的技术路线对不对知网的算法」。一篇 80% …...

Speechless:你的微博数字记忆永久保存方案,告别内容丢失焦虑

Speechless:你的微博数字记忆永久保存方案,告别内容丢失焦虑 【免费下载链接】Speechless 把新浪微博的内容,导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 你是否曾经历过精…...

5分钟掌握暗黑2存档修改秘籍:彻底告别重复刷怪烦恼

5分钟掌握暗黑2存档修改秘籍:彻底告别重复刷怪烦恼 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2无尽的重复刷怪而烦恼吗?想体验各种强力build却不想花费数百小时练级刷装备&#xff…...