设为首页 收藏本站
查看: 802|回复: 0

[经验分享] ehcache memcache redis 区别

[复制链接]

尚未签到

发表于 2017-12-20 21:58:23 | 显示全部楼层 |阅读模式
  之前用过redismemcache ,没有ehcache 的开发经验,最近也查阅不少文档和博客,写一些总结,也有不少内容总结与诸多博客中的博主总结:
  Ehcache
  EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider,所以被用于大型复杂分布式web application的各个节点中。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。
  主要的特性有:
  1.  快速
  Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems.
  2. 简单
  开发者提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目
  比如:hibernate
  3.够轻量
  核心程序仅仅依赖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下的二缓存
  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文件,现在来介绍一下这个文件中的一些属性  


  •        name:缓存名称。
  •        maxElementsInMemory:缓存最大个数。
  •        eternal:对象是否永久有效,一但设置了,timeout将不起作用。
  •        timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
  •        timeToLiveSeconds:设置对象在失效前允许存活时间,最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时 间无穷大。
  •        overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
  •        diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
  •        maxElementsOnDisk:硬盘最大缓存个数。
  •        diskPersistent:是否缓存数据在虚拟机重启的过程中写入磁盘据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
  •        diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
  •        memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU。你可以设置为 FIFO或是LFU。
  •        clearOnFlush:内存数量最大时是否清除。
  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的状态信息
DSC0000.jpg

  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         当前线程数

redis:

1.1. 什么是redis
  Redis是用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下的文件夹列表
DSC0001.png

DSC0002.png

  redis3.0新增的redis-sentinel是redis集群管理工具可实现高可用

1.1. redis启动
  1.1.1. 前端模式启动
  直接运行bin/redis-server将以前端模式启动,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法。如下图:
DSC0003.png


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();
  }
  }
  }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426238-1-1.html 上篇帖子: spring + redis 实现数据的缓存 下篇帖子: spring-data
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表