当前位置: 首页 > news >正文

XMemcached实例及与spring的集成

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.Memcached Client简要介绍
Memcached Client目前有3种: 

1.Memcached Client for Java  2.SpyMemcached   3.XMemcached

这三种Client一直存在各种争议:

Memcached Client for Java 比 SpyMemcached更稳定、更早、更广泛;SpyMemcached 比 Memcached Client for Java更高效;XMemcached 比 SpyMemcache并发效果更好。

具体可以参考官方性能对比: 

Memcached Client for Java: https://github.com/gwhalin/Memcached-Java-Client/wiki/PERFORMANCE 
XMemcached: http://xmemcached.googlecode.com/svn/trunk/benchmark/benchmark.html 

2.XMemcached特性 

高性能;支持完整的memcached文本协议,二进制协议;支持JMX,可以通过MBean调整性能参数、动态添加/移除server、查看统计等;支持客户端统计;支持memcached节点的动态增减;支持memcached分布:余数分布和一致性哈希分布;更多的性能调整选项。

3.XMemcached简单实现

MemcachedClientBuilder是MemcachedClient核心接口,用来控制Client的构建(build()方法)和关闭(shutdown()方法)。 通过build()方法获得 MemcachedClient 

然后就可以通过Memcached进行set、get、replace、delete等Memcached操作了! 

import static junit.framework.Assert.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.command.BinaryCommandFactory;
import net.rubyeye.xmemcached.exception.MemcachedException;
import net.rubyeye.xmemcached.utils.AddrUtil;

import org.junit.Test;

public class MemcachedClientTest {
	@Test
	public void test() {
		MemcachedClientBuilder builder = new XMemcachedClientBuilder(
		    AddrUtil.getAddresses("192.168.1.110:11211 192.168.1.111:11211"),new int[] { 1, 1});
		// 设置连接池大小,即客户端个数
		builder.setConnectionPoolSize(50);
		// 宕机报警
		builder.setFailureMode(true);
		// 使用二进制文件
		builder.setCommandFactory(new BinaryCommandFactory());
		// 使用一致性哈希算法(Consistent Hash Strategy)
		builder.setSessionLocator(new KetamaMemcachedSessionLocator());
		// 使用序列化传输编码
		builder.setTranscoder(new SerializingTranscoder());
		// 进行数据压缩,大于1KB时进行压缩
		builder.getTranscoder().setCompressionThreshold(1024);
		MemcachedClient memcachedClient = null;
		try {
			memcachedClient = builder.build();
			try {
				// 设置/获取
				memcachedClient.set("aa", 36000, "set/get");
				assertEquals("set/get", memcachedClient.get("aa"));
				// 替换
				memcachedClient.replace("aa", 36000, "replace");
				assertEquals("replace", memcachedClient.get("aa"));
				// 移除
				memcachedClient.delete("aa");
				assertNull(memcachedClient.get("aa"));
			} catch (TimeoutException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (MemcachedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (memcachedClient != null) {
				try {
					memcachedClient.shutdown();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}


4.XMemcached与Spring集成
XMemcached与Spring集成可以参考http://code.google.com/p/xmemcached/wiki/Spring_Integration,这里只说最常用的方法。 
memcached.properties做基本配置: 

#连接池大小即客户端个数
memcached.connectionPoolSize=50
memcached.failureMode=true
#server1
memcached.server1.host=192.168.1.110
memcached.server1.port=11211
memcached.server1.weight=1
#server2
memcached.server2.host=192.168.1.111
memcached.server2.port=11211
memcached.server2.weight=2

XML配置文件: 

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- http://code.google.com/p/xmemcached/wiki/Spring_Integration -->
	<context:property-placeholder location="memcached.properties" />
	<bean
		id="memcachedClientBuilder"
		class="net.rubyeye.xmemcached.XMemcachedClientBuilder"
		p:connectionPoolSize="${memcached.connectionPoolSize}"
		p:failureMode="${memcached.failureMode}">
		<!-- XMemcachedClientBuilder have two arguments.First is server list,and 
			second is weights array. -->
		<constructor-arg>
			<list>
				<bean class="java.net.InetSocketAddress">
					<constructor-arg>
						<value>${memcached.server1.host}</value>
					</constructor-arg>
					<constructor-arg>
						<value>${memcached.server1.port}</value>
					</constructor-arg>
				</bean>
				<bean class="java.net.InetSocketAddress">
					<constructor-arg>
						<value>${memcached.server2.host}</value>
					</constructor-arg>
					<constructor-arg>
						<value>${memcached.server2.port}</value>
					</constructor-arg>
				</bean>
			</list>
		</constructor-arg>
		<constructor-arg>
			<list>
				<value>${memcached.server1.weight}</value>
				<value>${memcached.server2.weight}</value>
			</list>
		</constructor-arg>
		<property name="commandFactory">
			<bean class="net.rubyeye.xmemcached.command.TextCommandFactory" />
		</property>
		<property name="sessionLocator">
			<bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator" />
		</property>
		<property name="transcoder">
			<bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
		</property>
	</bean>
	<!-- Use factory bean to build memcached client -->
	<bean
		id="memcachedClient"
		factory-bean="memcachedClientBuilder"
		factory-method="build"
		destroy-method="shutdown" />
</beans>

这里的 memcachedClientBuilder节点完成 MemcachedClientBuilder,然后通过 memcachedClient节点配置 factory-method,调用 MemcachedClientBuilder的build()方法产生 MemcachedClient,并配置 destroy-method进行关闭。 
有了Spring容器支持,我们不需要在代码中进行配置,也不需要重复调用build()跟shutdown()方法,这些操作交给Spring来完成。 

import static junit.framework.Assert.*;

import java.util.concurrent.TimeoutException;

import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.exception.MemcachedException;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MemcachedSpringTest {
	private ApplicationContext app;
	private MemcachedClient memcachedClient;
	@Before
	public void init() {
		app = new ClassPathXmlApplicationContext("applicationContext.xml");
		memcachedClient = (MemcachedClient) app.getBean("memcachedClient");
	}
	@Test
	public void test() {
		try {
			// 设置/获取
			memcachedClient.set("aa", 36000, "set/get");
			assertEquals("set/get", memcachedClient.get("aa"));

			// 替换
			memcachedClient.replace("aa", 36000, "replace");
			assertEquals("replace", memcachedClient.get("aa"));

			// 移除
			memcachedClient.delete("aa");
			assertNull(memcachedClient.get("aa"));
		} catch (TimeoutException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MemcachedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

5.总结

  • Memcached的Key,要杜绝使用空格,且长度控制在250个字符。

  • Memcached的Value,要控制体积,必须小于1MB,必要时进行使用压缩。

  • 失效时间,0为永久有效,最大值不得超过30天(2592000s),否则重新计算可能缓存只有1秒

  • Memcached仅支持LRU算法,完全适用你的需要。

  • 尽量不要将List这种重体积对象扔到Memcached中,传输、存储都会产生瓶颈。

  • 使用一致性哈希算法实现,提高多个Memcacehd Server利用率。


转载于:https://my.oschina.net/u/933928/blog/500296

相关文章:

  • JAVA8
  • classpath对获取配置文件的影响
  • Delphi XE里面 SharedActivityContext 提示错误
  • Android 带你从源码的角度解析Scroller的滚动实现原理
  • ODI调用WebService----OdiInvokeWebService
  • OK335xS GPMC nand device register hacking
  • WebService的缓存机制
  • Linux压缩打包方法连载之三:bzip2, bzcat 命令
  • 用MonoDevelop开发Linux游戏
  • Android 服务类Service 的详细学习
  • Android获取返回键的点击事件
  • 赢得Docker挑战最佳实践
  • 小蚂蚁学memcache笔记—php操作memcache(2)
  • ipv6现状,加英文的中括号访问, ipv6测试http://test-ipv6.com
  • git学习------git commit命令的默认编辑器的修改
  • Google 是如何开发 Web 框架的
  • axios 和 cookie 的那些事
  • Javascript弹出层-初探
  • java中的hashCode
  • spring-boot List转Page
  • sublime配置文件
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Vue.js源码(2):初探List Rendering
  • 构造函数(constructor)与原型链(prototype)关系
  • 看域名解析域名安全对SEO的影响
  • 前端性能优化--懒加载和预加载
  • 区块链技术特点之去中心化特性
  • 手机端车牌号码键盘的vue组件
  • 我从编程教室毕业
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 终端用户监控:真实用户监控还是模拟监控?
  • const的用法,特别是用在函数前面与后面的区别
  • 如何在招聘中考核.NET架构师
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​ubuntu下安装kvm虚拟机
  • #{} 和 ${}区别
  • #预处理和函数的对比以及条件编译
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (简单) HDU 2612 Find a way,BFS。
  • (六)软件测试分工
  • (三)Honghu Cloud云架构一定时调度平台
  • (四)c52学习之旅-流水LED灯
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)项目管理杂谈-我所期望的新人
  • .htaccess配置常用技巧
  • .Net Core 中间件验签
  • .net refrector
  • .Net 代码性能 - (1)
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET连接数据库方式
  • .net流程开发平台的一些难点(1)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET中统一的存储过程调用方法(收藏)