内存缓存之HashMap、EHCache、Guava Cache对比

栏目: 数据库 · 发布时间: 5年前

内容简介:缓存不应该被过度使用,在不同场景下,选用不同的方式缓存数据。简单场景,存入一些占用内存不多的数据,而且这些数据不会主动发生变化,服务器启动后就永久存储,修改和删除都是全手动执行。而且服务器重启时不需要再自动恢复到之前的状态。这种数据直接用Map等放到内存中即可。而一个标准Cache的主要特征有:

缓存不应该被过度使用,在不同场景下,选用不同的方式缓存数据。

简单场景,存入一些占用内存不多的数据,而且这些数据不会主动发生变化,服务器启动后就永久存储,修改和删除都是全手动执行。而且服务器重启时不需要再自动恢复到之前的状态。这种数据直接用Map等放到内存中即可。

而一个标准Cache的主要特征有:

  • 过期时间

  • 容量规划(重要)

  • 清除策略(重要)

  • 命中率统计

其中,常见的清除策略、淘汰机制(Eviction policy)有:

  • FIFO(First In First Out):先进先出算法,即先放入缓存的先被移除;

  • LRU(Least Recently Used):最久未使用算法,使用时间距离现在最久的那个被移除;

  • LFU(Least Frequently Used):最近最少使用算法,一定时间段内使用次数(频率)最少的那个被移除;

其中,过期时间包括:

  • TTL(Time To Live):存活期,即从缓存中创建时间点开始直到它到期的一个时间段(不管在这个时间段内有没有访问都将过期)

  • TTI(Time To Idle):空闲期,即一个数据多久没被访问将从缓存中移除的时间。

基于以上特征,使用HashMap作为本地cache似乎很不适当。某些场景下面,倒是可以用JDK自带的WeakHashMap。

通过简单的包装,就可以为你的HashMap增加过期时间和容量规划。而且比其他cache更高效。openfire的DefaultCache就是一个很好的例子:

DefaultCache.java

DefaultCache的核心是HashMap,另外增加了一层很薄的包装来实现过期和LRU。DefaultCache包括两个LinkedList,一个用于存储插入顺序,另一个用于存储插入时间。当cache size达到临界值时,从最尾部删除。有朋友测试过,比ehcache快5倍。

如果本地cache不能满足你的要求,ehcache是个很好的选择。不仅仅作为分布式的cache,甚至作为状态同步,ehcache都有非常优秀的案例。也可以实现多机copy。分享一个数据:某生产系统中ehcache每天处理17,466,415次replication。

不过,也听说ehcache代码写得很复杂,设计有些问题,相比之下 Google的Guava Cache就要轻量得多,但是只支持内存缓存。

Guava Cache与ConcurrentMap很相似。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。

通常来说,Guava Cache适用于:

  • 你愿意消耗一些内存空间来提升速度。

  • 你预料到某些键会被查询一次以上。

  • 缓存中存放的数据总量不大,不会超出内存容量。(否则,请尝试EHCache、 Memcached 这类工具)

如果你的场景符合上述的每一条,Guava Cache就适合你。

Ehcache使用的注意点:

1、比较少的更新数据表的情况

2、对并发要求不是很严格的情况

3、多台应用服务器中的缓存是不能进行实时同步的。

4、对一致性要求不高的情况下

ehcache支持集群,但因为Ehcache本地缓存的特性(属于 分散式缓存 ),目前无法很好的解决不同服务器间缓存同步的一致性问题,所以我们在一致性要求非常高的场合下,尽量使用 Redis 、Memcached等 集中式缓存

Ehcache has a lot more features than a Map:

  • limit the maximum number of elements in memory

  • overflow to disk (if the above number is exceeded)

  • set a time-to-live and time-to-idle for elements

  • allows replication within a cluster

If you don't need any of those, you can safely use a Map - it will be easier to configure.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

MATLAB数值计算

MATLAB数值计算

莫勒 / 喻文健 / 机械工业出版社 / 2006-6 / 35.00元

《MATLAB数值计算》是关于数值方法、MATLAB软件和工程计算的教材,着重介绍数学软件的熟练使用及其内在的高效率算法。主要内容包括:MATLAB介绍、线性方程组、插值、方程求根、最小二乘法、数值积分、常微分方程、傅里叶分析、随机数、特征值与奇异值、偏微分方程。《MATLAB数值计算》配备大量MATLAB例子源代码及习题,其中涉及密码学、Google网页分级、大气科学和图像处理等前沿问题,可以帮......一起来看看 《MATLAB数值计算》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具