博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XMemcached实例及与spring的集成
阅读量:6112 次
发布时间:2019-06-21

本文共 5454 字,大约阅读时间需要 18 分钟。

hot3.png

1.Memcached Client简要介绍

Memcached Client目前有3种: 

1.  2.   3.

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

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

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

Memcached Client for Java:  

XMemcached:  
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集成可以参考,这里只说最常用的方法。 
memcached.properties做基本配置: 

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

XML配置文件: 

${memcached.server1.host}
${memcached.server1.port}
${memcached.server2.host}
${memcached.server2.port}
${memcached.server1.weight}
${memcached.server2.weight}

这里的 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

你可能感兴趣的文章
Docker - 创建支持SSH服务的容器镜像
查看>>
[TC13761]Mutalisk
查看>>
三级菜单
查看>>
Data Wrangling文摘:Non-tidy-data
查看>>
加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
查看>>
while()
查看>>
常用限制input的方法
查看>>
Ext Js简单事件处理和对象作用域
查看>>
IIS7下使用urlrewriter.dll配置
查看>>
12.通过微信小程序端访问企查查(采集工商信息)
查看>>
WinXp 开机登录密码
查看>>
POJ 1001 Exponentiation
查看>>
HDU 4377 Sub Sequence[串构造]
查看>>
云时代架构阅读笔记之四
查看>>
WEB请求处理一:浏览器请求发起处理
查看>>
Lua学习笔记(8): 元表
查看>>
PHP经典算法题
查看>>
LeetCode 404 Sum of Left Leaves
查看>>
醋泡大蒜有什么功效
查看>>
hdu 5115(2014北京—dp)
查看>>