Java 配置Memcached应用详解


本文将对在 Java 环境下 Memcached 应用进行详细介绍。Memcached 主要是集群环境下 的缓存解决方案,可以运行在 Java 或者.NET 平台上,这里我们主要讲的是 Windows 下的 Memcached 应用。 这些天在设计 SNA 的架构,接触了一些远程缓存、集群、session 复制等的东西,以前 做企业应用的时候感觉作用不大,现在设计面对 internet 的系统架构时就非常有用了,而 且在调试后看到压力测试的情况还是比较好的。 在缓存的选择上有过很多的思考,虽然说 memcached 结合 java 在序列化上性能不怎么 样,不过也没有更好的集群环境下的缓存解决方案了,就选择了 memcached。本来计划等公 司买的服务器到位装个 linux 再来研究 memcached,但这两天在找到了一个 windows 下的 Memcached 版本,就动手开始调整现有的框架了。 Windows 下的 Server 端很简单,不用安装,双击运行后默认服务端口是 11211,没 有试 着去更改端口,因为反正以后会用 Unix 版本,到时再记录安装步骤。下载客户端的 JavaAPI 包,接口非常简单,参考 API 手册上就有现成的例子。 目标,对旧框架缓存部分进行改造: 1、缓存工具类 2、hibernate 的 provider 3、用缓存实现 session 机制 今天先研究研究缓存工具类的改造,在旧框架中部分函数用了 ehcache 对执行结果进行 了缓存处理,现在目标是提供一个缓存工具类,在配置文件中配置使用哪种缓存(memcached 或 ehcached),使其它程序对具体的缓存不依赖,同时使用 AOP 方式来对方法执行结果进 行缓存。 首先是工具类的实现: 在 Spring 中配置 Java 代码 1. 2. 4. 5. classpath:ehcache.xmlvalue> 6. property> 7. bean> 8. 9. 11. 12. 14. bean> 15. 16. 18. 19. 20. 21. 22. bean> 23. 在 properties 文件中配置${cache.servers} ${cache.cacheServerWeights} ${cache.cluster} 具体工具类的代码 Java 代码 1. /** 2. * @author Marc 3. * 4. */ 5. public class CacheService { 6. private Log logger = LogFactory.getLog(getClass()); 7. private Cache localCache; 8. String cacheServerList; 9. String cacheServerWeights; 10. boolean cacheCluster = false; 11. int initialConnections = 10; 12. int minSpareConnections = 5; 13. int maxSpareConnections = 50; 14. long maxIdleTime = 1000 * 60 * 30; // 30 minutes 15. long maxBusyTime = 1000 * 60 * 5; // 5 minutes 16. long maintThreadSleep = 1000 * 5; // 5 seconds 17. int socketTimeOut = 1000 * 3; // 3 seconds to block on reads 18. int socketConnectTO = 1000 * 3; // 3 seconds to block on initial 19. // connections. If 0, then will use blocking 20. // connect (default) 21. boolean failover = false; // turn off auto-failover in event of serve r 22. // down 23. boolean nagleAlg = false; // turn off Nagle's algorithm on all socket s in 24. // pool 25. MemCachedClient mc; 26. public CacheService(){ 27. mc = new MemCachedClient(); 28. mc.setCompressEnable(false); 29. } 30. /** 31. * 放入 32. * 33. */ 34. public void put(String key, Object obj) { 35. Assert.hasText(key); 36. Assert.notNull(obj); 37. Assert.notNull(localCache); 38. if (this.cacheCluster) { 39. mc.set(key, obj); 40. } else { 41. Element element = new Element(key, (Serializable) obj); 42. localCache.put(element); 43. } 44. } 45. /** 46. * 删除 47. */ 48. public void remove(String key){ 49. Assert.hasText(key); 50. Assert.notNull(localCache); 51. if (this.cacheCluster) { 52. mc.delete(key); 53. }else{ 54. localCache.remove(key); 55. } 56. } 57. /** 58. * 得到 59. */ 60. public Object get(String key) { 61. Assert.hasText(key); 62. Assert.notNull(localCache); 63. Object rt = null; 64. if (this.cacheCluster) { 65. rt = mc.get(key); 66. } else { 67. Element element = null; 68. try { 69. element = localCache.get(key); 70. } catch (CacheException cacheException) { 71. throw new DataRetrievalFailureException("Cache failure: " 72. + cacheException.getMessage()); 73. } 74. if(element != null) 75. rt = element.getValue(); 76. } 77. return rt; 78. } 79. /** 80. * 判断是否存在 81. * 82. */ 83. public boolean exist(String key){ 84. Assert.hasText(key); 85. Assert.notNull(localCache); 86. if (this.cacheCluster) { 87. return mc.keyExists(key); 88. }else{ 89. return this.localCache.isKeyInCache(key); 90. } 91. } 92. private void init() { 93. if (this.cacheCluster) { 94. String[] serverlist = cacheServerList.split(","); 95. Integer[] weights = this.split(cacheServerWeights); 96. // initialize the pool for memcache servers 97. SockIOPool pool = SockIOPool.getInstance(); 98. pool.setServers(serverlist); 99. pool.setWeights(weights); 100. pool.setInitConn(initialConnections); 101. pool.setMinConn(minSpareConnections); 102. pool.setMaxConn(maxSpareConnections); 103. pool.setMaxIdle(maxIdleTime); 104. pool.setMaxBusyTime(maxBusyTime); 105. pool.setMaintSleep(maintThreadSleep); 106. pool.setSocketTO(socketTimeOut); 107. pool.setSocketConnectTO(socketConnectTO); 108. pool.setNagle(nagleAlg); 109. pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH); 110. pool.initialize(); 111. logger.info("初始化 memcached pool!"); 112. } 113. } 114. 115. private void destory() { 116. if (this.cacheCluster) { 117. SockIOPool.getInstance().shutDown(); 118. } 119. } 120. } 然后实现函数的 AOP 拦截类,用来在函数执行前返回缓存内容 Java 代码 1. public class CachingInterceptor implements MethodInterceptor { 2. 3. private CacheService cacheService; 4. private String cacheKey; 5. 6. public void setCacheKey(String cacheKey) { 7. this.cacheKey = cacheKey; 8. } 9. 10. public void setCacheService(CacheService cacheService) { 11. this.cacheService = cacheService; 12. } 13. 14. public Object invoke(MethodInvocation invocation) throws Throwable { 15. Object result = cacheService.get(cacheKey); 16. //如果函数返回结果不在 Cache 中,执行函数并将结果放入 Cache 17. if (result == null) { 18. result = invocation.proceed(); 19. cacheService.put(cacheKey,result); 20. } 21. return result; 22. } 23. } 24. public class CachingInterceptor implements MethodInterceptor { 25. 26. private CacheService cacheService; 27. private String cacheKey; 28. 29. public void setCacheKey(String cacheKey) { 30. this.cacheKey = cacheKey; 31. } 32. 33. public void setCacheService(CacheService cacheService) { 34. this.cacheService = cacheService; 35. } 36. 37. public Object invoke(MethodInvocation invocation) throws Throwable { 38. Object result = cacheService.get(cacheKey); 39. //如果函数返回结果不在 Cache 中,执行函数并将结果放入 Cache 40. if (result == null) { 41. result = invocation.proceed(); 42. cacheService.put(cacheKey,result); 43. } 44. return result; 45. } 46. } Spring 的 AOP 配置如下: Java 代码 1. 2. 5. aop:config> 6. 7. 9. 10. 11. bean> 【编辑推荐】 1. .NET分布式缓存之Memcached执行速度检测 2. 从memcached看MySQL和关系数据库的未来 3. 分布式缓存系统memcached简介与实践 4. Google App Engine的Java持久性与数据存储 5. Java正则表达式实现条件查询浅析
还剩6页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

wuxp

贡献于2014-05-21

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf