惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Engineering at Meta
Engineering at Meta
D
DataBreaches.Net
月光博客
月光博客
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
U
Unit 42
腾讯CDC
爱范儿
爱范儿
J
Java Code Geeks
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
B
Blog
Stack Overflow Blog
Stack Overflow Blog
GbyAI
GbyAI
T
The Blog of Author Tim Ferriss
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 何锦彬

没开电脑! 只用手机和QQ聊天, 让openClaw帮我"手搓"个AI新闻网站 AI编程从 “猜你想要” 到 “精准生成”, 基于Qoder的Spec驱动开发初探. Java团队Cursor最佳实践:3分钟构建「零泄漏」AI开发环境 再不用手写Commit!AI自动总结代码变更,Git提交效率 MCP赋能,给Cursor插上“外挂翅膀”:实战操作数据库 一个老程序员, 两个小时能用corsur做出什么样的东西 会用 AI 的工程师,效率已经拉开差距了 - “ 我们曾经引以为傲的编码能力,正在被改写。” 1-2 【包子mysql系列】, 对mysql的innoDB加锁分析 1-1, 一个简单的mysql 安装教程,基于mysql 5.7解压版本. Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异 为什么阿里的dubbo注册中心要放弃zookeeper, 而用Nacos? 和spring cloud/boot 学习如何管理自己的组件 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试 spring mvc中,直接注入的HttpServletRequst是否安全呢? 基础篇系列,JAVA的并发包 - 锁 撸基础篇系列,JAVA的NIO部分 JAVA的那些数据结构实现总结,实现,扩容说明 JAVA中的数据结构 - 真正的去理解红黑树 对把JDK源码的一些注解,笔记
1, 本地缓存的实现以及遇到的问题
何锦彬 · 2017-02-27 · via 博客园 - 何锦彬

先分享下我基于MAP实现的一个本地缓存

本地缓存 

优势: 

1,易用,只是比map多了个过期时间,有超时的概念 
2,用软引用,可防止对JVM的堆对象造成out memory 

缺点: 
1,用的是堆内存。会对JVM的垃圾回收造成影响 
2,大小控制只能是通过KEY值的存储数量控制,无法通过控制内存占用大小 
3,缺少监控方面的设计 
4,没有缓存的移除,定期清除失效缓存 
5,缓存穿透的问题,当缓存失效时间时,大量访问到了缓存的传统,压到数据库去了 

对于3,4问题可以用google的guava

对于1,ehcache可以用JAVA的直接内存. 

对于直接内存这部分不好实现,JAVA只提供了个ByteBuffer.allocateDirect(capacity)的方法去应用直接内存,也就意味着要存入直接内存必须先把整个对象序列号成byte再放入直接内存。

但这样每次都需要序列号与反序列化的开销,而且得全量加载的堆内存引起垃圾回收。ehcache有直接用native方法实现

踩过的坑:

缓存失效

当缓存出现失效, 瞬间大量访问压到了DB,造成DB的压力

解决:

1,不用失效时间来触发缓存的更新

1, 后台定时刷新最新内容到本地缓存,不依靠失效时间来触发。

2, 结合广播通知模式(如 redis)+本地缓存更新进行更新缓存,而不是通过失效来触发(目前系统主要就是这个模式,待加上案例分享)

当然,两种进行结合效果更好,

WEB服务器不停监控redis的访问,同时定时轮询,覆盖缓存中的内容

2,通过控制进入DB操作的线程数进行控制

       如,  通过重入锁的,tryLock的condition,condition,阻塞超时方法,通知等进行控制(待加上案例分享)

缓存穿透

当访问不存在的KEY时,一直传入到数据库层面去,压到DB,造成DB的压

解决:

1, 添加计数器,如当一个KEY的次数达到了10次后, 在缓存总加入该KEY,进行null的返回

2, 是否符合KEY的规则 + Bloom Filter, 用redis的bitmap存数组,对已存在的值进行hash存入(如果是ID,直接存,不需要hash,准确率100%)。  如果访问的有bit位置为0的,必定不存在

返回同一对象地址

本地缓存读取后的修改,会相互影响的问题

解决:

如果需要修改,返回对象需要进行深度clone

欢迎关注我的公众号,重现线上各种BUG, 一起来构建我们的知识体系