一、數據使用方式
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支持海量數據存儲,實現了數據的高可用與負載均衡。
原創文章,作者:FVHIZ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/334799.html