写在前面
随着我们的系统负载越来越高,系统的性能就会有所下降,此时,我们可以很自然地想到使用缓存来解决数据读写性能低下的问题。但是,立志成为资深架构师的你,是否能够在高并发环境下合理并且高效的构建应用级缓存呢?
缓存命中率
缓存命中率是从缓存中读取数据的次数与总读取次数的比率,命中率越高越好。缓存命中率=从缓存中读取次数 / (总读取次数 (从缓存中读取次数 + 从慢速设备上读取次数))。这是一个非常重要的监控指标,如果做缓存,则应通过监控这个指标来看缓存是否工作良好。
缓存回收策略
1.基于空间
基于空间指缓存设置了存储空间,如设置为10MB,当达到存储空间上限时,按照一定的策略移除数据。
2.基于容量
基于容量指缓存设置了最大大小,当缓存的条目超过最大大小时,按照一定的策略移除旧数据。
3.基于时间
TTL(Time To Live):存活期,即缓存数据从创建开始直到到期的一个时间段(不管在这个时间段内有没有被访问,缓存数据都将过期)。
TTI(Time To Idle):空闲期,即缓存数据多久没被访问后移除缓存的时间。
4.基于对象引用
软引用:如果一个对象是软引用,则当JVM堆内存不足时,垃圾回收器可以回收这些对象。软引用适合用来做缓存,从而当JVM堆内存不足时,可以回收这些对象腾出一些空间供强引用对象使用,从而避免OOM。
弱引用:当垃圾回收器回收内存时,如果发现弱引用,则将它立即回收。相对于软引用,弱引用有更短的生命周期。
注意:只有在没有其他强引用对象引用弱引用/软引用对象时,垃圾回收时才回收该引用。即如果有一个对象(不是弱引用/软引用对象)引用了弱引用/软引用对象,那么垃圾回收时不会回收该弱引用/软引用对象。
5.回收算法
使用基于空间和基于容量的缓存会使用一定的策略移除旧数据,常见的如下。
-
FIFO(First In First Out):先进先出算法,即先放入缓存的先被移除。
-
LRU(Least Recently Used):最近最少使用算法,时间时间距离现在最久的那个被移除。
-
LFU(Least Frequently Used):最不常用算法,一定时间段内使用次数(频率)最少的那个被移除。
实际应用中基于LRU的缓存居多。
缓存类型
堆内存: 使用Java堆内存来存储对象。使用堆缓存的好处是没有序列化/反序列化,是最快的缓存。缺点也很明显,当缓存的数据量很大时,GC(垃圾回收)暂停时间会变长,存储容量受限于堆空间大小。一般通过软引用/弱引用来存储缓存对象。即当堆内存不足时,可以强制回收这部分内存释放堆内存空间。一般使用堆缓存存储较热的数据。可以使用Guava Cache、Ehcache 3.x、 MapDB实现。
堆外内存: 即缓存数据存储在堆外内存,可以减少GC暂停时间(堆对象转移到堆外,GC扫描和移动的对象变少了),可以支持更多的缓存空间(只受机器内存大小限制,不受堆空间的影响)。但是,读取数据时需要序列化/反序列化。因此,会比堆缓存慢很多。可以使用Ehcache 3.x、 MapDB实现。
磁盘缓存: 即缓存数据存储在磁盘上,在JVM重启时数据还存在,而堆/堆外缓存数据会丢失,需要重新加载。可以使用Ehcache 3.x、MapDB实现。
分布式缓存: 分布式缓存可以使用ehcache-clustered(配合Terracotta server)实现Java进程间分布式缓存。也可以使用Memcached、Redis实现。
缓存模式
单机模式: 存储最热的数据到堆缓存,相对热的数据到堆外缓存,不热的数据到磁盘缓存。
集群模式: 存储最热的数据到堆缓存,相对热的数据到对外缓存,全量数据到分布式缓存。
写在最后
如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发编程技术。
最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。
相关推荐
Hibernate的一级缓存、二级缓存和查询缓存共同构建了一个层次化的缓存体系,有效地缓解了数据库的压力,提升了应用的运行效率。理解并掌握这些缓存机制,对于优化Hibernate应用至关重要。在实践中,合理配置和管理...
在高并发环境下,缓存设计需要考虑以下策略: 1. **缓存粒度**:根据业务需求,合理选择缓存的粒度,如缓存整个对象还是只缓存部分字段,以平衡缓存命中率和空间占用。 2. **缓存容量控制**:设置合适的缓存大小,...
它提供了一级缓存和二级缓存的功能,尤其在大数据量和高并发场景下,能显著提升系统响应速度。在这个"Ehcache二级缓存.zip"压缩包中,可能包含了实现Ehcache二级缓存的相关文件,如jar包、配置文件和文档等。 1. **...
在本文中,我们将深入探讨如何在Spring ...这将显著提升数据库查询效率,减少对数据库的压力,尤其在高并发场景下,效果尤为明显。记得在实际生产环境中,根据业务需求和服务器资源合理调整缓存策略,以达到最佳性能。
为了确保Web应用在高并发环境下能够正常运行,需要采取一系列的保护措施。其中包括合理设置服务进程/线程的数量以防止过载,设置合适的超时时间以避免长时间等待等问题。此外,还需要有应急预案,比如在系统出现故障...
负载均衡是确保高并发环境下系统稳定性的关键。这部分可能会涵盖各种负载均衡策略,如轮询、权重分配、最少连接数等,以及相关的工具和技术,如Nginx、HAProxy等。同时,还会讨论如何通过动态调整负载均衡策略来应对...
总结来说,"ImageLoaderDemo图片三级缓存"利用了Java集合框架的特性,结合并发编程理念,构建了一套高效、安全的图片加载和缓存机制。这种设计思路不仅减少了网络请求,提升了图片加载速度,还优化了内存使用,防止...
总的来说,Ehcache在SpringBoot中的应用能显著提升系统的响应速度和可扩展性,尤其是在处理大量数据或高并发场景下。通过灵活的配置和丰富的API,开发者可以定制适合自身业务需求的缓存策略,进一步优化应用性能。...
9. **分布式系统**:在亿级流量场景下,分布式锁、分布式缓存(如Redis、Memcached)、负载均衡等分布式技术的应用是必不可少的。 10. **微服务架构**:随着系统规模的扩大,微服务架构可以帮助我们分解大型系统,...
二级缓存能有效减少对数据库的访问,提高性能,但需要注意的是,缓存数据的一致性问题,尤其是在并发环境下,需要合理设置缓存策略,如更新、过期时间等。 **二、分页功能** 分页是处理大量数据的有效方法,避免一...
默认情况下,MyBatis的二级缓存是关闭的,我们需要在配置文件中开启并进行相应的设置。二级缓存的工作原理是:当某次查询的结果被缓存后,后续相同查询可以直接从缓存中获取,无需再次执行SQL,从而提高了性能。 ...
分布式缓存技术在IT行业中扮演着至关重要的角色,尤其是在高并发、大数据量的Web应用程序中。Memcached是一款广泛使用的开源高性能分布式内存对象缓存系统,它能够减轻数据库的负载,提高应用程序的响应速度。在.NET...
9.5 应用级缓存示例 167 9.5.1 多级缓存API封装 167 9.5.2 NULL Cache 170 9.5.3 强制获取最新数据 170 9.5.4 失败统计 171 9.5.5 延迟报警 171 9.6 缓存使用模式实践 172 9.6.1 Cache-Aside 173 9.6.2 Cache-As-SoR...
在本项目中,"java抽奖系统后台 springboot+mybatis redis队列处理高并发.zip",我们可以探索几个关键的IT技术及其在构建高效抽奖系统中的应用。以下是对这些技术的详细说明: 1. **SpringBoot**: SpringBoot是...
### Coherence企业级缓存(三) 四种缓存类型 #### 1. Coherence简介 Coherence是一款由Oracle提供的高性能、可扩展的企业级内存数据网格解决方案。它能够为分布式应用提供一致性和高可用性服务,适用于各种复杂的...
分布式多级缓存实践是一种优化高并发环境下数据访问性能的重要技术。在现代互联网应用中,随着用户数量的增长和数据量的膨胀,单纯依赖数据库进行实时读写操作往往会导致性能瓶颈。为了解决这个问题,分布式多级缓存...
"BigCore大数据高并发开发框架"是一个专门为处理大规模并发数据处理和高效运算而设计的开源...通过深入研究和利用这个框架,开发者能够更快地构建出处理大数据和高并发场景的应用,从而在竞争激烈的IT行业中抢占先机。
在高并发环境下,SpringMVC通过DispatcherServlet进行请求分发,结合AOP(面向切面编程)实现事务管理,以及依赖注入提高代码可维护性。另外,Spring MVC支持异步处理,利用Servlet 3.0的AsyncContext实现非阻塞I/O...
例如,在高并发的用户查询场景中,使用缓存可以避免频繁访问数据库,提高系统性能。同时,对于经常访问但不常改变的数据,缓存也能极大地提高用户体验。 在实际项目中,我们还需要考虑缓存的配置,如缓存大小、过期...
优化包括系统级优化(如调整内核参数、优化I/O调度算法)、网络优化(如TCP缓冲区大小、超时设置)以及应用级优化(如减少数据库查询、缓存策略)。性能分析工具(如strace、gprof、perf)帮助定位瓶颈。 7. **...