一、数据使用方式
1、ehcache:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.6</version>
</dependency>
ehcache是一个开源的Java缓存框架,它是一个纯Java的进程内缓存,缓存数据存储在JVM堆内存中。在数据量较小, 不需要支持数据持久化的情况下,使用ehcache是个不错的选择。
2、redis:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.8.0</version>
</dependency>
redis是一个开源的KV存储系统,提供网络中的双向交互。redis支持多种数据类型(String、List、Set、Hash等),并提供API实现数据的存储和存取。redis是跨应用、跨语言的缓存方案。
二、性能表现
1、ehcache:
缓存数据存储在JVM堆内存中,虽然缓存速度快,但是有容量上的限制。
2、redis:
redis 缓存底层通过内存I/O直接访问内存,支持分布式架构,可以实现多节点的负载均衡和容错。由于redis 是单线程的,天生保证了线程安全和数据一致性,相比于ehcache 更加适合大型分布式系统使用。
三、数据持久化
1、ehcache:
ehcache的数据默认情况下只缓存在内存中,不支持持久化,数据在JVM进程关闭时消失。
public class EhcacheTest {
private CacheManager cacheManager;
@Before
public void init() {
cacheManager = CacheManager.create("src/test/resources/ehcache.xml");
}
@Test
public void testPutAndGet() {
Cache cache = cacheManager.getCache("testCache");
Element element = new Element("key1", "value1");
cache.put(element);
Element value = cache.get("key1");
assertEquals("value1", value.getObjectValue());
}
}
2、redis:
redis 的缓存可以支持 RDB 和 AOF 两种方式进行持久化。RDB:将Redis在指定时间间隔内数据存储在磁盘上;AOF:在操作命令发出时对于每一个写操作都进行日志记录。
public class RedisTest {
private static Jedis jedis;
@BeforeClass
public static void init() {
jedis = new Jedis("localhost", 6379);
}
@Test
public void testPutAndGet() {
jedis.set("key1", "value1");
String value = jedis.get("key1");
assertEquals("value1", value);
}
}
四、数据支持类型
1、ehcache:
ehcache支持基本数据类型、自定义Java对象,如POJO、List、Map等。
2、redis:
redis支持多种数据类型,包括:String、List、Set、Hash等。
五、应用场景
1、ehcache:
适合小型应用,数据存储量不大,对于负载均衡要求不高。
2、redis:
适合大型、高并发、分布式系统,需要支持多节点数据同步及容错。
六、总结
ehcache和redis两者在缓存技术的实现上存在迥异,ehcache更适合数据量较小的单机应用,而redis支持海量数据存储,实现了数据的高可用与负载均衡。