主要了解Memcached 与其其中一个java客户端XMemcached。
一、基础了解
Memcahed 是一套分布式高速缓存系统。简言之,它是用于缓存数据的服务。在并发访问web服务器时,为减少直接访问数据库的次数,降低数据库服务器的负载,首次从数据库查询某数据后,我们将其放入缓存系统中,在一定时间内对该相同数据的再次访问,便可直接从缓存系统中拿取,而无需操作数据库。
缓存系统由两部分组成:
1、服务端,即Memcached,使用c语言编写;
2、客户端,即我们编程时所使用的一套用于缓存数据的一套API。Memcached 的java客户端有3种版本:
(1)、memcached client for Java:https://github.com/gwhalin/Memcached-Java-Client/downloads
(2)、spymemcached;
(3)、xmemcached。
360百科:https://baike.so.com/doc/5380534-5616808.html
二、Memcached下载
Memcached服务端下载地址:https://github.com/memcached/memcached/releases
说明:此链接下载的为源代码,可编译为.exe文件后再安装为服务,或从其它站点下载可执行文件。
附一个不错的链接:
XMemcached 中文用户指南:https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97#spring-30%E5%92%8Cbuilder%E9%85%8D%E7%BD%AE
三、配置
1、安装Memcache 服务端。
下载memcached.exe后,cmd进入其所在目录,将其安装为系统服务:memcached.exe -d install
2、项目中使用XMemcached 进行数据缓存。
方式一:与Spring 整合使用
(1)、导入xmemcached-2.*.jar与其依赖包slf4j-*.jar;
(2)、spring容器中配置上下文对象:
(一)通过XMemcachedClientFactoryBean类配置:
(简单配置)
<bean name="memcachedClient"
class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown">
<property name="servers">
<value>host1:port host2:port2</value>
</property>
</bean>
(详细配置)
<bean name="server1" class="java.net.InetSocketAddress">
<constructor-arg>
<value>host1</value>
</constructor-arg>
<constructor-arg>
<value>port1</value>
</constructor-arg>
</bean>
<bean name="memcachedClient"
class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown">
<property name="servers">
<value>host1:port,host2:port host3:port,host4:port</value>
</property>
<!-- server's -->
<property name="weights">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<!-- AuthInfo map,only valid on 1.2.5 or later version -->
<property name="authInfoMap">
<map>
<entry key-ref="server1">
<bean class="net.rubyeye.xmemcached.auth.AuthInfo" factory-method="typical">
<constructor-arg index="0">
<value>cacheuser</value>
</constructor-arg>
<constructor-arg index="1">
<value>123456</value>
</constructor-arg>
</bean>
</entry>
</map>
</property>
<!-- nio connection pool size -->
<property name="connectionPoolSize" value="2"></property>
<!-- Use binary protocol,default is TextCommandFactory -->
<property name="commandFactory">
<bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory"></bean>
</property>
<!-- Distributed strategy -->
<property name="sessionLocator">
<bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
</property>
<!-- Serializing transcoder -->
<property name="transcoder">
<bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
</property>
<!-- ByteBuffer allocator -->
<property name="bufferAllocator">
<bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator"></bean>
</property>
<!-- Failure mode -->
<property name="failureMode" value="false"/>
</bean>
属性说明:
servers:memcached服务器节点列表;
weights:与servers对应的节点的权重,权重大小控制缓存对象的多少;
authInfoMap 授权验证信息,仅在xmemcached 1.2.5及以上版本有效;
connectionPoolSize :nio连接池大小,默认为1
commandFactory:协议工厂,net.rubyeye.xmemcached.command.BinaryCommandFactory,TextCommandFactory(默认),KestrelCommandFactory;
sessionLocator:分布策略,一致性哈希net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator或者ArraySessionLocator(默认)
transcoder:序列化转换器,默认使用net.rubyeye.xmemcached.transcoders.SerializingTranscoder,更多选项参见javadoc;
bufferAllocator :IoBuffer分配器,默认为net.rubyeye.xmemcached.buffer.SimpleBufferAllocator,可选CachedBufferAllocator(不推荐);
failureMode:是否启用failure模式,true为启用,默认不启用。
(二)在Spring3.0中通过Builder配置
Spring 3.0修改了查找destroy method的方式,所以上述配置将出错,可采用下面配置。
<bean name="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
<!-- XMemcachedClientBuilder have two arguments.First is server list,and second is weights array. -->
<constructor-arg>
<list>
<bean class="java.net.InetSocketAddress">
<constructor-arg>
<value>localhost</value>
</constructor-arg>
<constructor-arg>
<value>12000</value>
</constructor-arg>
</bean>
<bean class="java.net.InetSocketAddress">
<constructor-arg>
<value>localhost</value>
</constructor-arg>
<constructor-arg>
<value>12001</value>
</constructor-arg>
</bean>
</list>
</constructor-arg>
<constructor-arg>
<list>
<value>1</value>
<value>2</value>
</list>
</constructor-arg>
<property name="authInfoMap">
<map>
<entry key-ref="server1">
<bean class="net.rubyeye.xmemcached.auth.AuthInfo"
factory-method="typical">
<constructor-arg index="0">
<value>cacheuser</value>
</constructor-arg>
<constructor-arg index="1">
<value>123456</value>
</constructor-arg>
</bean>
</entry>
</map>
</property>
<property name="connectionPoolSize" value="2"></property>
<property name="commandFactory">
<bean class="net.rubyeye.xmemcached.command.TextCommandFactory"></bean>
</property>
<property name="sessionLocator">
<bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
</property>
<property name="transcoder">
<bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
</property>
</bean>
<!-- Use factory bean to build memcached client -->
<bean name="memcachedClient3" factory-bean="memcachedClientBuilder"
factory-method="build" destroy-method="shutdown"/>
authInfoMap保存的是以memcached服务器地址为键的键值对,暂时对其作用不太了解,此属性可不用配置。
最终,可通过自动装配使用XMemcached进行数据缓存:
@Autowired
private MemcachedClient memcachedClient3;
……
//存数据
String data = ……//首次查数据库
String key = "key";
if(memcachedClient3.get(key)==null){
memcachedClient3.add(key,10000,data);//参数列表为键、缓存时间、缓存数据
}
//查数据
String data = memcachedClient3.get("key");
if(data!=null){
return data;
}else{
//查数据库
}
……
方式二:项目中直接使用
假设memcached 服务安装在本地(其默认端口为11211),则示例代码:
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11211"));
MemcachedClient memcachedClient = builder.build();
try {
memcachedClient.set("hello", 0, "Hello,xmemcached");
String value = memcachedClient.get("hello");
System.out.println("hello=" + value);
memcachedClient.delete("hello");
value = memcachedClient.get("hello");
System.out.println("hello=" + value);
} catch (MemcachedException e) {
System.err.println("MemcachedClient operation fail");
e.printStackTrace();
} catch (TimeoutException e) {
System.err.println("MemcachedClient operation timeout");
e.printStackTrace();
} catch (InterruptedException e) {
// ignore
}
try {
//close memcached client
memcachedClient.shutdown();
} catch (IOException e) {
System.err.println("Shutdown MemcachedClient fail");
e.printStackTrace();
}
XMemcached详细了解:
https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97