ehcache、memcache、redis三种缓存的比较

Ehcache
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。
优点:快速
简单
缓存数据有两级:内存和磁盘,因此无需担心容量问题
缓存数据会在虚拟机重启的过程中写入磁盘
可以通过RMI、可插入API等方式进行分布式缓存
具有缓存和缓存管理器的侦听接口
支持多缓存管理器实例,以及一个实例的多个缓存区域
提供Hibernate的缓存实现
多种缓存策略,Ehcache提供了对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多

缺点:
使用磁盘Cache的时候非常占用磁盘空间;
不能保证数据的安全

参数配置:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 系统缓存 -->
<cache name="sysCache" maxElementsInMemory="1000" eternal="true" overflowToDisk="true"/>

<!--   
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。  
maxElementsInMemory:缓存中允许创建的最大对象数  
overflowToDisk:内存不足时,是否启用磁盘缓存。  
timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,  
        两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,  
 如果该值是 0 就意味着元素可以停顿无穷长的时间。  
timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,  
       这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。  
memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。  
1 FIFO,先进先出  
2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。  
3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。  
-->  
<cache name="shiro-activeSessionCache"  
       maxElementsInMemory="1000"  
       overflowToDisk="true"  
       timeToLiveSeconds="0"  
       timeToIdleSeconds="0"  
       diskPersistent="true"  
       diskExpiryThreadIntervalSeconds="600"/>  

EhCache的分布式缓存有传统的RMI,1.5版的JGroups,1.6版的JMS。

<?xml version="1.0" encoding="UTF-8"?>
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
    properties="peerDiscovery=automatic,multicastGroupAddress=230.0.0.1, multicastGroupPort=4446" />
<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" />

<!-- 默认缓存配置. -->
<defaultCache maxEntriesLocalHeap="100" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"
    overflowToDisk="true" maxEntriesLocalDisk="100000" >
    <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
        properties="replicatePuts=false,replicateUpdatesViaCopy=false"/>
</defaultCache>

<!-- 系统缓存 -->
<cache name="sysCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true">
    <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
</cache>

<!-- 系统活动会话缓存 -->
<cache name="shiro-activeSessionCache" maxEntriesLocalHeap="10000" overflowToDisk="true"
        eternal="true" timeToLiveSeconds="0" timeToIdleSeconds="0"
        diskPersistent="true" diskExpiryThreadIntervalSeconds="600">
    <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
        properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true,
            replicateUpdatesViaCopy=false, replicateRemovals=true "/>
</cache>

当缓存改变时,ehcache会向230.0.0.1端口4446发RMI UDP组播包。

分布式缓存不建议使用ehcache, 建议使用redis或Memcache

2.memcache
memcache 是一种高性能、分布式对象缓存系统,最初设计于缓解动态网站数据库加载数据的延迟性,你可以把它想象成一个大的内存HashTable,就是一个key-value键值缓存。

memcache C语言所编写,依赖于最近版本的GCC和libevent。多线程支持
优点:
一.部分容灾
假设只用一台memcache,如果这台memcache服务器挂掉了,那么请求将不断的冲击数据库,这样有可能搞死数据库,从而引发”雪崩“。如果使用多台memcache服务器,由于memcache使用一致性哈希算法,万一其中一台挂掉了,部分请求还是可以在memcache中命中,为修复系统赢得一些时间。
二.容量问题
一台memcache服务器的容量毕竟有限,可以使用多台memcache服务器,增加缓存容量。
三.均衡请求
使用多台memcache服务器,可以均衡请求,避免所有请求都冲进一台memcache服务器,导致服务器挂掉。
四.利用memcache分布式特性
使用一台memcache服务器,并没有利用memcache的数据分布式特性。

缺点:
1.不能持久化存储
2.存储数据有限制:1M 【大于1M,认为就行分割】(内存碎片)
3.mm存储数据只能key-value
4.集群数据没有复制和同步机制 【崩溃不会影响程序,会从数据库中取数据】
5.内存回收不能及时 LRU(算法):未使用内存》过期内存》最近最少使用内存 这是惰性删除

3、redis
单线程、读写性能优异、支持数据持久化,支持AOF和RDB两种持久化方式、支持主从复制,主机会自动将数据同步到从机,可以进行读写分离;数据结构丰富:除了支持string类型的value外还支持string、hash、set、sortedset、list等数据结构。

缺点:
1 Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
2 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
3 Redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。
4 Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。
如果是单个应用或者对缓存访问要求很高的应用,用ehcache。
如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

猜你喜欢

转载自blog.csdn.net/zhanglinlove/article/details/83926477