【高并发】在高并发环境下该若何构建应用级缓存?

写在前面

随着我们的系统负载越来越高,系统的性能就会有所下降,此时,我们可以很自然地想到使用缓存来解决数据读写性能低下的问题。然则,立志成为资深架构师的你,是否能够在高并发环境下合理而且高效的构建应用级缓存呢?

缓存命中率

缓存命中率是从缓存中读取数据的次数与总读取次数的比率,命中率越高越好。缓存命中率=从缓存中读取次数 / (总读取次数 (从缓存中读取次数 + 从慢速装备上读取次数))。这是一个非常重要的监控指标,若是做缓存,则应通过监控这个指标来看缓存是否事情优越。

缓存接纳计谋

1.基于空间

基于空间指缓存设置了存储空间,如设置为10MB,当到达存储空间上限时,根据一定的计谋移除数据。

2.基于容量

基于容量指缓存设置了最大巨细,当缓存的条目跨越最大巨细时,根据一定的计谋移除旧数据。

3.基于时间

TTL(Time To Live):存活期,即缓存数据从建立最先直到到期的一个时间段(不管在这个时间段内有没有被接见,缓存数据都将过时)。
TTI(Time To Idle):空闲期,即缓存数据多久没被接见后移除缓存的时间。

4.基于工具引用

软引用:若是一个工具是软引用,则当JVM堆内存不足时,垃圾接纳器可以接纳这些工具。软引用适合用来做缓存,从而当JVM堆内存不足时,可以接纳这些工具腾出一些空间供强引用工具使用,从而制止OOM。
弱引用:当垃圾接纳器接纳内存时,若是发现弱引用,则将它立刻接纳。相对于软引用,弱引用有更短的生命周期。

C# 基础知识系列- 9 字符串的更多用法(一)

注重:只有在没有其他强引用工具引用弱引用/软引用工具时,垃圾接纳时才接纳该引用。即若是有一个工具(不是弱引用/软引用工具)引用了弱引用/软引用工具,那么垃圾接纳时不会接纳该弱引用/软引用工具。

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实现。

缓存模式

单机模式: 存储最热的数据到堆缓存,相对热的数据到堆外缓存,不热的数据到磁盘缓存。
集群模式: 存储最热的数据到堆缓存,相对热的数据到对外缓存,全量数据到分布式缓存。

写在最后

若是以为文章对你有点辅助,请微信搜索并关注「 冰河手艺 」微信民众号,跟冰河学习高并发编程手艺。

最后,附上并发编程需要掌握的焦点技术知识图,祝人人在学习并发编程时,少走弯路。
【高并发】在高并发环境下该若何构建应用级缓存?

原创文章,作者:28x29新闻网,如若转载,请注明出处:https://www.28x29.com/archives/4690.html