目录
什么是Memcached?
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
1.Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
2.Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
java如何链接memcached客户端?
1.java memcached client
1.1导入memcached的jar相关的jar包
- 由于目前java memcached client没有官方的maven repository可供使用,因此使用时需要手动将其安装到本地repository。将下载好的memcached进行解压,然后编写一个pom文件,引用memcached所需要的其他的jar包,然后将memcached的jar安装到自己maven仓库。安装语句:mvn install:install-file -Dfile=F:\memcached\java_memcached-release_2.6.6.jar -DpomFile=F:\memcached\pom.xml
pom文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hello</groupId>
<artifactId>memcached</artifactId>
<version>2.6.6</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.danga</groupId>
<artifactId>java-memcached</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.5.6</version>
</dependency>
</dependencies>
</project>
1.2编写连接memcached客户端程序
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class Test {
public static void main(String[] args) {
MemCachedClient cachedClient = new MemCachedClient();
// 设置连接池
SockIOPool sockIOPool = SockIOPool.getInstance();
// 服务器地址
String servers[] = new String[] { "127.0.0.1:11211" };
sockIOPool.setServers(servers);
// 最大连接数
sockIOPool.setMaxConn(50);
// 最小连接数
sockIOPool.setMinConn(10);
// 初始化连接数
sockIOPool.setInitConn(20);
// 自查线程周期进行工作,其每次休眠时间
sockIOPool.setMaintSleep(3000);
// Socket阻塞建立连接的等待时间
sockIOPool.setSocketConnectTO(3000);
// Socket阻塞读取数据的超时时间
sockIOPool.setSocketTO(3000);
// 如果是true在写数据时不缓冲,立即发送出去
sockIOPool.setNagle(false);
sockIOPool.initialize();
if (cachedClient != null) {// 为null,则表示连接不上
boolean flag = cachedClient.set("hello", "world");
System.out.println(flag);// 为true则插入成功
//查找key为hello的值
System.out.println(cachedClient.get("hello"));
}
}
}
1.3MemCachedClient的api
// 插入(如果key存在,则替换,不存在,则新增)
cachedClient.set("hello", "world", new Date(3000));
// 新增(key存在则返回false)
cachedClient.set("nihao", 100);
//替换
cachedClient.replace("nihao", 1000);
// 查询
Object object = cachedClient.get("hello");
//查一组数据
Map<String, Object> objects = cachedClient.getMulti(new String[] {"nihao","hello"});
// 初始化一个计数器
cachedClient.storeCounter("count", 10L);
// 计数器增量操作
cachedClient.addOrDecr("count");
// 计数器减量操作
cachedClient.addOrIncr("count");
2.Xmemcached
2.1导入xmemcached和slf4j的jar包
2.2编写链接程序
api与java memcached client的差不多
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.exception.MemcachedException;
import net.rubyeye.xmemcached.utils.AddrUtil;
public class Test2 {
public static void main(String[] args)
throws IOException, TimeoutException, InterruptedException, MemcachedException {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:11211"));
MemcachedClient client = builder.build();
Object object = client.get("hello");
System.out.println(object);
}
}
3.SpyMemcached
3.1导入xmemcached和slf4j的jar包
3.2编写链接程序
import java.io.IOException;
import java.net.InetSocketAddress;
import net.spy.memcached.MemcachedClient;
public class Test3 {
public static void main(String[] args) throws IOException {
MemcachedClient memcacheCient = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
}
}
总结:
memcached的特点:
- 全内存运转
- 哈希方式存储
- 简单文本协议进行数据通信
- 只操作字符型数据
- 其它类型数据由应用解释,序列化以及反序列化
- 集群也由应用进行控制,采用一致性散列(哈希)算法
Memcached的缺点
- 纯内存操作,关机后数据全部丢失
- 保存字节数据,数据类型贫乏
- LRU算法导致数据不可控的丢失
- 一致性处理简单
- 应用端太厚,服务器端太薄
- 应用场景有限,难以被看成是完整的数据库产品
API的实现总结
Java Memcache Client for Java应用最广泛,也是当前最稳定的客户端, 在线上系统大量的使用此客户端。特点: 较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定,使用阻塞IO,不支持CAS操作。
SpyMemecache基于Java NIO的客户端,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常,支持CAS操作。
XMemcached同样是基于Java NIO的客户端,Java NIO相比于传统阻塞IO模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。