以前用过redis 和 memcache ,没有ehcache 的开发经验,最近也查阅很多文档和博客,写一些总结,也有很多内容总结与诸多博客中的博主总结:前端
Ehcachejava
EhCache 是一个纯Java的进程内缓存框架,具备快速、精干等特色,是Hibernate中默认的CacheProvider,因此被用于大型复杂分布式web application的各个节点中。Ehcache是一种普遍使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具备内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特色。linux
主要的特性有:c++
1. 快速web
Ehcache的发行有一段时长了,通过几年的努力和不可胜数的性能测试,Ehcache终被设计于large, high concurrency systems.redis
2. 简单算法
开发者提供的接口很是简单明了,从Ehcache的搭建到运用运行仅仅须要的是你宝贵的几分钟。其实不少开发者都不知道本身用在用Ehcache,Ehcache被普遍的运用于其余的开源项目数据库
好比:hibernate后端
3.够轻量api
核心程序仅仅依赖slf4j这一个包,没有之一!通常Ehcache的发布版本不会到2M,V 2.2.3 才 668KB。
4.多种缓存策略
Ehcache提供了对大数据的内存和硬盘的存储,缓存数据会在虚拟机重启的过程当中写入磁盘。最近版本容许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多
5.具备缓存和缓存管理器的侦听接口
缓存管理器监听器 (CacheManagerListener)和 缓存监听器(CacheEvenListener),作一些统计或数据一致性广播挺好用的
6.能够经过RMI、可插入API等方式进行分布式缓存;
如何使用?
够简单就是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下的二缓存 |
在classpath下配置ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
代码中有个ehcache.xml文件,如今来介绍一下这个文件中的一些属性
memcache :
memcache是一套分布式的高速缓存系统
经过在内存里维护一个统一的巨大的hash表,它可以用来存储各类格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,而后从内存中读取,从而大大提升读取速度。
MemCache的工做机制:
先检查客户端的请求数据是否在memcached中,若有,直接把请求数据返回,再也不对数据库进行任何操做;若是请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,须要程序明确实现);每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完以后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,而后再替换掉最近未使用的数据
Memcached是以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的链接和操做.
Memcached使用:
memcache C语言所编写,依赖于最新版本的GCC和libevent。
安装使用:(下载memcached和libevent),自定义安装目录:/usr/local/memcached
#mkdir /usr/local/memcached #cd /usr/local/memcached 使用以下命令下载,需联网: # wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz # wget http://www.monkey.org/~provos/libevent-1.2.tar.gz 经过ls查看是否下载完成,下载完成会有两个包:libevent-1.2.tar.gz和memcached-1.2.0.tar.gz 先安装libevent(确认已安装GCC,如未安装就先安装GCC) # tar zxvf libevent-1.2.tar.gz # cd libevent-1.2 # ./configure -prefix=/usr # make (若是遇到提示gcc 没有安装则先安装gcc) # make install 测试libevent是否安装成功: lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3 -rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3 -rw-r-r- 1 root root 454156 11?? 12 17:38 libevent.a -rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3 安装成功 |
安装memcached,同时须要安装中指定libevent的安装位置: # cd /tmp # tar zxvf memcached-1.2.0.tar.gz # cd memcached-1.2.0 # ./configure -with-libevent=/usr # make # make install 若是中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增长相应的库或者路径。 安装完成后会把memcached放到 /usr/local/bin/memcached , 测试是否成功安装memcached: # ls -al /usr/local/bin/mem* -rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached -rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug |
启动Memcached服务: 1.启动Memcache的服务器端: # /usr/local/bin/memcached -d -m 8096 -u root -l 192.168.77.105 -p 12000 -c 256 -P /tmp/memcached.pid -d选项是启动一个守护进程, -m是分配给Memcache使用的内存数量,单位是MB,我这里是8096MB, -u是运行Memcache的用户,我这里是root, -l是监听的服务器IP地址,若是有多个地址的话,我这里指定了服务器的IP地址192.168.77.105, -p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口, -c选项是最大运行的并发链接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定, -P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,
2.若是要结束Memcache进程,执行: # cat /tmp/memcached.pid 或者 ps -aux | grep memcache (找到对应的进程id号) # kill 进程id号 也能够启动多个守护进程,不过端口不能重复。 memcache 的链接 telnet ip port 注意链接以前须要再memcache服务端把memcache的防火墙规则加上 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT 从新加载防火墙规则 service iptables restart OK ,如今应该就能够连上memcache了 在客户端输入stats 查看memcache的状态信息
|
pid memcache服务器的进程ID uptime 服务器已经运行的秒数 time 服务器当前的unix时间戳 version memcache版本 pointer_size 当前操做系统的指针大小(32位系统通常是32bit) rusage_user 进程的累计用户时间 rusage_system 进程的累计系统时间 curr_items 服务器当前存储的items数量 total_items 从服务器启动之后存储的items总数量 bytes 当前服务器存储items占用的字节数 curr_connections 当前打开着的链接数 total_connections 从服务器启动之后曾经打开过的链接数 connection_structures 服务器分配的链接构造数 cmd_get get命令 (获取)总请求次数 cmd_set set命令 (保存)总请求次数 get_hits 总命中次数 get_misses 总未命中次数 evictions 为获取空闲内存而删除的items数(分配给memcache的空间用满后须要删除旧的items来获得空间分配给新的items) bytes_read 读取字节数(请求字节数) bytes_written 总发送字节数(结果字节数) limit_maxbytes 分配给memcache的内存大小(字节) threads 当前线程数 |
1.1. 什么是redisRedis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它经过提供多种键值数据类型来适应不一样场景下的存储需求,目前为止Redis支持的键值数据类型如下: 字符串类型 散列类型 列表类型 集合类型 有序集合类型。 2.2. redis的应用场景缓存(数据查询、短链接、新闻内容、商品内容等等)。(最多使用) 分布式集群架构中的session分离。 聊天室的在线好友列表。 任务队列。(秒杀、抢购、12306等等) 应用排行榜。 网站访问统计。 数据过时处理(能够精确到毫秒) |
1.1. Redis的安装 redis是C语言开发,建议在linux上运行,本此使用Centos6.4做为安装环境。安装redis须要先将官网下载的源码进行编译,编译依赖gcc环境,若是没有gcc环境; 须要安装gcc:yum install gcc-c++ 从官网下载 http://download.redis.io/releases/redis-3.0.0.tar.gz 将redis-3.0.0.tar.gz拷贝到/usr/local下 解压源码 #tar -zxvf redis-3.0.0.tar.gz 进入解压后的目录进行编译 #cd /usr/local/redis-3.0.0 #make 安装到指定目录,如 /usr/local/redis #cd /usr/local/redis-3.0.0 #make PREFIX=/usr/local/redis install redis.conf redis.conf是redis的配置文件,redis.conf在redis源码目录。 注意修改port做为redis进程的端口,port默认6379。 拷贝配置文件到安装目录下 进入源码目录,里面有一份配置文件 redis.conf,而后将其拷贝到安装路径下
#cd /usr/local/redis
#mkdir conf
#cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin
安装目录bin下的文件夹列表 redis3.0新增的redis-sentinel是redis集群管理工具可实现高可用 |
1.1. redis启动1.1.1. 前端模式启动 直接运行bin/redis-server将之前端模式启动,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法。以下图: 1.1.2. 后端模式启动修改redis.conf配置文件, daemonize yes 之后端模式启动。 执行以下命令启动redis: cd /usr/local/redis ./bin/redis-server ./redis.conf redis默认使用6379端口。 |
1.1. 经过jedis链接redis单机1.1.1. jar包若是是经过maven管理的项目,则在pom.xml文件中添加pom.xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.0</version> </dependency> 若是不是maven管理。手动添加jia包 (commons-pool2-2-.3.jar和jedis-2.7.0.jar) 经过建立单实例jedis对象链接redis服务,以下代码
// 单实例链接redis
@Test
public void testJedisSingle() {
Jedis jedis = new Jedis("192.168.101.3", 6379);
jedis.set("name", "bar");
String name = jedis.get("name");
System.out.println(name);
jedis.close();
}
使用链接池链接
经过单实例链接redis不能对redis链接进行共享,可使用链接池对redis链接进行共享,提升资源利用率,使用jedisPool链接redis服务,以下代码:
@Test
public void pool() {
JedisPoolConfig config = new JedisPoolConfig();
//最大链接数
config.setMaxTotal(30);
//最大链接空闲数
config.setMaxIdle(2);
JedisPool pool = new JedisPool(config, "192.168.101.3", 6379);
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(jedis != null){
//关闭链接
jedis.close();
}
}
} |