1、OSCache
OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何java应用程序的普通的缓存解决方案。
OSCache有以下特点:
(1)缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。
永久缓存--缓存能随意的写入硬盘,因此答应昂贵的创建(eXPensive-to-create)数据来保持缓存,甚至能让应用重启。
(2)支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。
缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(假如默认性能不需要时)。
2、Java Caching System
JSC(Java Caching System)是一个用分布式的缓存系统,是基于服务器的java应用程序。它是通过提供治理各种动态缓存数据来加速动态web应用。
JCS和其他缓存系统一样,也是一个用于高速读取,低速写入的应用程序。
动态内容和报表系统能够获得更好的性能。
假如一个网站,有重复的网站结构,使用间歇性更新方式的数据库(而不是连续不断的更新数据库),被重复搜索出相同结果的,就能够通过执行缓存方式改进其性能和伸缩性。
3、EHCache
EHCache 是一个纯java的在进程中的缓存,它具有以下特性:快速,简单,为Hibernate2.1充当可插入的缓存,最小的依靠性,全面的文档和测试。
4、JCache
JCache是个开源程序,正在努力成为JSR-107开源规范,JSR-107规范已经很多年没改变了。这个版本仍然是构建在最初的功能定义上。
5、ShiftOne
ShiftOne Java Object Cache是一个执行一系列严格的对象缓存策略的Java lib,就像一个轻量级的配置缓存工作状态的框架。
6、SwarmCache
SwarmCache是一个简单且有效的分布式缓存,它使用ip multicast与同一个局域网的其他主机进
行通讯,是非凡为集群和数据驱动web应用程序而设计的。
SwarmCache能够让典型的读 *** 作大大超过写 *** 作的这类应用提供更好的性能支持。
SwarmCache使用JavaGroups来治理从属关系和分布式缓存的通讯。
扩展资料
Java中缓存存在的原因:
一 般情况下,一个网站,或者一个应用,它的一般形式是,浏览器请求应用服务器,应用服务器做一堆计算后再请求数据库,数据库收到请求后再作一堆计算后把数据 返回给应用服务器。
应用服务器再作一堆计算后把数据返回给浏览器,这个是一个标准流程。但是随着互连网的普及,上网的人越来越多,网上的信息量也越来越多。
数据库每秒中接受请求的次数也是有限的,如果利用有限的资源来提供尽可能大的吞吐量呢。一个办法:减少计算量,缩短请求流程(减少网络io或者硬盘io),这时候缓存就可以大展手脚了。
缓存的基本原理就是打破上图中所描绘的标准流程,在这个标准流程中,任何 一个环节都可以被切断.请求可以从缓存里取到数据直接返回。
一、Redis了解
1.1、Redis介绍:
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的 *** 作,而且这些 *** 作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 *** 作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis数据库完全在内存中,使用磁盘仅用于持久性。相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。Redis可以将数据复制到任意数量的从服务器。
1.2、Redis优点:
(1)异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
(2)支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
(3) *** 作都是原子性:所有Redis *** 作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
(4)多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。
1.3、Redis缺点:
(1)单线程
(2)耗内存
二、64位windows下Redis安装
Redis官方是不支持windows的,但是Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,下载地址:https://github.com/MSOpenTech/redis/releases。注意只支持64位哈。
小宝鸽是下载了Redis-x64-3.0.500.msi进行安装。安装过程中全部采取默认即可。
安装完成之后可能已经帮你开启了Redis对应的服务,博主的就是如此。查看资源管理如下,说明已经开启:
已经开启了对应服务的,我们让它保持,下面例子需要用到。如果没有开启的.,我们命令开启,进入Redis的安装目录(博主的是C:Program FilesRedis),然后如下命令开启:
redis-server redis.windows.conf
OK,下面我们进行实例。
三、详细实例
本工程采用的环境:Eclipse + maven + spring + junit
3.1、添加相关依赖(spring+junit+redis依赖),pom.xml:
4.0.0 com.luo redis_project 0.0.1-SNAPSHOT 3.2.8.RELEASE 4.10 org.springframework spring-core ${spring.version}org.springframework spring-webmvc ${spring.version}org.springframework spring-context ${spring.version}org.springframework spring-context-support ${spring.version}org.springframework spring-aop ${spring.version}org.springframework spring-aspects ${spring.version}org.springframework spring-tx ${spring.version}org.springframework spring-jdbc ${spring.version}org.springframework spring-web ${spring.version}junit junit ${junit.version} testorg.springframework spring-test ${spring.version} testorg.springframework.data spring-data-redis 1.6.1.RELEASEredis.clients jedis 2.7.3
3.2、spring配置文件application.xml:
<"1.0" encoding="UTF-8"> classpath:properties/*.properties
3.3、Redis配置参数,redis.properties:
#redis中心#绑定的主机地址redis.host=127.0.0.1#指定Redis监听端口,默认端口为6379redis.port=6379#授权密码(本例子没有使用)redis.password=123456 #最大空闲数:空闲链接数大于maxIdle时,将进行回收redis.maxIdle=100 #最大连接数:能够同时建立的“最大链接个数”redis.maxActive=300 #最大等待时间:单位msredis.maxWait=1000 #使用连接时,检测连接是否成功 redis.testOnBorrow=true#当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能redis.timeout=10000
3.4、添加接口及对应实现RedisTestService.Java和RedisTestServiceImpl.java:
package com.luo.servicepublic interface RedisTestService { public String getTimestamp(String param)}
package com.luo.service.implimport org.springframework.stereotype.Serviceimport com.luo.service.RedisTestService@Servicepublic class RedisTestServiceImpl implements RedisTestService { public String getTimestamp(String param) { Long timestamp = System.currentTimeMillis()return timestamp.toString()} }
3.5、本例采用spring aop切面方式进行缓存,配置已在上面spring配置文件中,对应实现为MethodCacheInterceptor.java:
package com.luo.redis.cacheimport java.io.Serializableimport java.util.concurrent.TimeUnitimport org.aopalliance.intercept.MethodInterceptorimport org.aopalliance.intercept.MethodInvocationimport org.springframework.data.redis.core.RedisTemplateimport org.springframework.data.redis.core.ValueOperationspublic class MethodCacheInterceptor implements MethodInterceptor { private RedisTemplate redisTemplateprivate Long defaultCacheExpireTime = 10l// 缓存默认的过期时间,这里设置了10秒 public Object invoke(MethodInvocation invocation) throws Throwable { Object value = nullString targetName = invocation.getThis().getClass().getName()String methodName = invocation.getMethod().getName()Object[] arguments = invocation.getArguments()String key = getCacheKey(targetName, methodName, arguments)try { // 判断是否有缓存 if (exists(key)) { return getCache(key)} // 写入缓存 value = invocation.proceed()if (value != null) { final String tkey = keyfinal Object tvalue = valuenew Thread(new Runnable() { public void run() { setCache(tkey, tvalue, defaultCacheExpireTime)} }).start()} } catch (Exception e) { e.printStackTrace()if (value == null) { return invocation.proceed()} } return value} /** * 创建缓存key * * @param targetName * @param methodName * @param arguments */ private String getCacheKey(String targetName, String methodName, Object[] arguments) { StringBuffer sbu = new StringBuffer()sbu.append(targetName).append("_").append(methodName)if ((arguments != null) &&(arguments.length != 0)) { for (int i = 0i <arguments.lengthi++) { sbu.append("_").append(arguments[i])} } return sbu.toString()} /** * 判断缓存中是否有对应的value * * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key)} /** * 读取缓存 * * @param key * @return */ public Object getCache(final String key) { Object result = nullValueOperations operations = redisTemplate .opsForValue()result = operations.get(key)return result} /** * 写入缓存 * * @param key * @param value * @return */ public boolean setCache(final String key, Object value, Long expireTime) { boolean result = falsetry { ValueOperations operations = redisTemplate .opsForValue()operations.set(key, value)redisTemplate.expire(key, expireTime, TimeUnit.SECONDS)result = true} catch (Exception e) { e.printStackTrace()} return result} public void setRedisTemplate( RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate}}
3.6、单元测试相关类:
package com.luo.baseTestimport org.junit.runner.RunWithimport org.springframework.test.context.ContextConfigurationimport org.springframework.test.context.junit4.AbstractJUnit4SpringContextTestsimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner//指定bean注入的配置文件 @ContextConfiguration(locations = { "classpath:application.xml" }) //使用标准的JUnit @RunWith注释来告诉JUnit使用Spring TestRunner @RunWith(SpringJUnit4ClassRunner.class) public class SpringTestCase extends AbstractJUnit4SpringContextTests { }
package com.luo.serviceimport org.junit.Testimport org.springframework.beans.factory.annotation.Autowiredimport com.luo.baseTest.SpringTestCasepublic class RedisTestServiceTest extends SpringTestCase { @Autowired private RedisTestService redisTestService@Test public void getTimestampTest() throws InterruptedException{ System.out.println("第一次调用:" + redisTestService.getTimestamp("param"))Thread.sleep(2000)System.out.println("2秒之后调用:" + redisTestService.getTimestamp("param"))Thread.sleep(11000)System.out.println("再过11秒之后调用:" + redisTestService.getTimestamp("param"))} }
3.7、运行结果:
四、源码下载:redis-project().rar
以上就是本文的全部内容,希望对大家的学习有所帮助。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)