【缓存】Ehcache与Redis比较

  • Post author:
  • Post category:其他


一、分布式与集群是什么 ? 区别是什么?


集群:多个人在一起作同样的事 。


分布式 :多个人在一起作不同的事 。


将一套系统拆分成不同子系统部署在不同服务器上(这叫分布式),然后部署多个相同的子系统在不同的服务器上(这叫集群),部署在不同服务器上的同一个子系统应做负载均衡。


分布式:一个业务拆分为多个子业务,部署在多个服务器上 。


集群:同一个业务,部署在多个服务器上 。

二、Ehcache与Redis比较

1. Ehcache简介

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现。它支持注解方式使用缓存,非常方便。

Ehcache的特点:

快速

简单

多种缓存策略

缓存数据有两级:内存和磁盘,因此无需担心容量问题

缓存数据会在虚拟机重启的过程中写入磁盘

可以通过RMI、可插入API等方式进行分布式缓存

具有缓存和缓存管理器的侦听接口

支持多缓存管理器实例,以及一个实例的多个缓存区域

提供Hibernate的缓存实现

2.Redis简介

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

Redis是一个key-value存储系统。它支持存储的value类型很多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。Redis将数据都是缓存在内存中。Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis的特点:

1、速度快

Redis是用C语言实现的; Redis的所有数据存储在内存中。

2、持久化

Redis的所有数据存储在内存中,对数据的更新将异步地保存到磁盘上。

3、支持多种数据结构

Redis支持五种数据结构:String、List、Set、Hash、Zset

4、支持多种编程语言

Java、php、Python、Ruby、Lua、Node.js

5、功能丰富

除了支持五种数据结构之外,还支持事务、流水线、发布/订阅、消息队列等功能。

6、源码简单

约23000行C语言源代码。

7、主从复制

主服务器(master)执行添加、修改、删除,从服务器执行查询。

8、高可用及分布式

Redis-Sentinel(v2.8)支持高可用 。Redis-Cluster(v3.0)支持分布式

3. Ehcache 和 Redis 比较


三、ehcache,redis,db的性能、一致性比较

1、DB:

一致性:db无论是单实例还是主从复制的多实例集群,都可以看成是基本一致的;

性能:受限于磁盘性能、存储形式,性能最差;

2、Redis(分布式缓存):

一致性:由于是db的缓存,内容可能与db不一致,需要容忍不一致性;但所有应用服务器在同一时间,读到的数据都是一样的;

性能:较好,get大约在5ms的速度;

3、ehcache(本地缓存):

一致性:由于是保存在JVM中,每台机器数据都可能不一样,一致性较差;

性能:最好,由于是直接读取内存数据,性能可以保证,大约在0.5ms的性能级别。

四、如何使用?

够简单就是Ehcache的一大特色,自然用起来just so easy!

集成使用(Spring项目):

a.加入ehcache-core-2.6.5.jar和mybatis-ehcache-1.0.2.jar

b.整合ehcache:



配置mapper中cache中的type为ehcache对cache接口的实现类型

SqlMapConfig.xml:

<!– 开启二级缓存 –>

<setting name=”cacheEnabled” value=”true”/>


UserMapper.xml:



<mapper namespace=”cn.itcast.mybatis.mapper.UserMapper”>

<!– 开启本mapper的namespace下的二缓存

type:指定cache接口的实现类的类型,mybatis默认使用PerpetualCache

要和ehcache整合,需要配置type为ehcache实现cache接口的类型

–>

<cache type=”org.mybatis.caches.ehcache.EhcacheCache”/>

在classpath下配置ehcache.xml

<ehcache xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:noNamespaceSchemaLocation=”../config/ehcache.xsd”>

<diskStore path=”F:\develop\ehcache” />

<defaultCache

maxElementsInMemory=”1000″

maxElementsOnDisk=”10000000″

eternal=”false”

overflowToDisk=”false”

timeToIdleSeconds=”120″

timeToLiveSeconds=”120″

diskExpiryThreadIntervalSeconds=”120″

memoryStoreEvictionPolicy=”LRU”>

</defaultCache>

</ehcache>

代码中有个ehcache.xml文件,现在来介绍一下这个文件中的一些属性
  1. name:缓存名称。
  2. maxElementsInMemory:缓存最大个数。
  3. eternal:对象是否永久有效,一但设置了,timeout将不起作用。
  4. timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
  5. timeToLiveSeconds:设置对象在失效前允许存活时间,最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时 间无穷大。
  6. overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
  7. diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
  8. maxElementsOnDisk:硬盘最大缓存个数。
  9. diskPersistent:是否缓存数据在

    虚拟机

    重启的过程中写入磁盘据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
  10. diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
  11. memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU。你可以设置为 FIFO或是LFU。
  12. clearOnFlush:内存数量最大时是否清除。

Ehcache缓存的使用

https://blog.csdn.net/shuaicihai/article/details/60133479

参考博客:

大白话解说,半分钟就懂 — 分布式与集群是什么 ? 区别是什么?

https://blog.csdn.net/jiangyu1013/article/details/80417961

Ehcache与Redis比较:

https://blog.csdn.net/ShiXueTanLang/article/details/79596198



版权声明:本文为qq_31881469原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。